010-那些年我们一起脱过的衣裳-脱壳(中)

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

0x01 我能在万花从中脱去壳的衣裳!(续)
======================

* * *

3.3ESP定律法
———

### 3.3.1ESP定律介绍

ESP定律法是脱壳的利器,是国外友人发现的。有了ESP定律,可以方便我们脱掉大多数的压缩壳。可谓是本世纪破解界中最伟大的发现之一。这里只简单的看一下狭义ESP定律的原理。

当我们用OD载入之后开始就是 pushad 基本上就可以使用ESP定律脱壳了

### 3.3.2以老版菜刀为例:

首先查壳,还是UPX的壳

![](http://drops.javaweb.org/uploads/images/721610e59fb7eb60a41fa6d8c7ca8d785beda326.jpg)

1.使用OD载入之后开头是pushad,那么我们可以初步判断可以使用ESP进行脱壳

![](http://drops.javaweb.org/uploads/images/b2420abf240ff75cc73fbc2bdca5b93e460c4306.jpg)

那么,我们该怎么判断到底能不能用ESP定律脱壳呢?

按下F8(单步步过),既然叫做ESP定律,那么肯定跟右上角寄存器窗口,中的ESP有必然的联系的

![](http://drops.javaweb.org/uploads/images/3e3fbbf6f7f7ed97c17e0a477982bf448714874e.jpg)

2.可以看到到了这一步,只有ESP是红色的(不用管EIP),那就可以使用ESP定律。

选择ESP—||->右键—||->数据窗口中跟随

![](http://drops.javaweb.org/uploads/images/421eb67d0372593ae590d4e3bbac41754df2c8d8.jpg)

这时我们可以看到数据窗口,变成了下图所示

![](http://drops.javaweb.org/uploads/images/44037f259e557096f4b4805776fbbb7e6500c073.jpg)

3.在HEX数据中选择任意一段(网上总有人说选一个字节,选两个字节,选四个字节),其实实际上选多少个都可以,但是只要从第一个开始选起。然后右键—||>断点—||>硬件访问—||>在Byte,Word,Dword选择任意一个都可以。

![](http://drops.javaweb.org/uploads/images/d739f354c8a368a460ebbc857de0c70a2234375e.jpg)

可以在调试中的硬件断点查看自己的断点

![](http://drops.javaweb.org/uploads/images/e2a10eb781eb7a8c5ca04cc1118dca87edfb1560.jpg)

4.然后按下F9运行程序,程序会自己断下来。断下来之后就会很快到达OEP,然后单步跟踪法一步一步向下

遇到向上跳转则在它的下一行按F4(运行到此处)

![](http://drops.javaweb.org/uploads/images/35eba8b70c6f2fdba8a1a3a58b182dd763cac541.jpg)

下面看到一个大跳转,跳转过去就是OEP了

“`
004AE9C4 – E9 DF6FFBFF jmp caidao.004659A8

“`

5.到达OEP之后就可以开心的脱壳啦~(和单步跟踪法脱壳操作相同)

![](http://drops.javaweb.org/uploads/images/dd6e63539c9ce4139326c65210b6b6027ea79a1c.jpg)

再介绍一种非常简单的方法,用插件下硬件断点

在ESP右键选择 HW break [ESP] 她会自动下下硬件断点,之后直接按下F9运行程序再F8就到达OEP了

![](http://drops.javaweb.org/uploads/images/064e5ce3a4f62549a4ba9f09b2e32324647b207c.jpg)

3.4两次断点法
——–

还是以菜刀为例吧,我保证是最后一次了%>.<% 1.选项---||>调试设置—||>异常 全部打上√,也就是忽略所有的异常

![](http://drops.javaweb.org/uploads/images/dfae481db6da8f489e5792b3163048179d98cd98.jpg)

2.按键盘上的“ALT+M”组合键打开OD的内存窗口

![](http://drops.javaweb.org/uploads/images/13b2411f452287c34a3ef8bd921ebbb62e33a04d.jpg)

3.如图,我们首先找到自己程序名的 .rsrc区段 按F2下断点 然后 Shift+F9 就会回到反汇编窗口

然后再按”ALT+M” 然后找到程序的第一个.rsrc.上面的.CODE(也 就是00401000处),按F2下断点。

然后按SHIFT+F9就到达OEP或者到达了OEP的附近了,然后再用单步跟踪法就可以到达OEP了

![](http://drops.javaweb.org/uploads/images/dd6e63539c9ce4139326c65210b6b6027ea79a1c.jpg)

然后怎么脱壳我就不说了。我用了三种方法脱下UPX,只是想证明脱壳是可以用很多种方法脱壳的。而不是总是看到xxx壳用什么方法去脱啊?这些问题。。。。。。

3.5一步到达OEP
———-

1.首先必备的就是查壳嘛~ ASPack的壳

![](http://drops.javaweb.org/uploads/images/bee3ba7f6630f821c2b890f0af17a8a82c88959f.jpg)

2.首先将程序加载进OD 按F9开始执行

在堆栈窗口可以看到 拖到最下边

![](http://drops.javaweb.org/uploads/images/f9120b0ae90a6ce010246fcc49f9c3b36bbdebae.jpg)

3.然后慢慢向上找,因为我们的程序名称就叫ASPack,所以我们在向上找的第一个程序名称中,选中它,然后右键—||–>反汇编窗口中跟随

![](http://drops.javaweb.org/uploads/images/6367b705759afc3d6e7c3eb77df86b2592424ce5.jpg)

在反汇编窗口中按Ctrl+A(分析代码)

![](http://drops.javaweb.org/uploads/images/fe8e651c620d3112f41a3d87847ea3c1d8bdc059.jpg)

然后呢就能在堆栈窗口中可以看到一个括号将程序名称括起来了,这是一个段.

![](http://drops.javaweb.org/uploads/images/05127b5cc4677ec3b903217a143f050b4d73a768.jpg)

4.然后需要在段中找到段首,也就是这个括号的开头.找到返回到xxx(代表程序名称)这一行,选择反汇编窗口中跟随.

![](http://drops.javaweb.org/uploads/images/9a45c943dfa07a7819657380065fd2cc396537ae.jpg)

5.然后我们在反汇编窗口中向上找,肯定就在这附近,找了一下发现了OEP

![](http://drops.javaweb.org/uploads/images/76e394d38e557457f60b44ce7a46dc5737a0c26f.jpg)

6.那么问题来了,我们程序都还没有开始调试,所以我们要怎么样才能将程序段在这里,然后进行脱壳呢?

选中OEP 的第一行,右键—||–>数据窗口中跟随—||–>选择

![](http://drops.javaweb.org/uploads/images/423ca2ca455265f1011310beb08eb5cbd824ca20.jpg)

7.然后在数据窗口中可以看到前面两个HEX数据已经被选中了,然后

右键—||–>断点—||–>硬件执行

![](http://drops.javaweb.org/uploads/images/dd4177cbaa107443ce16129edddad5f4c99d2609.jpg)

然后查看一下硬件断点下好了没有,ok

![](http://drops.javaweb.org/uploads/images/f9dd386408b8005f9bdc79adcc4552f76f6bc5e1.jpg)

8.然后重新运行,按下F9执行程序,然后就直接在OEP断下来了,然后使用ollyDump脱壳进程进行脱壳.这个上面已经说了,现在我就不多说了

![](http://drops.javaweb.org/uploads/images/3ef77ced09eb12f4fe612524e1635487f6b29443.jpg)

3.6最后一次异常法
———-

在脱壳方法中,最后一次异常法,这是最基础的脱壳技术之一。

![](http://drops.javaweb.org/uploads/images/1cca14fa360455a6159d88cfc1a9e58e9ba6abd6.jpg)

1.将待脱壳程序载入到OD中,单击OD的“选项”菜单,在弹出的菜单中单击“调试设置”命令,在随后弹出的“调试选项”对话框中切换到“异常”选项卡,清除该选项卡下所有复选框,也就是不忽略任何异常。

![](http://drops.javaweb.org/uploads/images/e4be490c1b86fb70adbb6f3ecac56bd694f719e0.jpg)

2.按Shift+F9让程序运行起来,记录按键的次数。记录为x。我这里是两次就让程序运行起来了,但是你有可能需要十次或者二十次才能运行起来。

3.然后回到OD中,按Ctrl+F2(重新载入程序),按1次Shift+F9。那么为什么按1次呢?上面让记录为x,所以这里需要按x-1次。例:如果让一个步骤按了10次运行起来了,我们在这里就要按9次Shift+F9。

![](http://drops.javaweb.org/uploads/images/27f4c8fbd7572a44d8e8be36a09f85c29c0281da.jpg)

4.在OD右下角窗口中找到“SE句柄”或是“SE处理程序”,右键—||–>反汇编窗口中跟随(如果没有反汇编窗口中跟随,可以在反汇编窗口按Ctrl+G 输入”SE处理程序”前面的地址)。

![](http://drops.javaweb.org/uploads/images/d675b1ee0cd84b76b4e7999081d3c1266066c456.jpg)

5.在OD的反汇编窗口中跟随到上一步记录下的内存地址,并在此内存地址处下一个断点。

![](http://drops.javaweb.org/uploads/images/ab4ebf4bddc8ecb448d1249f494da000c0e2b717.jpg)

6.按键盘上的“Shift+F9”组合键让程序运行到上一步下的断点处,按键盘上的“F2”键取消此处的断点。

7.使用单步跟踪法追踪(一直按F8,遇到向上的跳转在下面那行按F4(运行到此处))直到到达OEP

![](http://drops.javaweb.org/uploads/images/b65b344e3a382ef985e12e3e49e9287835a55d5b.jpg)

然后到了OEP怎么脱壳,在这里我就不说了

3.7模拟跟踪法
——–

不管要怎样先查壳再说 nPack的壳

![](http://drops.javaweb.org/uploads/images/5ddf9afa44ecc46f5831e05d12ae92ab08d37416.jpg)

在讲到的众多脱壳方法中,我们首先讲了单步跟踪法脱壳,因为单步跟踪脱壳法是脱壳技术中最基础的方法,在后面其它的一些脱壳方法中总会或多或少的配合单步跟踪法才能顺利完成脱壳工作。便是始终是一次次的按“F8”键来单步跟踪程序,偶尔遇到回跳就跳过执行,这样机械性的操作很是烦人,那么能不能让机器来代替人力,让工具帮我们单步跟踪呢?答案是肯定的,这也就是这节讲的内容——模拟跟踪法。模拟脱壳法就是模拟单步跟踪来进行查找OEP。

网上的大部分模拟跟踪法的常见步骤是这样的:

1、将待脱壳程序载入OD中,先简单的跟踪一下程序,看看有没有SEH暗桩;

2、按键盘上的“ALT+F9”打开OD的内存窗口,找到“SFX,输入表,资源”的行,并记录此行的内存地址;

3、在OD的命令行窗口执行命令“tc eip<上一步中记录下的地址”,命令执行后就会跟踪到OEP。 然而这种方法可以是可以,但是可能从早上开始跟踪,一直跟踪到晚上都没有跟踪完成。网上那些人拿着文章转来转去,也没见得谁真的去试验过...效率实在太慢了,那不如我们来帮机器一把? 首先,需要用到的是上面所讲到的两次断点法,使用两次断点法,按照两次断点法的最后一次Shift+F9之后 然后ALT+M回到内存窗口,然后选中程序名称的SFX,输入表. ![](http://drops.javaweb.org/uploads/images/b10ef119d47300269f5dcd075ee56723ac535768.jpg) 然后在OD的命令执行窗口执行命令"tc eip修正镜像大小

![](http://drops.javaweb.org/uploads/images/1ab5d921092ad76ee348f3688f2dc675f23b90bf.jpg)

2.然后选择程序右键—||–>完整转存

![](http://drops.javaweb.org/uploads/images/b7715c6dddc56b15a825e365fd45950b851bdbde.jpg)

3.打开ImpRec在下拉框中选中程序

![](http://drops.javaweb.org/uploads/images/538359eb4184abad927030e07ff33f4cfc7d064e.jpg)

4.然后在OD中将下面箭头所指处复制下来

![](http://drops.javaweb.org/uploads/images/bea9720f38362311c8df2fa3d0e0f983fc525415.jpg)

5.然后在下面OEP处填写刚才复制的—||–>点击自动查找TAT—||–>获取输入表—||–>点击无效函数,这里没有

![](http://drops.javaweb.org/uploads/images/55ec3b85030e663499810be1407c1ff4f41c45e0.jpg)

(如果有,在输入表函数信息框内选中,然后删除指针!)

![](http://drops.javaweb.org/uploads/images/cf227802444df38504e7d05761b6ecb0a4116cf1.jpg)

然后点击右下角的转储到文件!需要选中那个刚才使用LoadPE完整转存的文件名,然后就脱壳完成!!!

0x02 后续章节
=========

* * *

以上很多注意的点是我刚学脱壳时遇到的一系列的问题,我希望大家不要再误入网上那些随意转载的文章的那些不明白的东西.下节教大家如何编写自动化脱壳插件.

如果有什么不明白欢迎提问

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容