关于手动脱壳的分析及方法总结

手动脱壳是软件逆向及病毒分析最基本的操作,主要为分析文件程序和反编译逆向的过程中,帮我们脱掉程序的壳代码,从而方便去分析该程序的关键代码。

壳的理解:

是在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。

它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。

加壳的全称是可执行程序资源压缩,是保护文件的常用手段,是利用特殊的算法,对EXE、DLL文件里的资源进行压缩、加密。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。

两种脱壳方式:

目前脱壳一般分手动和自动两种,手动就是通过调试工具脱壳,涉及到很多汇编语言和软件调试方面的知识;自动就是用专门的脱壳工具,有些压缩工具自身能解压,如UPX;有些不提供这功能,如:ASPACK,则需要UNASPACK对付。

软件自动脱壳的好处是简单,但缺点一是不能解决部分手写壳,二是壳代码更新后,之前的脱壳工具就会失效。

认识OEP:

OEP:程序的入口点。软件加壳一般隐藏了程序真实的OEP, 我们需要寻找程序真正的OEP,才可以完成脱壳。

一般加壳程序在使用Ollydbg等动态调试工具时,会停在壳的预处理块。即在运行完程序自脱壳模块后,会停留在程序加壳之前的OEP位置,此时是dump程序的最佳时期。脱壳时在真实OEP处下断点就可以捕捉到程序代码段完全恢复的状态。因此,寻找加壳程序的正确OEP,就是手动脱壳的关键点。

关于IAT:

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

下面介绍几种常用的手动脱壳方法

1. 单步跟踪法

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

2. ESP定律法(最常用的方法)

ESP定律的原理是指程序中堆栈平衡的合理利用。在程序自解密或者自解压过程中,壳会先将当前寄存器内容压栈,如使用pushad,在解压结束后,会将之前的寄存器值出栈,如使用popad。因此在寄存器出栈时,往往程序代码被自动恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步跟踪(即F7),程序就很容易到达正确的OEP位置。

3. 内存镜像法(二次断点法)

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

内存镜像法的原理在于对于程序资源段和代码段下断点,一般程序自解压或者自解密时,会首先访问资源段获取所需资源,然后在自动脱壳完成后,转回程序代码段。这时候下内存一次性断点,程序就会停在OEP处。

4. 一步到达OEP

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

5. 最后一次异常法

最后一次异常法的原理是程序在自解压或自解密过程中,可能会触发无数次的异常。若能定位到最后一次程序异常的位置,可能就会很接近自动脱壳完成位置。现在最后一次异常法脱壳可以利用Ollydbg的异常计数器插件,先记录异常数目,然后重新载入,自动停在最后一次异常处。

6 .模拟跟踪法

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

7.“SFX”法

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

Example(手动脱UPX壳):

以buuctf里新年快乐为例:

下载后丢进exeinfo PE,发现有UPX加壳

尝试手工脱壳,丢进x64DBG,F9运行两次看到Pushad

F7步进一次发现只有ESP寄存器发生变化,可根据ESP定律,选择ESP寄存器,右键在内存窗口中转到

在内存窗口中选择地址,右键设置硬件访问断点–4字节

再次F9运行程序后,程序停下来的位置上面即popad–壳代码结束位置。在下面大跳转jmp处F2下断点。继续F9运行程序,直到jmp断点处,F7单步步进,找到OEP

利用x64 DBG自带的Scylla将程序dump下来

然后先IAT扫描,再获取导入表,最后修复Dump文件(三个步骤不能乱!!!)

最终生成一个dump.SCY.exe文件,然后再丢进exeinfo查看区段,脱壳成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值