易语言微信逆向hook内存原理分析+代码

论坛很多教程都是直接找偏移调用模块直接HOOK的,今天从hook原理层分析下hook实现的方式,用wx为例
文章内容只做技术分析,技术交流,为保护分析软件隐私部分代码已经被更改,不能直接使用。

Hook (wechatwin_基址 + 偏移, 6, { 96, 86, 232, 0, 0, 0, 0, 97 }, 到整数 (&接收消息), 真)  5个参数

hook地址:wechatwin_基址 + 偏移,

备份长度:6
调用数据: { 96, 86, 232, 0, 0, 0, 0, 97 }
回调地址:到整数 (&接收消息)
是否前置我们的代码: 真
===============================================
    回调偏移 = 寻找字节集 (调用数据, { 232 }, )
    原字节集 = 取空白字节集 (备份长度)
    写入长度 = 取字节集长度 (调用数据)
    ReadProcessMemory (-1, Hook地址, 原字节集, 备份长度, 备份长度)  ' 备份Hook前数据
    JPM_地址 = VirtualAlloc (0, 1024, 位或 (#MEM_COMMIT, #MEM_RESERVE), #PAGE_EXECUTE_READWRITE)  ' <!!!> 申请地址

    回调偏移 = 回调偏移 + 备份长度
    WriteProcessMemory (-1, JPM_地址, 原字节集, 取字节集长度 (原字节集), 0)  ' 恢复之前Hook覆盖掉的代码
    WriteProcessMemory (-1, JPM_地址 + 备份长度, 调用数据, 写入长度, 0)  ' 往申请的内存写入我们首次传过来的数据
    WriteProcessMemory (-1, JPM_地址 + 回调偏移, 偏移计算 (JPM_地址 + 回调偏移 - 1, 回调地址), 4, 0)  ' 目标地址 - 原地址 - 5
    WriteProcessMemory (-1, JPM_地址 + 备份长度 + 写入长度, { 233 } + 偏移计算 (JPM_地址 + 写入长度 + 备份长度, Hook地址 + 备份长度), 5, 0)  ' 跳回Hook后下条执行的地址

    WriteProcessMemory (-1, Hook地址, { 233 } + 偏移计算 (Hook地址, JPM_地址), 5, 0)  ' 写入Hook的Jmp地址
    .计次循环首 (备份长度 - 5, )  ' 这里默认为Jmp  5个字节 多余的填充PON
    填充Dm = 填充Dm + { 144 }
     .计次循环尾 ()
    .如果真 (取字节集长度 (填充Dm) ≠ 0)
        WriteProcessMemory (-1, Hook地址 + 5, 填充Dm, 取字节集长度 (填充Dm), 0)  ' 超过5个字节用PON填充
===============================================

     hook前OD代码样子 (要hook选中项位置)
     (图1) <ignore_js_op>
      hook后OD代码样子 (hook点已被我们自己的代码所替换)
     (图2) <ignore_js_op>
     上方代码具体步骤:
     一、备份原先hook点数据:
          回调偏移 = 寻找字节集 (调用数据, { 232 }, )   ‘调用数据:{ 96, 86, 232, 0, 0, 0, 0, 97 }  回调偏移计算结果为3,即取96,86,232的位置
          原字节集 = 取空白字节集 (备份长度)      ‘====6长度的字节集
          写入长度 = 取字节集长度 (调用数据)      ‘====8
          ReadProcessMemory (-1, Hook地址, 原字节集, 备份长度, 备份长度)  ' 备份Hook前数据  (第一张图片选中行数据)
         (图3) <ignore_js_op>
          JPM_地址 = VirtualAlloc (0, 1024, 位或 (#MEM_COMMIT, #MEM_RESERVE), #PAGE_EXECUTE_READWRITE)  ' <!!!> 申请地址
          JPM_地址 =00AF0000  (如上图)
          回调偏移 = 回调偏移 + 备份长度   ‘3+6=9
          WriteProcessMemory (-1, JPM_地址, 原字节集, 取字节集长度 (原字节集), 0)  ' 在我们新申请的地址,恢复之前Hook覆盖掉的代码
          WriteProcessMemory (-1, JPM_地址 + 备份长度, 调用数据, 写入长度, 0)  ' 往申请的内存写入我们首次传过来的数据{ 96, 86, 232, 0, 0, 0, 0, 97 }
          WriteProcessMemory (-1, JPM_地址 + 回调偏移, 偏移计算 (JPM_地址 + 回调偏移 - 1, 回调地址), 4, 0)  '偏移计算= 目标地址 - 原地址 - 5
          ***偏移计算=回调地址-(JPM_地址 + 回调偏移 - 1)-5   ‘计算出我们自己回调函数的jmp地址,写入{ 96, 86, 232, 0, 0, 0, 0, 97 } 中,0,0,0,0的位置
         (图4) <ignore_js_op>
          WriteProcessMemory (-1, JPM_地址 + 备份长度 + 写入长度, { 233 } + 偏移计算 (JPM_地址 + 写入长度 + 备份长度, Hook地址 + 备份长度), 5, 0)  ' 跳回Hook后下条执行的地址
          (图5) <ignore_js_op>
            写入这条语句
          WriteProcessMemory (-1, Hook地址, { 233 } + 偏移计算 (Hook地址, JPM_地址), 5, 0)  ' 写入Hook的Jmp地址
           (图6) <ignore_js_op>
          在原程序hook点写入我们的jmp地址
          由于jmp 地址只需要五位,如果备份的数据多,这里要把多余的数据用nop填充
           (图7) <ignore_js_op>
           WriteProcessMemory (-1, Hook地址 + 5, 填充Dm, 取字节集长度 (填充Dm), 0)  ' 超过5个字节用PON填充
           到此先备份数据,再执行我们函数的hook代码结束。

           码字不易,请多点赞,赞赏,欢迎技术交流分析 群:674056030
posted @   兔兔乐  阅读(2317)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示