前言
去年暑假,学习了如何脱壳,但是没有深入的了解这一块的知识,现在花费差不多三天的时间总结一下。
UPX壳
单步法
程序流程不断向下,然后遇到POPAX,接着一个段间跳转后,直达EOP。
ESP定律法
程序在运行真正代码前会解密已经压缩过的代码,解压程序将一些关键代码数据压栈,解压完成后,解压程序在将这些代码出栈。在压栈出栈处下硬件断点,如果执行,程序必定断在解压完成后的代码前。这就是ESP定律法,主要利用程序运行中,栈指针保持平衡。
二次内存镜像法
第一次将断点设置在代码段reloc资源节区是为了让加壳程序执行完解压过程,第二次将断点设置在代码段是为了寻找EOP。
一步直达法
这个方法适用于UPX和部分北斗的壳,这部分壳在压缩的时候,使用了POPAP和PUSHAP这两个指令。
ASPACK壳
单步法
ESP定律法
二次内存镜像法
一步直达法
模拟跟踪法
针对ASPACK壳
SFX法
NSPACK
NSPACK又名北斗,是病毒木马经常使用的压缩壳,本身使用vc写的。跳入oep的特征是:
|
|
单步法
ESP定律法
二次内存镜像法
注意,在使用这个方式的时候,由于NSPACK没有压缩资源,也就是没有资源节区,所以直接在text节区下断即可!
一步直达法
模拟跟踪法
SFX法
FSG壳
单步法
ESP定律法
适用于FSG的特殊方法
运行完popad后,寻找堆栈窗口第四个参数,那个就是oep。
修复FSG造成的导入表丢失问题
在完成之前的修复后,发现还是无法运行程序,可以考虑修复导入表信息。
PECompact2.X
单步法
这个壳用了一个巧妙的方法,把它解压代码放入异常处理例程中了,我们直接跟入处理例程,程序会自动回到用户领空。
ESP定律法
BP VirtualFree法1
这个方法利用了是解密解压缩过程中,需要对内存进行释放。在此下断的好处是能够在程序解压缩之后断下。
- BP VirtualFree下断点
- shift+f9,忽略异常运行(存在异常)
- 取消断点,返回到用户领空
- 搜索命令:push 8000
- F4运行到此处,单步即可
BP VirtualFree法2
第一次做代码的恢复,第二次更想是IAT的导入。
bp VirtualAlloc法1
在为解压出来的代码分配内存空间,所以可以对VirtualAlloc下断。
- bp VirtualAlloc
- shift+F9
- ALT+F9返回用户代码
- 单步
PECompact使用的特殊方法(1)
最后一次异常法
假设程序在第m次运行跑飞,我们查看第m-1次的堆栈情况。
- 把所有忽略异常取消
- shift+F9运行程序
- 取m-1次的堆栈里面的SE函数
- 在SE函数开始处下断。
- 单步
EZIP壳
单步法
ESP定律法
修复文件
tElock 0.98b1壳
最后一次异常法
加壳程序通常在程序执行的开始部分采用SEH技术进行异常的处理为了获取程序控制权,而最后一次异常是为了将程序控制权交给程序本身,这就是最后一次异常法的基本原理。需要注意一下方面:
模拟跟踪法
两次内存镜像法
exe32pack壳
ESP定律法
WinUpack壳
单步法
这个壳有个特点:程序在完成代码的解压后,并不直接进入oep,而是执行完IAT的重构后,跳转到判断是否完成IAT重构的判断中,然后执行是否跳转OEP。
- 根据跳转的条件判断:eax==0的时候跳转成功。设置条件断点即可!!
常见语言的入口点
|
|