自由地址 HOOK 二则 for X86

专注学习Mac并记录过程

自由地址 HOOK 二则 for X86

这个是MS的,老东西了                                                                                                 

PY_DWORD addr2;
double MyFunc()
{
        __asm pop edi \
        __asm pop esi \
        __asm pop ebx \
        __asm pop ebp \
        __asm pushad 
        //函数头恢复达堆栈平衡
/////////////////////////////////////////////////////////////////////////////////////
        //自由代码区
        MessageBoxW(NULL,L"Detour Addr HOOK 测试",L"PYG提示:",NULL);
 
/////////////////////////////////////////////////////////////////////////////////////
        UnHookAPI1();//恢复原地址,配合下面的代码进行返回
        __asm popad \
        __asm jmp addr1
}
 
VOID HookAPI1()
{
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)addr1, MyFunc);
        if(DetourTransactionCommit() == NO_ERROR)
        {
                //error
        }
}
 
VOID UnHookAPI1()
{
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)addr1, MyFunc);
        if(DetourTransactionCommit() == NO_ERROR)
        {
                //error
        }
}


这个是老飘那X64改的,感谢飘

// HOOK指令长度
#define HOOK_LEN 0x7
// 保存原始指令
BYTE Ori_Code[HOOK_LEN] = {0x00}; 
 
// Hook代码
 
/*   方式一
MOV EAX, 0x90909090
JMP EAX
*/
 
BYTE HookCode[HOOK_LEN] = 
{
             0xB8, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0
};
 
 
VOID MyHOOK32()
{
        ///自由代码区////////////////////////////////////////////////////////////////////
        MessageBoxW(NULL,L"Addr 自定义HOOK 测试",L"PYG提示:",NULL);
 
        /////////////////////////////////////////////////////////////////////////////////////
        UnHookAPIQ();
}
 
VOID HookAPIQ()
{
        DWORD OldProtect;
        ::VirtualProtect((LPVOID)addr1, HOOK_LEN, PAGE_EXECUTE_READWRITE, &OldProtect);
        // 得到原始指令
        memcpy(Ori_Code, (LPVOID)addr1, HOOK_LEN);  
        // 填充跳转地址
        *(PINT32)(HookCode+1) = (INT32)&MyHOOK32;
        memcpy((LPVOID)addr1, &HookCode, sizeof(HookCode));
}
 
VOID UnHookAPIQ()
{
        memcpy((LPVOID)addr1, &Ori_Code, sizeof(HookCode));        
}

说明:addr1可以硬编码,我的是用KMP

「舍得」三人行,必有我师!一分耕耘,一分收获!你所看到的都是最完美的,你看不到的我都在背后努力做到最完美。粤ICP备16050780号

Power by Z-BlogPHP  Theme by wzdaxue

请先 登录 再评论,若不是会员请先 注册