Hook技术2内存中修改模块开头代码为跳转语句Word格式文档下载.docx
《Hook技术2内存中修改模块开头代码为跳转语句Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Hook技术2内存中修改模块开头代码为跳转语句Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。
![Hook技术2内存中修改模块开头代码为跳转语句Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-2/4/413d266b-d990-417a-929e-1c8237477fc0/413d266b-d990-417a-929e-1c8237477fc01.gif)
下面给出一个封装好的类:
//////////////////////////////////////////////////////////
//ULHook.h
#ifndef__ULHOOK_H__
#define__ULHOOK_H__
#include<
windows.h>
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()
Unhook();
if(m_hModule!
FreeLibrary(m_hModule);
voidCULHook:
Unhook()
VirtualQuery(m_pfnOrig,&
mbi,sizeof(mbi));
//写入原来的执行代码
m_btOldBytes,sizeof(DWORD)*2,NULL);
Rehook()