由于不知道该插入哪一个板块,就随便插入一个了,不影响观看即可
问题:学习汇编hook过程中自己的hook影响到堆栈导致程序崩溃
请求指出问题 并知道相应的解决办法 并作出解释帮助学习
备注已表明要hook 的点
另请求讲解 涉及到多余 5字节 的那一部分字节的处理办法。
0063B39E | 8B16 | mov edx, dword ptr [esi] |
0063B3A0 | 51 | push ecx |
0063B3A1 | 8B4C24 0C | mov ecx, dword ptr [esp+C] |//假定这里是我需要hook的点 但是下方是一个push 改变堆栈了
0063B3A5 | 51 | push ecx |
0063B3A6 | 50 | push eax |
0063B3A7 | 8BCE | mov ecx, esi |
0063B3A9 | FF92 4C100000 | call dword ptr [edx+104C] |
0063B3AF | 5F | pop edi |
下面是hook的相关代码:
__declspec(naked) void 跳转提示HOOK成功()
{
_asm
{
pushad
}
printf("11111\n");
_asm
{
popad
mov ecx, dword ptr[esp + 0xC]
push ecx
retn
}
}
void HOOK测试()
{
//这里是要hook地址处的原代码:
//0063B3A1 | 8B4C24 0C | mov ecx, dword ptr[esp + C] |
//0063B3A5 | 51 | push ecx |
DWORD Hook地址 = 0x0063B3A1;
DWORD Hook子程序指针 = (DWORD)跳转call;
DWORD 跳转值 = Hook子程序指针 - Hook地址 - 5;
DWORD old = 0;//存放原来的属性
VirtualProtect((PVOID)0x0063B3A1, 32, PAGE_EXECUTE_READWRITE, &old);
//修改内存
*(BYTE*)Hook地址 = 0xE8;
*(DWORD*)(Hook地址 + 0x1) = 跳转值;
VirtualProtect((PVOID)Hook地址, 32, old, &old);//恢复页面属性
}
void UnHOOK测试()
{
DWORD Hook地址 = 0x0063B3A1;
DWORD old = 0;//存放原来的属性
VirtualProtect((PVOID)Hook地址, 32, PAGE_EXECUTE_READWRITE, &old);
*(BYTE*)Hook地址 = 0x8B;
*(DWORD*)(Hook地址 + 0x1) = 0x510C244C;
VirtualProtect((PVOID)Hook地址, 32, old, &old);//恢复页面属性
}
下方是hook后 代码的变化;
0063B39A | 8B4C24 10 | mov ecx, dword ptr [esp+10] |
0063B39E | 8B16 | mov edx, dword ptr [esi] |
0063B3A0 | 51 | push ecx |
0063B3A1 | E8 0A6DFD6E | call commondll.6F6120B0 |//自己的hook跳转函数
0063B3A6 | 50 | push eax |
0063B3A7 | 8BCE | mov ecx, esi |
0063B3A9 | FF92 4C100000 | call dword ptr [edx+104C] |
0063B3AF | 5F | pop edi |
下方是hook跳转函数内部
6F6120B0 | 60 | pushad |
6F6120B1 | 68 8453616F | push commondll.6F615384 | 6F615384:"11111\n"
6F6120B6 | E8 25000000 | call 6F6120E0 |
6F6120BB | 83C4 04 | add esp, 4 |
6F6120BE | 61 | popad |
6F6120BF | 8B4C24 0C | mov ecx, dword ptr [esp+C] |
6F6120C3 | 51 | push ecx |
6F6120C4 | C3 | ret |
我hook之后发现 一旦相关运行涉及到我的hook程序即崩溃,请协助查找 并讲解原因
并提出解决办法加以解释。
想要达成的目的:hook 目标地址 ,加入一个打印提示 :“111111”即提示hook成功。
目前的情况是可以打印出11111 但是随机程序崩溃