脱壳小试

前言

关于IDA的中文教程确实少,没有实例甚至讲解,都是自己琢磨的
本文是我按照网上其他人写的用ollydbg脱壳思路,这里尝试使用ida pro进行脱壳,该crackme在其他地方并没有脱壳教程

crackMe

前面有一节的TBM crackMe 逆向 是直接跳过脱壳部分,这一节补一下

ESP定律

ESP定律就是利用堆栈平衡的原理,迅速找到OEP(真实的程序入口)
通常的壳会把一些真实程序运行的资源进行压缩,等到压缩程序运行起来的时候,先进行解压,再跳到OEP的继续运行真实程序
在解压之前需要把当前环境进行保存,例如寄存器esp,那么在此下硬件断点,当压缩程序尝试恢复该寄存器值时,必然会去访问该保存,此时就能被前面的断点断住

环境

win10
ida pro Version 6.8.150423 (64-bit)
crackMe TBM
scylla x64 v0.9.7c
PEID V0.95.EXE(可选)

步骤

1
首先把TBM拖入IDA,查看function-view只有一个函数start,可见IAT为空

脱壳小试1.png

双击进入查看start,发现start函数上面有一个db 60h

脱壳小试2.png

游标放上去,使用快捷键c强制解析成指令

脱壳小试3.png

可见pusha,这个指令就是把寄存器都进行保存了
那么在0x00405001处按F2下断点,F9进行调试

在内存观察窗口Hex View右键Synchronize with RSP,在该内存处进行硬件断点
(注意此时不能使用F2添加断点,因为在Hex View窗口里F2是修改数据)

Debugger -> BreakPoints -> AddBreakPoints

弹出窗口中,输入地址,勾选Hardware

脱壳小试4.png

2
下完上述硬件断点后,按下F9运行,随后触发,如下图所示

脱壳小试5.png

注意上面的db 61h,依然使用强制解析得到popa,与上述的pusha对应

3.OEP
继续F8单步调试几下,很快就到了下图所示

脱壳小试6.png

seg017:004011D1 push    ebp  
seg017:004011D2 mov     ebp, esp  

典型的程序入口痕迹

4.dump
这时候,需要把内存中的各个有用的保存(dump)下来
ctrl-s快捷键召唤出段的列表

脱壳小试7.png

看到需要有用的段地址区间0x400000 ~ 0x407000 包括crackme6.exe、seg017、seg018等段

使用如下脚本File -> srcript file -> dumpScript.idc

//dumpScript.idc
static main(void)  
{
    auto fp, begin, end, dexbyte;
    fp = fopen("dump.exe", "wb");
    begin = 0x400000;
    end = 0x407000;
    for ( dexbyte = begin; dexbyte < end;dexbyte++ )
    {
        fputc(Byte(dexbyte), fp);
    }
}

生成的文件dump.exe

5.转存修正

peeditor 打开上面的dump.exe,选择节区
对每一个节区(段),都进行 右键选择转存修正 操作

脱壳小试9.png

6
这时候先运行一下crackme,然后打开syclla尝试附加这个crackme

但是如果系统进程数太多,在附加列表中可能找不到这个crackme进程,需要手动关一下其他进程

下图所示

脱壳小试8.png

1.选择进程
2.填入上面得到的OEP地址,004011D1
3.点击IAT搜索
4.获取输入表
5.修复转储,选择上面的dump.exe文件

生成的dump_SCY.exe就是脱壳之后原程序

参考

逆向脱壳附加数据处理
逆向破解程序脱壳篇-压缩壳