问题:学习汇编hook过程中自己的hook影响到堆栈导致程序崩溃
下面给出一段汇编 要求以指定形式hook指定地址;
要求以call跳转 或jmp跳转各实现一次hook并分别讲解,以下是 我的代码形式;
请给出一个通俗易懂的讲解以便于学习。
005B1139 | 8B0D D0CE3301 | mov ecx, dword ptr [133CED0] |
005B113F | 8B4424 04 | mov eax, dword ptr [esp+4] |
005B1143 | 6A 22 | push 22 |
005B1145 | 50 | push eax |
005B1146 | 8B11 | mov edx, dword ptr [ecx] |
005B1148 | 68 4E040000 | push 44E |HOOK目标地址
005B114D | FF12 | call dword ptr [edx] |
005B114F | C3 | ret |
HOOK代码如下:
void HOOK测试()
{
DWORD Hook地址 =0x005B1148;//上面代码里备注那个
DWORD Hook子程序指针 = (DWORD)跳转;
DWORD 跳转值 = Hook子程序指针 - Hook地址 - 0x5;
DWORD old = 0;//存放原来的属性
//修改内存页面属性
VirtualProtect((PVOID)Hook, 32, PAGE_EXECUTE_READWRITE, &old);
// 注意下行指令的备注 : // 这里如果是jmp 跳转 填0xE9? call 跳转填 0xE8?
*(BYTE*)Hook地址 = 0xE8;
*(DWORD*)(Hook地址 + 0x1) = 跳转值;
VirtualProtect((PVOID)Hook地址, 32, old, &old);//恢复页面属性;
}
// 实现功能 也就是 求助的代码部分
void 跳转()
{
_asm
{
pushad
}
// 这里是要实现的功能 ,比如拦截 比如检测;
_asm
{
popad
//这里应该怎样书写
// 写这个? push 0x44E?
}
}
要求 分别以Call 跳转 或 JMP跳转的方式 给出 函数 :跳转的代码(格式同上文给出);
并查看上文中备注部分的问题。
由于初学,部分描述可能不到位,请给出一段代码实现以下功能:
在 拦截 或者检测 那 实现 printf(11111\n");
所给出的示例 将在测试及学习后,如成功即采纳。