首页 安全防御正文

逆向基础:软件手动脱壳技术入门

这里整合了一些自己学习软件手工脱壳的笔记和脱壳文章,希望对新软件逆向脱壳的童鞋有所帮助。

1 一些概念

1.1 加壳

外壳的全称应该是可执行程序资源的压缩,这是保护文件的常用手段。外壳程序可以直接运行,但不能查看源代码。只有在外壳后才能查看源代码。

对EXE、DLL压缩和加密文件中的资源。WINZIP 的效果,但压缩文件可以独立运行,解压过程完全隐藏,在内存中完成。它们被添加到原始程序中Windows加载器进入内存后,首先在原始程序中执行,并获得控制权。在执行过程中,原始程序被解密和恢复,然后将控制权返还给原始程序,并执行原始代码部分。添加外壳后,原始程序代码通常以磁盘文件中加密的形式存在,只在执行过程中恢复内存,有效防止破解者非法修改程序文件,防止程序静态反编译。

外壳的类型通常分为压缩外壳和加密外壳。压缩外壳的特点是减少软件的体积,而加密保护并不是关键。加密外壳有很多种,不同的外壳有不同的优先级。一些外壳简单的保护程序,另一些外壳提供额外的功能,如注册机制、使用次数、时间限制等。

1.2 OEP

OEP:(Original Entry Point),程序的入口点。软件外壳通常隐藏了程序的真实性OEP(或者用假的OEP),我们需要找到程序的真实性OEP,可完成脱壳。

一般使用加壳程序Ollydbg当等待动态调试工具时,它将停留在壳体的预处理块中。也就是说,在程序原始代码块的减压或解密操作之前,程序自脱壳模块将停留在程序加壳之前OEP位置,此时是dump程序的***时期。脱壳是真的OEP处下int3断点可以捕获程序代码段完全恢复的状态。因此,找到正确的加壳程序OEP,手动脱壳也成了***要务。

1.3 IAT

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

2 一些脱壳 ***

2.1单步跟踪法

单步跟踪法的原理是通过Ollydbg的单步(F8)、单步进入(F7)和运行到(F4)功能,完全通过程序的自脱壳过程,跳过一些循环恢复代码的片段,单步进入,确保程序不会跳过OEP。这样,软件自动脱壳模块运行后,就可以到达OEP,并dump程序。

2.2 ESP定律法

ESP定律法是脱壳的利器,是应用频率***脱壳 *** 之一。

ESP定律的原理是合理利用程序中的堆栈平衡。由于在程序自解密或自解压的过程中,许多外壳会首先压制当前的寄存器内容,如使用pushad,解压后,将以前的寄存器值出栈,如使用popad。因此,当寄存器离开堆栈时,程序代码通常会自动恢复,硬件断点会触发。然后,在程序的当前位置,只需要一点单步跟踪,就很容易达到正确的位置OEP位置。

2.3内存镜像法(二次断点法)

内存镜像法是在加壳程序加载时通过的OD的ALT M进入程序虚拟内存段的快捷键。然后通过添加两个内存一次性断点,到达正确的程序OEP的位置。

内存镜像法的原理是程序资源段和代码段的断点。一般来说,当程序自解压或自解密时,首先访问资源段以获取所需的资源,然后在自动脱壳后将其转回程序代码段。此时,下内存的一次性断点将停止OEP处。

2.4一步到达OEP

所谓一步到达OEP脱壳法是根据脱壳的特点找到其距离OEP最近的汇编指令,然后下来int3在程序中断点OEP的时候dump程序。例如,些压缩壳。popad指令距离OEP或者Magic Jump特别近,所以使用Ollydbg搜索功能,可以搜索壳的特征汇编代码,达到一步断点OEP的效果。

2.5***一次异常法

***异常法的原理是,在自解压或自解密过程中,程序可能会触发无数异常。如果可以定位***程序异常的位置可能非常接近自动脱壳的位置。***异常法脱壳可以使用Ollydbg异常计数器插件,先记录异常数,再重新载入,自动停止***一次异常处。

