吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 650|回复: 8
收起左侧

[新手问题] 关于InlineHook的疑惑

[复制链接]
richard_ljd 发表于 2024-7-24 18:12
本帖最后由 richard_ljd 于 2024-7-24 18:13 编辑

如题,主要问题来自于InlineHook的设置,

对于InlineHook首先在程序中修改,使程序运行到自己加入的代码,运行结束后再返回原本位置运行,概念上没有什么问题

我跟着课程里写了一个程序进行操作,下图是这个程序
程序界面.png
程序代码.png

第一个按钮按下会弹出信息框,第二个按钮按下会修改标签的标题
对应汇编代码.png
这是程序的汇编代码,没有什么问题,我大致查看了一下以后准备在第二个按钮事件的结尾进行操作
预备插入hook的位置.png

按理说应该没什么问题,就是找一片空白区域写入自己的代码,然后我就随便搜索了一块0000000的地方写入,写入我自己的代码(调用一个messagebox)
我的代码.png
然后在程序代码中加入jmp的时候告诉我:"指向分支位置不是可执行位置",于是我转入内存布局页面看了看
程序布局.png

在视频中,老师说因为PE部分要对齐,所以往往会有很大一部分的空间可供写入自己的代码,

但是在这里我原本搜索的位置无法执行以后切换到了PE的模块,写入代码后依旧是无法执行的位置。

我最后是把hook的代码写在了加载后的dll里面才运行成功

输出.png
对于这里我想问一下,一般想要写一个hook应该写在哪里比较合适?
dll注入工具.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
yonghuang + 1 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2024-7-27 04:23
本帖最后由 爱飞的猫 于 2024-7-27 06:47 编辑
richard_ljd 发表于 2024-7-25 19:12
我去看了一下VirtualAlloc的内容,基本上了解了这个函数,但是这个流程我不清楚怎么写了()

VirtualAll ...

长跳 E9 需要五个字节,将 Hook 点往前挪到 00FF 763C 会好一些。

  • VirtualAlloc 申请内存,记为 地址
  • 将原本需要 Hook 的地址改成 jmp 地址,即 E9 xx xx xx xx 其中 后面四个 xx 为地址偏移。
    • 例如在 00FF 763C 跳到 00AA 0000,就是 00AA 0000 - (00FF 763C + 5) = 0xffaa89bf,小端序所以组合起来是 E9   BF 89 AA FF
  • 将原始的字节拷贝到 地址
  • 在地址 + 原始字节后面写出你的 ShellCode,例如 CALL xxxx 字节码是 E8 xx xx xx xx,一样的算法。
  • CALL 之后跳回你的修改点,例如 jmp  yyyyyyyy,一样的算法。

VirtualAlloc 申请的内存写的指令统称为 ShellCode。两边的指令大概是这样:

00FF763F:
  jmp 00AA0000

00AA0000:
  ; 备份的原始指令
        add esp, 0x18 ; 这句话其实可以省略
  mov esp, ebp

  call 00BBCCDD ; 你的函数

  ; 结束,再跳回去
  jmp 0x00ff7641

尝试了下重现你的问题里的流程:

  1. 启动目标程序.exe,然后启动注入器.exe (或注入器源码)
  2. 透过 VirtualAllocEx 跨进程申请内存 => 用来写出 ShellCode
    1. ShellCode 放啥都行,别破坏堆栈 / 原始程序需要的寄存器即可
    2. 执行完指定函数后,想办法回来(pop ecx; 原始指令; jmp ecx
    3. 如果有需要备份的寄存器,应当在一开始就入栈备份,执行完自己的代码后还原。
  3. 在指定位置写出 CALL (偷懒了,其实 JMP 效果更好,生成 ShellCode 时要多一个步骤)

目标程序.exe 代码执行流程:

  1. 按下按钮
  2. 正常执行
  3. CALL 写出的 ShellCode
  4. 执行完毕后,回到 CALL 后面的地址
  5. 继续执行

测试程序+注入代码: https://pan.baidu.com/s/1P7WKZ6H723FH-yzwNcGypw?pwd=g5dn


如果你只是希望能够快速测试你写的 Hook 且找不到好利用的空间,推荐使用 Cheat Engine 的 Auto Assembler 功能,可以一键开关魔改的代码(申请内存、写出代码、改 JMP 三步一气呵成)。

如果你的目标是固定的程序,你可以提前找好一个空间(或你已知程序不会利用的可执行代码空间),然后利用 Multiline Ultimate Assembler 插件(支持 OD、x64dbg)在需要的时候一键全部写出。

 楼主| richard_ljd 发表于 2024-7-24 18:21
最后那张图是最开始想问的,结果后来想明白了结果图片删不掉()不用管
lies2014 发表于 2024-7-24 18:26
你写入文件头干什么?
应该写入“.text”段,这个段权限里有“E”代表可执行,其他段都不可执行
 楼主| richard_ljd 发表于 2024-7-24 18:44
lies2014 发表于 2024-7-24 18:26
你写入文件头干什么?
应该写入“.text”段,这个段权限里有“E”代表可执行,其他段都不可执行

教程里面老师直接调出搜索栏搜00000000000000000000000000,找到空地就开始写,我也这么跟,结果出事了(悲)
LovelyLove 发表于 2024-7-24 20:14
感谢大佬们的解析
爱飞的猫 发表于 2024-7-25 01:07
FB00EB 太前了,你通常要找 .text 区段。

另外 inlinehook 不需要你自己找内存区域,直接用 VirtualAlloc 动态申请即可。
 楼主| richard_ljd 发表于 2024-7-25 19:12
爱飞的猫 发表于 2024-7-25 01:07
FB00EB 太前了,你通常要找 .text 区段。

另外 inlinehook 不需要你自己找内存区域,直接用 VirtualAllo ...

我去看了一下VirtualAlloc的内容,基本上了解了这个函数,但是这个流程我不清楚怎么写了()

VirtualAlloc返回一个地址在eax,我是调一个openfile选定一个文件,从中获取已经准备好的代码写入[eax],还是调试器直接等着走到这行代码返回地址以后手动写?

自己学习的时候测试的话,.text找个空位直接写入代码肯定是足够了,但是真要写东西我觉得还是不太够用来着...

点评

[md]长跳 `E9` 需要五个字节,将 Hook 点往前挪到 `00FF 763C` 会好一些。 - VirtualAlloc 申请内存,记为 `地址` - 将原本需要 Hook 的地址改成 `jmp 地址`,即 `E9 xx xx xx xx` 其中 后面四个 `xx` 为地址偏  详情 回复 发表于 2024-7-27 04:23
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 22:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表