脱壳八法学习记录

基本很多程序都是加了壳的,简单来说就是加密了的,程序运行时先运行解密程序,解密完成再跳到程序开始处运行,这就相当于在代码外面加了“保护壳”

脱壳就是一般解密完成后,直接从内存保存到一个文件

方法一 ESP定律

其实这个很多教程也没有说清楚到底是为什么,下面我尝试说一下,核心的一点就是它利用的是堆栈平衡原理,pushad之前和popad之后栈的状态是一样的

首先查下壳

QQ20160617133616.png

一开始有个pushad,就是将od右上角的八个寄存器入栈,那么当程序解密完毕,肯定有个对应的popad,将八个寄存器还原

刚载入时如下图,注意栈的状态

QQ20160618114047.png

下面这个是执行完popad时候栈的状态,可以看到是一样的,

QQ20160618114400.png

f8一下,可以看到寄存器的值都入栈了

QQ20160618114132.png

那么popad之前栈的状态跟上图是一样的

QQ20160618114438.png

因为popad要访问栈的这8个dword,那么我们只要在其中一个字节,字或双字下个硬件访问断点就行了

QQ20160618114306.png

f9运行,跟着f8到遇到返回或jmp,跟着就到达以oep,一般是显示db数据

QQ20160618114508.png

当然od有插件,但不好用,就是不成功咯,有时,一般用下面的lordPE,但插件可以用于计算oep的相对虚拟地址

QQ20160618115143.png

最后用importREC修复一下导入表,据说是因为在内存中IAT是当前机器API的实际地址,我们要修复导入表的结构才能运行,在其他机器运行

1466227766155515.png

方法二 单步跟踪

载入后按f8,这个call就弹出记事本了,重新载入后按f7进入这个call

blob.png

有向上跳的jmp就直接运行到它的下一条语句

blob.png

单步看到popad,或者ret,大jmp就注意了,下面就跟我们的esp定律是一样的地方了

blob.png

跟着就ret到了oep,注意要删除分析哦

blob.png

方法三 两次断点

首先要设置好

blob.png

点击m按钮,就是查看内存的,我们在.rsrc下f2断点,之后shift+f9(好像是忽略异常运行)

blob.png

跟着再来到m那里,在第一个区段(这里是401000)下f2断点,shift+f9

blob.png

跟着单步,不知到为啥我的运行到mov就停止工作了

blob.png

都可以看到一个popad和jmp大跳转了,哎,怎么这样

blob.png

方法四 最后一次异常

首先取消忽略的异常

blob.png

跟着按shift+f9,忽略异常运行,但异常处还是会断下来,我们按了两次shift+f9就运行起来了,说明程序只有一次异常,那我们在这次异常处的se处理程序处下断(假如按了4次,那么就3次异常,按了3次后就在那个个se处理程序下断)

blob.png

跟着shift+f9,之后断在se处理程序的开头,把断点取消掉

blob.png

接下来就f8,发现大跳转,这个很可能就是了

blob.png

f8跟过去

blob.png

删除一下分析,明显的oep

blob.png

方法五 SFX

这好像是自动脱壳(自动查找oep),先设置一下

blob.png

设置完了后直接ctrl+f2重新载入就出现下图

blob.png

跟着就自动定位到了

blob.png

删除一下分析就行

blob.png

方法六 模拟跟踪

注意不同的方法od的设置,记得改回来,载入点击m按钮,输入命令tc eip < 01013000 (tc 跟踪进入直到满足条件)

blob.png

但这样会很慢,我们可以按之前两次断点法后再跟踪

blob.png

方法七 出口标志

直接搜索pushad对应的popad,注意不要搜索整个块

blob.png

跟着直接f4到popad

blob.png

f8几下,一个大跳转

blob.png

就到达了oep了

blob.png

有时不是第一个,可能是第5,第6个popad,如下面的Aspack

blob.png

方法八 秒到oep,一步直达

f9运行后,堆栈窗口直接拖到最下面,找函数栈帧的最上面的返回地址(返回地址上面的就是),看看是不是oep的样子

blob.png

反汇编跟随后向上拖,看看像不像oep

blob.png

向上拖还真发现了

blob.png

跟着下一个硬件执行断点

blob.png

右键下硬件执行断点

blob.png

重新载入,f9运行

blob.png

跟着用lordPE

blob.png

跟着选择完全脱壳后,打开importRE

blob.png

显示无效函数,删除掉无效的

blob.png

最后点击转存到文件,选择完整脱壳那个文件哦,成功

打赏作者
喜欢本博客,打赏让博客永久运行,多少你说了算

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注