2.6 模拟跟踪法

模拟跟踪法的原理是使用Ollydbg下条件断点,SFX在自解压段结束时,相当于自解压段(eip当值转到代码段时),已经很远了OEP很近,但这种跟踪 *** 会更耗时。

2.7 “SFX”法

“SFX”法利用了Ollydbg自带的OEP可以选择直接让程序停止寻找功能OD找到的OEP此时自解压已完成,可直接使用dump程序。#p#

3一些脱壳实践

以下是使用上述 *** 进行整理的 *** ,并尝试手动去除这些常用除笔记。

3.1UPX脱壳笔记

首先,侦壳:

enter image description here

先把程序扔掉OllyIce内部可见:

enter image description here

然后这里尝试使用ESP定理:即在ESP***第二次变化,对ESP硬件字访问断点设置在地址上,可以在代码中使用UPX算法恢复后,跳转到程序的正常入口。

enter image description here

然后F5运行时,没有直接跳到程序入口处的跳跃位置,但可以看到UPX大跳就在眼前:

enter image description here

因此,恢复后的程序入口点是0x00445151(单步往下走,F4跳过往回走的循环语句也可以看到这个跳跃的位置。)然后走到跳跃位置,跳到正常程序入口:

enter image description here

然后去除硬件断点并使用LoadPE的dump功能dump目标程序:

enter image description here

先修正映像大小,然后再选择完整脱壳,这样可以得到***步dump然后使用程序ImportREC修复dump程序的OEP,OEP的信息通过OD自带的dump45151功能查询或直接填写:

enter image description here

填写正确的入口地址ImportREC然后自动搜索IAT信息:

enter image description here

然后点击获取输入表得到修正IAT程序函数输入表后,点击显示无效函数,愉快地发现无效函数,然后直接修复转存文件。

enter image description here

选择刚刚***步dump修复下一个转储文件,修复后脱壳:

enter image description here

压缩壳在这里UPX,直接使用了ESP定律很容易找到OEP并dump程序。#p#

4.2 tElock脱壳笔记

这是一个tElock的壳:

enter image description here

1、先用最简单的***一次异常法: 首先把程序扔到OllyIce里面设置OD调试选项中的异常选项,

enter image description here

仅保留内存异常非法访问,然后使用异常计数器插件,使用前清空断点设置:

enter image description here

程序正常运行后,重新加载程序,然后选择第二步停止***一次异常之前:

enter image description here

然后用Alt M转向内存窗口,主程序code段下内存断点,SHIFT F9执行:

enter image description here

这样,程序就被正确中断了OEP选择从模块中删除分析以显示正常分析的汇编代码。然后使用LoadPE dump程序,修改程序图像大小。但是在使用中ImportREC v1.6F Fix正确输入版本OEP,在获取函数输入表信息时,会发现无效指针。使用 *** 一修复,再使用 *** 三可完全修复:

enter image description here

再点击Fix dump,可以修复之前dump下一个程序,脱壳完成:

enter image description here

2、使用二次内存断点法: 首先输入程序,忽略所有异常类型,然后在idata设置内存断点,然后设置段SHIFT F9:

enter image description here

enter image description here

再停下来code段设置内存断点,再次设置SHIFT F9执行可以直接实现正确OEP中:

enter image description here

然后LoadPE dump,然后修复IAT。修复 *** 与 *** 1相同。

3、寻找magic jump修复函数表完成后dump程序: 前两步或添加内存断点(idata、code),然后正确定位程序OEP处

enter image description here

如果此时使用LoadPE dump修复后,和前两种一样。这里先用。ImportREC获取函数输入表***指针地址的位置。

enter image description here

然后获得函数指针偏移地址0x005512C,加上基地址后为0x045512C,此时,在此位置下,硬件访问双字断点。然后再次SHIFT F9忽略异常执行后,会触发断点tElock的CRC校验错误:

enter image description here

