壳的分类
压缩壳:减小程序体积
加密壳:通常配合压缩壳,导致程序体积增大
UPX、ASPack注重压缩代码
VMP、ASProtect注重保护代码
脱壳方法
静态法
使用脱壳工具 upx -d
动态法
OEP
oep:orignal entry point:未加壳的程序的真正的入口点,是手动脱壳的目标。
一般加壳程序在使用Ollydbg等动态调试工具时,会停在壳的预处理块。即处在对于程序原始代码块的解压或解密操作之前,在运行完程序自脱壳模块后,会停留在程序加壳之前的OEP位置,此时是dump程序的最佳时期。脱壳时在真实OEP处下int3断点,就可以捕捉到程序代码段完全恢复的状态。因此,寻找加壳程序的正确OEP,也成了手动脱壳时的第一要务。
IAT(导入地址表)
导入被程序调用但其执行代码不在程序中的函数。这些函数代码位于一个或多个DLL(动态链接库)中。当PE文件被装入内存的时候,Windows装载器才能装入DLL,并将调用导入函数的指令和函数实际所处的地址联系起来(动态链接),这些操作就需要导入表完成。其中导入表的地址就是函数实际地址。
多数加壳软件在运行时会重新导入地址表,因此获取加壳程序正确的导入地址表是手动脱壳的关键。
脱壳方法
1、单步跟踪法
完整运行脱壳程序,跳过循环恢复代码的片段,边调试边观察,确保程序不会略过EOP,让软件实现自动脱壳
要点:
- 跟踪过程是不修改任何代码的
- 使用F7[单步步入]、F8[单步步过]、F4[直接执行到指定位置]等功能完整的进行自脱壳的过程
- 大循环用f4跳过,尽量实现向下jmp
- 函数载入不远处的call一般选择f7步入
- 一般如果jmp到很远的地址,那极有可能就是跳到原程序入口(EOP)
2、ESP定律法
原理是运用程序中的堆栈平衡来实现。
大多壳开始会使用pushad来保存寄存器,在pushad保存好寄存器后,对esp下硬件断点,之后直接f9运行,就会到达最后的popad,硬件断点就会触发。
硬件断点与软件断点的区别:
硬件断点由调试寄存器的值来控制,它是看地址来下断点和判断与触发断点的,而软件断点是看指令根据指令来下断点和判断断点来触发的
要点:
- 程序开始pushad/pushfd
- 在pushad/pushfd压栈后设置ESP硬件断点
- F9运行
- 删除断点后即可分析
Xdbg
找到正常的函数位置
按F8单步执行pushad指令
设置硬件读取断点:在内存窗口/栈窗口中选定目标地址,单击右键,在快捷菜单中选择“断点——硬件断点,访问”,选择字节数
设置完成,按F9运行程序,再次中断在一个不同的地址
硬件断点已经完成了使命,现在删除断点,防止后续触发
将光标移动到最后的jump,按F4,使程序执行到光标处
按F8执行跳转,此时出现了正常函数的开头和结尾。
对程序进行dump
选择”插件——Scylla“
点击IAT Autoserch之后,点击dump
导出文件后,即可得到脱壳的文件
3、一步到达OEP法
找到离OEP或大jmp近的popad,下int3断点,然后直接运行到断点处实现脱壳
要点
- ctrl+f查找popad
- ctrl+l跳到下一匹配处,选择确认正确的popad位置,下断点运行到该处
- 只适用于极少数壳
4、内存镜像法(待完善)
适用于APSack加密
原理
在程序自解压或解密时会先访问程序资源段,自动脱壳后转回程序代码段,所以我们现在程序资源段下一个断点,运行完后又在代码段下一个断点运行
要点
- 菜单的选项—>调试选项—>异常—>勾选所有的忽略异常
- alt+m打开内存镜像,找到程序的第一个.rsrc,F2下断点,shift+f9运行到断点
- alt+m在第一个.rsrc上面的.text地址F2下断点,然后shift+f9
5、最后一次异常法(待完善)
原理
程序自解压或自解密过程可能会触发很多异常,最后一次异常是很接近自动脱壳完成的地方,所以我们可以想办法给最后一个异常处下断点
要点
Ollydbg 选项—>调试异常—>异常,将所有✔消掉,ctrl+f2重新加载程序
开始程序是一个跳转,按shift+f9,直到程序运行,要记录按shift+f9的次数m
ctrl+f2重新加载程序,按m-1次shift+f9,OD右下角的框里会看到”SE句柄”,ctrl+g,输入SE句柄前的地址
在地址上按f2下断点,shift+f9来到断点,f8跟踪
6、SFX法
Ollydbg自带的OEP寻找功能,找到后直接停在OEP处
要点
- OD异常选项卡都打上勾
- 同一框内的SFX选项卡选择 “字节模式跟踪实际入口 (速度非常慢)”
- 重新加载程序(如果跳出是否 “压缩代码?” 选择 “否”, OD 直接到达 OEP)
Dump及IAT重建
在脱壳找到OEP后,我们需要将程序dump出来,并重建IAT
[逆向学习1-脱壳技术]/篇1_逆向脱壳-CSDN博客