# 那些年我们一起脱过的衣裳－脱壳(上)

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-10-02T03:16:00Z
Canonical: https://wepostx.com/topics/1084

> 乌云历史资料归档
>
> **原始作者：** 夸父追日
> **原始编号：** superkieran-wooyundrops:803
> **原始发布时间：** 2015-10-02 11:16
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x01 简介

[http://drops.wooyun.org/tips/8296](http://drops.wooyun.org/tips/8296)文中提到了脱壳七大法,然而实际上我有八大法!而网上的那些教程都是你复制我的,我复制你的,千篇一律。朋友看了之后,依然不懂~
那篇文章中有UPX脱壳笔记,tElock脱壳笔记,PEncrypt脱壳笔记.但是我认为应该详细介绍八大法脱壳。因为他提到的所有这种脱壳笔记,都是利用八大法脱的!每一种壳都可以用很多种方法来脱掉,所以应该介绍的应该是脱壳大法,而不是xxx壳应该用xxx方法来脱,授人以鱼不如授人以渔。SO,有了这篇教程~
我可以保证:八种脱壳大法学会之后,你将能脱掉市面上70%以上的壳。其实脱壳并不需要捧着本汇编的书去学一遍汇编才能脱壳。

## 1.1什么是壳?
大家应该先明白“壳”的概念。在自然界中，我想大家对"壳"这东西应该都不会陌生了，植物用它来保护种子，动物用它来保护身体等等。同样，在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行，拿到控制权，然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然（当然后来也出现了所谓的“壳中带籽”的壳）。由于这段程序和自然界的壳在功能上有很多相同的地方，基于命名的规则，大家就把这样的程序称为“壳”了。就像计算机病毒和自然界的病毒一样，其实都是命名上的方法罢了。

## 1.2为什么要脱壳?
脱壳用处很大，可以破除壳程序对程序的保护。从而使我们更接近程序代码，了解这个程序。或者像我这种改版权小王子来说,只有脱了壳才能改版权!而对于免杀制作者来说, 帮助木马病毒进行免杀，我们可以直接加壳免杀，也可以脱壳对其代码进行修改从而躲过杀毒软件的查杀。

## 1.3脱壳的八大法

- 单步跟踪法

- ESP定律法

- 两次断点法

- 一步到达OEP

- 最后一次异常法

- 模拟跟踪法

- “SFX”法

- 出口标志法

# 0x02 脱壳前的准备

首先,我们还得回顾上位大神写的

## 2.1 OEP
OEP：(Original Entry Point)，程序的入口点。软件加壳一般隐藏了程序真实的OEP（或者用了假的OEP）， 我们需要寻找程序真正的OEP，才可以完成脱壳。
一般加壳程序在使用Ollydbg等动态调试工具时，会停在壳的预处理块。即处在对于程序原始代码块的解压或解密操作之前，在运行完程序自脱壳模块后，会停留在程序加壳之前的OEP位置，此时是dump程序的最佳时期。脱壳时在真实OEP处下int3断点，就可以捕捉到程序代码段完全恢复的状态。因此，寻找加壳程序的正确OEP，也成了手动脱壳时的第一要务。

### 2.1.1说了这么多,到了就算我脱壳的时候到了OEP我也不知道啊?
OEP：Original Entry Point(程序入口点) ，程序加壳前真正的入口点。 那么,我给大家准备了OEP特征大全!

### 2.1.2 Delphi

![原文图片](/media/2016/06/7ebd4579ade5de27bf071de64c4cc224)

### 2.1.3 BC++

![原文图片](/media/2016/06/8e90277fc3a3d8400fd65831f96fdd41)

### 2.1.4 VB

![原文图片](/media/2016/06/deb47d5ae2d3b547e268acc46a95ac71)

### 2.1.5 汇编

![原文图片](/media/2016/06/95690bc2f872666b0cdf99ce88efc6af)

### 2.1.6 VC++6.0

![原文图片](/media/2016/06/02be18af2b4345d78e1155b5055bfab4)

### 2.1.7 VC++7.0

![原文图片](/media/2016/06/86c67283526502a5ed5259cb4f54e9d9)

### 2.1.8 易语言非独立编译

![原文图片](/media/2016/06/661ed1b7814e062f4c53d2b51deb88f0)

### 2.1.9 易语言独立编译

![原文图片](/media/2016/06/4c23e4e27c27468a745b2a45adc9e976)

## 2.2 IAT
IAT：(Import Address Table)，导入地址表。由于导入函数就是被程序调用但其执行代码又不在程序中的函数，这些函数的代码位于一个或者多个DLL中。当PE文件被装入内存的时候，Windows装载器才将DLL 装入，并将调用导入函数的指令和函数实际所处的地址联系起来（动态连接），这操作就需要导入表完成。其中导入地址表就指示函数实际地址。 多数加壳软件在运行时会重建导入地址表，因此获取加壳程序正确的导入地址表也是手动脱壳操作中的一个关键问题。

# 0x03 我能在万花从中脱去壳的衣裳!

下面是我对八大法脱壳的实例的详细讲解。

## 3.1脱壳的基本步骤
查壳(PEID、FI、PE-SCAN)-->寻找OEP(OD)-->脱壳/Dump(LordPE、PeDumper、OD自带的脱壳插件、PETools)-->修复(Import REConstructor)

## 3.2单步跟踪法

### 中国菜刀为例
查壳 很经典的UPX壳

![原文图片](/media/2016/06/3561645e1c794a41846e6f7e313704df)

我们一般要制作过狗菜刀的必经之路,那只有脱壳才能修改里面的东西!

- 一般在有壳的时候,用OD载入,会弹出以下提示框

![原文图片](/media/2016/06/29b40ded8305016218bb54e25702b398)

那么我们在这里选择否就是了!

- 首先要记住几个快捷键:F8单步步过,F7单步步入,F4运行到选定位置

![原文图片](/media/2016/06/19bc1aabaf859d6eaf41aeff9394fe93)

![原文图片](/media/2016/06/e393288a799fdb2a960225d6bbaa6b4d)

载入程序之后使用F8单步向下跟踪,实现向下的跳。当遇到有一条红色的向上的跳转的时候(红色为跳转已实现,白色为跳转未实现。),如果再继续按F8会一直在这里循环。那么我们可以在它的下面那一行按下F4(运行到选定位置)这样就不会一直循环了,因为我这里有连续两个向上的跳转,所以应该跳过这两个循环,所以我们用鼠标选中下一行

```text
004B055C 8B02 mov eax,dword ptr ds:[edx]
```
这一行按下F4来进行继续的向下操作。

![原文图片](/media/2016/06/7b9d68dfc6aae8bc7ce779bdf0557a17)

![原文图片](/media/2016/06/dfa47cc1ae2b9b0bf6d4d28cbac6dd0e)

其实很简单,就这样上面这个方法一直按F8,遇到向上的跳转就按F4,到达OEP之后就能进行脱壳了。
这就是中国菜刀的OEP,跟上面的OEP大全对比一下。VC++6.0的程序!

![原文图片](/media/2016/06/3cee2546e128bfcf37af3937b3cc2fe1)

- (图中为马上就要到达OEP了),遇到在popad指令下的远转移指令时，要格外注意，因为这个远转移指令的目的地很可能就是OEP。 或者有很大的跳转（大跨段），可以看到jmp的那一行

```text
004B0634 - E9 073EFBFF jmp caidao.00464440
```
当前地址004B0634跳转到 00464440,那么这就是一个大跳转,跳转的目的地很大的可能就是OEP

![原文图片](/media/2016/06/3067475a0a672371a39c1f41105d6ca3)

- 如果(我说的是如果)刚载入程序，在附近就有一个CALL的，我们就F7跟进去，不然程序很容易使程序运行起来(跑飞)，运行起来了话,我们就不能继续执行下面的操作了。新例子:

![原文图片](/media/2016/06/eb1592e9ab483a92d4cddcc387d7517b)

- 如果(我说的是如果)在跟踪的时候，如果运行到某个CALL程序就让程序运行起来了，就在这个CALL中F7进入,然后继续F8,遇到向上的跳转就按F4。

- 到达OEP就完了吗?
还没开始脱壳呢~~[http://drops.wooyun.org/tips/8296](http://drops.wooyun.org/tips/8296)文中介绍了用 LordPE脱壳,当然用LordPE脱壳是极好的,那么我就先用OD自带的脱壳调试进程来就行脱壳吧,以后再讲LordPE脱壳。

![原文图片](/media/2016/06/db97d7791e644c7a8dcbc77056caddb6)

在这里需要注意的是重建输入表和不重建输入表,其他的都为默认。

![原文图片](/media/2016/06/3e8863902ecedfff86b1e64a2989876a)

首先选择重建输入表点击脱壳,命名为1.exe
然后选择不重建输入表点击脱壳,命名为2.exe
因为我们不知道需不需要重建输入表,所以就进行两次脱壳。
1.exe运行正常, 2.exe运行错误

![原文图片](/media/2016/06/2c76a6809097730e8b3d1310ed032031)

再看一下1.exe有没有壳,ok,没有壳了!

![原文图片](/media/2016/06/b0b63e5e72679bf1ce48ae660bfcdecf)

注:如有不懂欢迎私信!

## Replies
