C语言!!求哪位大神解释下这两个改内存的函数啊!!
发布网友
发布时间:2022-10-12 23:23
我来回答
共1个回答
热心网友
时间:2023-10-12 09:11
好吧,我来接分的。顺便教你怎么恢复。
#include <stdio.h>
#include <windows.h>
unsigned char enter[5];
unsigned char jmp[5];
int Func()
{
return 4;
}
int MyFunc()
{
return 5;
}
bool hook()
{
DWORD dwOld=0;
if(!VirtualProtect(Func,5,PAGE_EXECUTE_READWRITE,&dwOld))
{
return false;
}
memcpy(Func,jmp,5);//写入构造的地址
//刷新指令cache中相关地址指令的内容
HANDLE hProcess = GetCurrentProcess();
FlushInstructionCache(hProcess,(LPVOID)Func,5);
return true;
}
bool unhook()
{
DWORD dwOld=0;
if(!VirtualProtect(Func,5,PAGE_EXECUTE_READWRITE,&dwOld))
{
return false;
}
memcpy(Func,enter,5);//写入原来的地址
HANDLE hProcess = GetCurrentProcess();
FlushInstructionCache(hProcess,(LPVOID)Func,5);
return true;
}
void main()
{
memcpy(enter,(LPVOID)Func,5);//保存原地址
jmp[0]=0xe9;//动态构造一个长跳转指令
*(int*)&jmp[1]=(int)&MyFunc-((int)Func+5);
hook();
int a = Func();
printf("%d\n",a);
unhook();
int b = Func();
printf("%d\n",b);
}