前言
关于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为空
双击进入查看start
,发现start
函数上面有一个db 60h
游标放上去,使用快捷键c
强制解析成指令
可见pusha
,这个指令就是把寄存器都进行保存了
那么在0x00405001
处按F2
下断点,F9
进行调试
在内存观察窗口Hex View
右键Synchronize with RSP
,在该内存处进行硬件断点
(注意此时不能使用F2
添加断点,因为在Hex View
窗口里F2
是修改数据)
Debugger -> BreakPoints -> AddBreakPoints
弹出窗口中,输入地址,勾选Hardware
2
下完上述硬件断点
后,按下F9
运行,随后触发,如下图所示
注意上面的db 61h
,依然使用强制解析得到popa
,与上述的pusha
对应
3.OEP
继续F8
单步调试几下,很快就到了下图所示
seg017:004011D1 push ebp
seg017:004011D2 mov ebp, esp
典型的程序入口痕迹
4.dump
这时候,需要把内存中的各个有用的段
保存(dump
)下来
ctrl-s
快捷键召唤出段的列表
看到需要有用的段地址区间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
,选择节区
对每一个节区
(段),都进行 右键选择转存修正
操作
6
这时候先运行一下crackme
,然后打开syclla
尝试附加这个crackme
但是如果系统进程数太多,在附加列表中可能找不到这个
crackme
进程,需要手动关一下其他进程
下图所示
1.选择进程
2.填入上面得到的OEP地址,004011D1
3.点击IAT搜索
4.获取输入表
5.修复转储,选择上面的dump.exe
文件
生成的dump_SCY.exe
就是脱壳之后原程序