hook笔记①

汇编中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;
}
View Code
原文地址:https://www.cnblogs.com/MiraculousB/p/12741198.html