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