| 本帖最后由 small-q 于 2017-10-19 11:05 编辑 
 这个是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 0x8
// 保存原始指令
BYTE Ori_Code[HOOK_LEN] = {0x00}; 
// Hook代码
/*   方式一
pushad
MOV EAX, 0x90909090
JMP EAX
*/
BYTE HookCode[HOOK_LEN] = 
{
        0x60, 0xB8, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0
};
INT32 MyHOOK32()
{
        ///自由代码区////////////////////////////////////////////////////////////////////
        MessageBoxW(NULL,L"Addr 自定义HOOK 测试",L"PYG提示:",NULL);
        /////////////////////////////////////////////////////////////////////////////////////
        UnHookAPIQ();
        __asm pop edi \
        __asm pop esi \
        __asm pop ebx \
        __asm pop ebp \
        __asm popad \
        __asm jmp addr1
        //EDI为0达到破解效果
}
VOID HookAPIQ()
{
        DWORD OldProtect;
        ::VirtualProtect((LPVOID)addr1, HOOK_LEN, PAGE_EXECUTE_READWRITE, &OldProtect);
        // 得到原始指令
        memcpy(Ori_Code, (LPVOID)addr1, HOOK_LEN);  
        // 填充跳转地址
        *(PINT32)(HookCode+2) = (INT32)&MyHOOK32;
        memcpy((LPVOID)addr1, &HookCode, sizeof(HookCode));
}
VOID UnHookAPIQ()
{
        memcpy((LPVOID)addr1, &Ori_Code, sizeof(HookCode));        
}
 说明:addr1可以硬编码,我的是用KMP
 
 |