目录
基本很多程序都是加了壳的,简单来说就是加密了的,程序运行时先运行解密程序,解密完成再跳到程序开始处运行,这就相当于在代码外面加了“保护壳”
脱壳就是一般解密完成后,直接从内存保存到一个文件
方法一 ESP定律
其实这个很多教程也没有说清楚到底是为什么,下面我尝试说一下,核心的一点就是它利用的是堆栈平衡原理,pushad之前和popad之后栈的状态是一样的
首先查下壳
一开始有个pushad,就是将od右上角的八个寄存器入栈,那么当程序解密完毕,肯定有个对应的popad,将八个寄存器还原
刚载入时如下图,注意栈的状态
下面这个是执行完popad时候栈的状态,可以看到是一样的,
f8一下,可以看到寄存器的值都入栈了
那么popad之前栈的状态跟上图是一样的
因为popad要访问栈的这8个dword,那么我们只要在其中一个字节,字或双字下个硬件访问断点就行了
f9运行,跟着f8到遇到返回或jmp,跟着就到达以oep,一般是显示db数据
当然od有插件,但不好用,就是不成功咯,有时,一般用下面的lordPE,但插件可以用于计算oep的相对虚拟地址
最后用importREC修复一下导入表,据说是因为在内存中IAT是当前机器API的实际地址,我们要修复导入表的结构才能运行,在其他机器运行
方法二 单步跟踪
载入后按f8,这个call就弹出记事本了,重新载入后按f7进入这个call
有向上跳的jmp就直接运行到它的下一条语句
单步看到popad,或者ret,大jmp就注意了,下面就跟我们的esp定律是一样的地方了
跟着就ret到了oep,注意要删除分析哦
方法三 两次断点
首先要设置好
点击m按钮,就是查看内存的,我们在.rsrc下f2断点,之后shift+f9(好像是忽略异常运行)
跟着再来到m那里,在第一个区段(这里是401000)下f2断点,shift+f9
跟着单步,不知到为啥我的运行到mov就停止工作了
都可以看到一个popad和jmp大跳转了,哎,怎么这样
方法四 最后一次异常
首先取消忽略的异常
跟着按shift+f9,忽略异常运行,但异常处还是会断下来,我们按了两次shift+f9就运行起来了,说明程序只有一次异常,那我们在这次异常处的se处理程序处下断(假如按了4次,那么就3次异常,按了3次后就在那个个se处理程序下断)
跟着shift+f9,之后断在se处理程序的开头,把断点取消掉
接下来就f8,发现大跳转,这个很可能就是了
f8跟过去
删除一下分析,明显的oep
方法五 SFX
这好像是自动脱壳(自动查找oep),先设置一下
设置完了后直接ctrl+f2重新载入就出现下图
跟着就自动定位到了
删除一下分析就行
方法六 模拟跟踪
注意不同的方法od的设置,记得改回来,载入点击m按钮,输入命令tc eip < 01013000 (tc 跟踪进入直到满足条件)
但这样会很慢,我们可以按之前两次断点法后再跟踪
方法七 出口标志
直接搜索pushad对应的popad,注意不要搜索整个块
跟着直接f4到popad
f8几下,一个大跳转
就到达了oep了
有时不是第一个,可能是第5,第6个popad,如下面的Aspack
方法八 秒到oep,一步直达
f9运行后,堆栈窗口直接拖到最下面,找函数栈帧的最上面的返回地址(返回地址上面的就是),看看是不是oep的样子
反汇编跟随后向上拖,看看像不像oep
向上拖还真发现了
跟着下一个硬件执行断点
右键下硬件执行断点
重新载入,f9运行
跟着用lordPE
跟着选择完全脱壳后,打开importRE
显示无效函数,删除掉无效的
最后点击转存到文件,选择完整脱壳那个文件哦,成功