逆向脱壳总结

一、单步分析法:

**打开程序按 F8 单步向下, 尽量实现向下的 jmp 跳转
**会经常遇到大的循环, 这时要多用 F4 来跳过循环
**如果函数载入时不远处就是一个 call(近 call), 那么我们尽量不要直接跳过, 而是进入这个 call
**一般跳转幅度大的 jmp 指令, 都极有可能是跳转到了原程序入口点 (OEP)

二、ESP定律

ESP 定律的原理在于利用程序中堆栈平衡来快速找到 OEP,ESP寄存器的值变为了红色, 也即值发生了改变,右击ESP寄存器的值, 也就是图中的0019FF64, 选择HW break[ESP]

三、一步到达 OEP 法

 ctrl+f 查找 popad
    ctrl+l 跳转到下一个匹配处
    找到匹配处, 确认是壳解压完毕即将跳转到 OEP 部分, 则设下断点运行到该处

四、内存镜像法

内存镜像法是在加壳程序被加载时, 通过 OD 的ALT+M快捷键, 进入到程序虚拟内存区段. 然后通过加两次内存一次性断点, 到达程序正确 OEP 的位置.
    内存镜像法的原理在于对于程序资源段和代码段下断点, 一般程序自解压或者自解密时, 会首先访问资源段获取所需资源, 然后在自动脱壳完成后, 转回程序代码段.
    这时候下内存一次性断点, 程序就会停在 OEP 处.操作方法:
  选择菜单的选项->调试选项->异常
  勾选所有的忽略异常
  按下ALT+M, 打开内存镜像, 找到程序的第一个.rsrc, 按 F2 下断点, 然后按SHIFT+F9运行到断点
  再按ALT+M, 打开内存镜像, 找到程序的第一个.rsrc上面的.text(在示例中是00401000处), 按 F2 下断点. 然后按SHIFT+F9(或者是在没异常情况下按 F9)

五、最后一次异常法

原理是, 程序在自解压或自解密过程中, 可能会触发无数次的异常. 如果能定位到最后一次程序异常的位置, 可能就会很接近自动脱壳完成位置. 
现在最后一次异常法脱壳可以利用 Ollydbg 的异常计数器插件, 先记录异常数目, 然后重新载入, 自动停在最后一次异常处
操作方法:
  点击选项->调试选项—>异常, 把里面的√全部去掉! 按下CTRL+F2重载下程序
  开始程序就是一个跳转, 在这里我们按SHIFT+F9, 直到程序运行, 记下从开始按SHIFT+F9到程序运行的次数m!
  CTRL+F2重载程序, 按SHIFT+F9(这次按的次数为程序运行的次数m-1次)
  在 OD 的右下角我们看见有一个 "SE 句柄", 这时我们按CTRL+G, 输入SE 句柄前的地址!
  按 F2 下断点! 然后按SHIFT+F9来到断点处, F8 单步跟踪

六、SFX 法

SFX" 法利用了 Ollydbg 自带的 OEP 寻找功能, 可以选择直接让程序停在 OD 找到的 OEP 处, 此时壳的解压过程已经完毕, 可以直接 dump 程序。
操作方法:
  设置 OD, 忽略所有异常, 也就是说异常选项卡里面都打上勾
  切换到 SFX 选项卡, 选择 "字节模式跟踪实际入口 (速度非常慢)", 确定
  重载程序 (如果跳出是否 "压缩代码?" 选择 "", OD 直接到达 OEP)

七、IAT重建

 

 

 

 

参考链接https://ctf-wiki.org/reverse/platform/windows/unpack/trace/

posted @ 2026-01-27 13:26  hopeccie  阅读(4)  评论(0)    收藏  举报