> ## Content Index
> Fetch the complete content index at: https://blog.hacking.pub/llms.txt
> Use this file to discover other available public pages before exploring further.

# 脱壳小试
- URL: https://blog.hacking.pub/2017/07/14/tuo-ke-xiao-shi/
- Published: 2017-07-14T10:49:39.000Z
- Updated: 2019-02-18T08:09:31.000Z
- Author: chainhelen
- Tags: 逆向, 逆向工程, crackme, 脱壳

#### 前言

关于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](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%951.png)

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

![脱壳小试2.png](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%952.png)

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

![脱壳小试3.png](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%953.png)

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

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

`Debugger -> BreakPoints -> AddBreakPoints`

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

![脱壳小试4.png](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%954.png)

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

![脱壳小试5.png](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%955.png)

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

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

![脱壳小试6.png](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%956.png)

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

```

典型的程序入口痕迹

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

![脱壳小试7.png](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%957.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](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%959.png)

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

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

下图所示

![脱壳小试8.png](https://blog.hacking.pub/qiniu/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%95/%E8%84%B1%E5%A3%B3%E5%B0%8F%E8%AF%958.png)

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

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

#### 参考

[逆向脱壳附加数据处理](https://bbs.ichunqiu.com/thread-22711-1-1.html?ref=blog.hacking.pub)  
[逆向破解程序脱壳篇-压缩壳](https://bbs.ichunqiu.com/thread-22463-1-1.html?ref=blog.hacking.pub)