• 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
  • 相关阅读:
    2407: C语言习题 整数转换成字符串
    2484: 字母图形
    1658: Easier Done Than Said?
    Easier Done Than Said?(应用到的知识)
    1653: Champion of the Swordsmanship
    1614: 五位以内的对称素数
    1612: 最小公倍数
    $ vs $()
    数学
    计算机科学与技术课程
  • 原文地址:https://www.cnblogs.com/MiraculousB/p/12741198.html
Copyright © 2020-2023  润新知