Hook技术2内存中修改模块开头代码为跳转语句.docx

上传人:b****7 文档编号:9451808 上传时间:2023-02-04 格式:DOCX 页数:7 大小:15.07KB
下载 相关 举报
Hook技术2内存中修改模块开头代码为跳转语句.docx_第1页
第1页 / 共7页
Hook技术2内存中修改模块开头代码为跳转语句.docx_第2页
第2页 / 共7页
Hook技术2内存中修改模块开头代码为跳转语句.docx_第3页
第3页 / 共7页
Hook技术2内存中修改模块开头代码为跳转语句.docx_第4页
第4页 / 共7页
Hook技术2内存中修改模块开头代码为跳转语句.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

Hook技术2内存中修改模块开头代码为跳转语句.docx

《Hook技术2内存中修改模块开头代码为跳转语句.docx》由会员分享,可在线阅读,更多相关《Hook技术2内存中修改模块开头代码为跳转语句.docx(7页珍藏版)》请在冰豆网上搜索。

Hook技术2内存中修改模块开头代码为跳转语句.docx

Hook技术2内存中修改模块开头代码为跳转语句

Hook技术2内存中修改模块开头代码为跳转语句

这种霸道的技术,一般不推荐使用,除非无奈之下,不妨可以试试。

原理也很简单,要导入一个Dll,把它在内存中的代码,前几代改为

JUMP我的函数地址

然后,在我的里,再把他的几行代码改回去,把我自己的事做完之后,再调用它,也可以不调用。

最后它返回后,又将它的前几行代码改为JUMP。

原理非常简单:

下面给出一个封装好的类:

//////////////////////////////////////////////////////////

//ULHook.h

#ifndef__ULHOOK_H__

#define__ULHOOK_H__

#include

classCULHook

{

public:

CULHook(LPSTRpszModName,LPSTRpszFuncName,PROCpfnHook);

~CULHook();

//取消挂钩

voidUnhook();

//重新挂钩

voidRehook();

protected:

PROCm_pfnOrig;//目标API函数的地址

BYTEm_btNewBytes[8];//新构建的个字节

BYTEm_btOldBytes[8];//原来个字节

HMODULEm_hModule;

};

#endif//__ULHOOK_H__

///////////////////////////////////////////

//ULHook.cpp文件

#include"ULHook.h"

CULHook:

:

CULHook(LPSTRpszModName,LPSTRpszFuncName,PROCpfnHook)

{

//jmpeax==0xFF,0xE0

//生成新的执行代码

BYTEbtNewBytes[8]={0xB8,0x00,0x00,0x40,0x00,0xFF,0xE0,0x00};

memcpy(m_btNewBytes,btNewBytes,8);

*(DWORD*)(m_btNewBytes+1)=(DWORD)pfnHook;

//加载指定模块,取得API函数地址

m_hModule=:

:

LoadLibrary(pszModName);

if(m_hModule==NULL)

{

m_pfnOrig=NULL;

return;

}

m_pfnOrig=:

:

GetProcAddress(m_hModule,pszFuncName);

//修改原API函数执行代码的前个字节,使它跳向我们的函数

if(m_pfnOrig!

=NULL)

{

DWORDdwOldProtect;

MEMORY_BASIC_INFORMATIONmbi;

:

:

VirtualQuery(m_pfnOrig,&mbi,sizeof(mbi));

:

:

VirtualProtect(m_pfnOrig,8,PAGE_READWRITE,&dwOldProtect);

//保存原来的执行代码

memcpy(m_btOldBytes,m_pfnOrig,8);

//写入新的执行代码

:

:

WriteProcessMemory(:

:

GetCurrentProcess(),(void*)m_pfnOrig,

m_btNewBytes,sizeof(DWORD)*2,NULL);

:

:

VirtualProtect(m_pfnOrig,8,mbi.Protect,0);

}

}

CULHook:

:

~CULHook()

{

Unhook();

if(m_hModule!

=NULL)

:

:

FreeLibrary(m_hModule);

}

voidCULHook:

:

Unhook()

{

if(m_pfnOrig!

=NULL)

{

DWORDdwOldProtect;

MEMORY_BASIC_INFORMATIONmbi;

:

:

VirtualQuery(m_pfnOrig,&mbi,sizeof(mbi));

:

:

VirtualProtect(m_pfnOrig,8,PAGE_READWRITE,&dwOldProtect);

//写入原来的执行代码

:

:

WriteProcessMemory(:

:

GetCurrentProcess(),(void*)m_pfnOrig,

m_btOldBytes,sizeof(DWORD)*2,NULL);

:

:

VirtualProtect(m_pfnOrig,8,mbi.Protect,0);

}

}

voidCULHook:

:

Rehook()

{

//修改原API函数执行代码的前个字节,使它跳向我们的函数

if(m_pfnOrig!

=NULL)

{

DWORDdwOldProtect;

MEMORY_BASIC_INFORMATIONmbi;

:

:

VirtualQuery(m_pfnOrig,&mbi,sizeof(mbi));

:

:

VirtualProtect(m_pfnOrig,8,PAGE_READWRITE,&dwOldProtect);

//写入新的执行代码

:

:

WriteProcessMemory(:

:

GetCurrentProcess(),(void*)m_pfnOrig,

m_btNewBytes,sizeof(DWORD)*2,NULL);

:

:

VirtualProtect(m_pfnOrig,8,mbi.Protect,0);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电力水利

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1