lengshizai 2024-02-27 20:45 采纳率: 31.7%
浏览 4
已结题

汇编hook学习遇到的问题讲解 及相应处理

问题:学习汇编hook过程中自己的hook影响到堆栈导致程序崩溃
请求指出问题 并知道相应的解决办法 并作出解释帮助学习
请以我的代码格式修改并讲解以便于学习。

上篇已结题,因为可能是问题我没说清楚 这次我吧涉及到的所有都已经放在下面。
请通俗易懂的讲解下,

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                                 |
__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);//恢复页面属性
}

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                                 |
 

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程序即崩溃,请协助查找 并讲解原因
目前的情况是可以打印出11111 但是随机程序崩溃
并提出解决办法加以解释。
想要达成的目的:hook 目标地址 ,加入一个打印提示 :“111111”即提示hook成功。

另外,用call指令做跳转 一般需要字节数≥5字节 ,那么但我hook地址出的字节数>5时 ,该如何处理
类似本题代码中的hook涉及到堆栈改变如何处理
请以我的代码格式修改并讲解以便于学习。

  • 写回答

15条回答 默认 最新

查看更多回答(14条)

报告相同问题?

问题事件

  • 系统已结题 3月12日
  • 已采纳回答 3月4日
  • 创建了问题 2月27日

悬赏问题

  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3