本帖最后由 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
|