[原创]hook的原理分析与easy-ag真人国际厅网站

#include

#include

typedef int (winapi* lpmessageboxa)(hwnd, lpcstr, lpcstr, uint);

byte olddata32[5] = { 0 };

void hook();

void unhook();

//回调函数 当调用hook时,hook执行完成后调用该函数后再进入main函数

    unhook();

    lpmessageboxa messagebox = (lpmessageboxa)getprocaddress(getmodulehandlea("user32.dll"), "messageboxa");

    int ret = messagebox(0, "inlinehook", "tip3", 0);

    hook();//函数释放前再次hook,为了拦截下次调用

    return ret;

void hook()

    //获取messagebox的基地址

    dword messagebox = (dword)getprocaddress(getmodulehandlea("user32.dll"), "messageboxa");

    byte data[5] = { 0xe9, };

    dword offset = (dword)mymessageboxa - messagebox - 5; //计算jmp跳转的偏移量

    //保存前五个字节的数据

    memcpy(olddata32, (const void *)messagebox, 5);

    //把偏移量与jmp指令拼接

    memcpy(&data[1], &offset, 4);

    dword oldprotect = 0;

    //更改页面属性 将内存改为可读可写可执行

    virtualprotect((lpvoid)messagebox, 5, page_execute_readwrite, &oldprotect);

    memcpy((void*)messagebox, data, 5);

    //还原属性

    virtualprotect((lpvoid)messagebox, 5, oldprotect, &oldprotect);

void unhook()

 

    dword messagebox = (dword)getprocaddress(getmodulehandlea("user32.dll"), "messageboxa");

    dword oldprotect = 0;

    virtualprotect((lpvoid)messagebox, 5, page_execute_readwrite, &oldprotect);

    virtualprotect((lpvoid)messagebox, 5, oldprotect, &oldprotect);

 

void main()

    messageboxa(0, "hello", "tip1", 0);

    hook();

    messageboxa(0, "hello", "tip2", 0);

原文链接:https://bbs.kanxue.com/thread-277375.htm

网络摘文,本文作者:15h,如若转载,请注明出处:https://www.15cov.cn/2023/08/27/原创hook的原理分析与easy_hook逆向题分析/

发表评论

邮箱地址不会被公开。 必填项已用*标注

网站地图