逆向脱壳总结
一、单步分析法:
**打开程序按 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/
浙公网安备 33010602011771号