汇编中push 0x*** retn表示跳转到某个地址继续执行
取消hook时会在多线程环境中可能被检测
去掉函数框架可以规避寄存器cpu前后状态监测
#pragma comment(linker,"/SECTION:.text,ERW") //编译器允许代码可写 #include <iostream> #include <Windows.h> //游戏功能函数 void func1() { MessageBoxA(0, "正常消息", "提示", MB_OK); } void hookedproc() { MessageBoxA(0, "hook消息", "提示", MB_OK); } void hookedproc1() { BYTE* lpfunc1 = (BYTE*)func1; lpfunc1[0] = 0x68; *(ULONG_PTR*)&lpfunc1[1] = (ULONG_PTR)hookedproc; lpfunc1[5] = 0xc3; } //void unhook用到了memcpy。入口函数恢复成原来状态即可。 void __declspec(naked) hookentry() //使hook前后cpu和寄存器的状态不变,规避检测。但是仍然不足,因为汇编代码已改变,即使unhook,也可能因为多线程调用函数而被检测 { __asm { Pushfd Pushad call hookedproc1 popad popfd jmp func1 } } //默认为游戏入口函数 int main() { hookentry(); return 0; }