所以这里要先绕过CRC只有通过验证,才能成功执行到硬件断点位置,因此程序首先暂停,然后使用Alt F9返回用户代码。单击确定按钮后,程序暂停调用ExitProcess的位置:

enter image description here

现在,我们应该向上寻找跳过这个退出的跳跃(CRC判断跳转),然后修改并跳过:

enter image description here

找到应该修改的位置,但如果修改后重新运行,就会恢复,所以先写下跳转地址,0x00469622。重新运行后,在idata断设内存断点,SHIFT F9停下后,再Ctrl G在修改找到修改点。修改后设置以前的硬件断点,以免触发CRC错误的验证。

无数次的SHIFT F9之后,指针可以在寄存器窗口看到并正常显示:

enter image description here

然后此时F8单步,找magic jump……通过分析疑似小生的大视频CRC跳转得到magic jump的位置:

enter image description here

这里记下来magic jump的地址是0x0046973B,然后清空udd文件,删除硬件断点,重新操作程序idata下内存断点停止,然后Ctrl G找到magic jump位置,修改跳转:

enter image description here

然后在code段下内存断点:

enter image description here

然后SHIFT F9执行,停下来OEP的位置:

enter image description here

这时候再dump程序,IAT表已修复,可直接获得脱壳版程序:

enter image description here

在这里尝试使用另外两种脱壳 *** ,并通过提前找到它们OEP修复了 *** CRC验证后,直接dump到了IAT修复的程序。#p#

3.3 PEncrypt脱壳笔记

首先进行侦壳:

enter image description here

先把程序扔掉OllyIce里面,然后程序停在这里,看起来很奇怪:

enter image description hereenter image description here

嗯,重新加载程序,尝试使用***异常法,不忽视所有异常,然后使用异常计数器插件,程序停止***异常:异常:

enter image description here

如果此时F8如果一步下去,程序会触发异常处理,然后就到不OEP是的。个时候需要看堆栈数据:

enter image description here

这时需要在0040CCD7处F2下断点,然后SHIFT F9执行,可跳过这个坑:

enter image description here

接下来是F8 F4一路到OEP:

enter image description hereenter image description here

用LoadPE脱壳,然后用ImportREC修复后,虽然没有无效指针,但仍无法运行:

enter image description here

这时候用LoadPE的重建PE功能:

enter image description hereenter image description here

然后就可以正常运行了:

enter image description here

该壳采用单步跟踪脱壳法,一路跳过程序“陷阱”,***达到OEP。并且使用了LoadPE的重建PE该功能重建了程序,最终完成了加密壳的整个脱壳过程。#p#

3.4 FSG变形壳脱壳笔记

首先,侦壳:

enter image description here

使用ESP定律,先扔程序OllyIce里面,F8一步走,观察ESP变化,在ESP***当次发生变化时,是的ESP在相应的地址处设置内存硬件访问WORD断点,然后SHIFT F9程序停止后,取消硬件断点F8单步:

enter image description here

用F4跳过向后跳转(循环),然后继续往下看,直到这里:

enter image description here

在这个jmp下面F4,程序会跑掉。说明程序代码已经在这个循环中释放出来了,所以在这个循环中找出是否有条件的跳跃。很容易找到magic jump然后我们Enter或者Ctrl G到00402666的位置,发现果然是OEP,重新分析,然后F2让程序下断点OEP:

enter image description here

如果是FSG1.33,直接使用LoadPE dump然后使用文件ImportREC修复后,可以正常脱壳。但它在这里使用ImportREC修复时会出现无效指针:

enter image description here

将指针直接剪掉(或删除),然后修复转存文件,发现无法正常打开:

enter image description here

然后将修复后的程序丢失到OllyIce中F9直接运行:

enter image description here

这是变形壳中添加的暗桩,会导致程序异常退出。这里直接nop掉下来或者把以前的jle(校验)改成jmp,然后保存和修改另存文件。然后就可以运行了

enter image description here

4 参考

【百度百科(各种概念),自己之前的脱文……】 摘要另一个脱壳步骤:http://www.52pojie.cn/thread-259984-1-1.html

   
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。