脱壳之加密壳
脱壳一般流程
- 信息搜集
查看壳是什么是什么语言编写的,以及是什么类型的壳
搜集到信息可以用于判断壳/OEP 的二进制特征或API特征
vs2013特征:
二进制特征 E8???E9
API特征 GetSystemTimeAsFileTime
vc6.0特征
API特征 GetVersion
Delphi特征
GetModuleHandleA - 找到OEP
可以通过中调用的函数找到IAT表,并从中判断IAT表是否有被加密
如果没有被加密就可以直接dump,并脱壳 - 解密IAT
如果IAT被加密就需要根据壳的类型进行解密,在将进行dump
信息搜集
- 查壳
首先我们在脱壳之前要知道壳使用什么语言编写,以及是什么类型的壳,所以第一步我们需要使用PEID/ExeInforPE进行查壳,
由链接器版本6.0我们可以猜测,这个程序是vc6.0编写,所以在函数GetVersion中可能找到OEP
找到OEP
找到函数GetVersion并下断点
运行到断点处看右下角堆栈窗口观察函数返回地址
地址以7开头的都是系统代码
在没有重定位的情况下,主模块区域都是以4开头
找到OEP 查看IAT表,发现IAT表保存的地址,不大对
对IAT进行了加密,那么就要对IAT表下一个写入断点,然后重新跑起来,当对函数地址加密后,在写入的时候就会断下来,在函数的上面一般都可以找到加密的迹象,只是有时候代码会特别的多,很难找到
OEP中没有代码的样子
OD报错是因为,OEP处的代码是壳解密后生成的,所以要把OEP处的断点换成硬件执行断点,注意硬件断点一次最多只能下四个,所以一定要勤俭持家
第一次断下来的位置为壳进行加密的地方,所以需要继续F9,找到写入IAT的地方
这里可以看到对函数地址进行异或加密,并将地址保存到局部变量中,所以我们需要修改壳代码,删除异或代码,在获取到函数地址后,将其放入IAT中。
然后继续跑,断到OEP处
我们可以看到,IAT已经可以获取正常的函数地址了
从OEP处将文件dump下来
使用工具importREC修复IAT表
最后选择转储到文件选择之前dump的exe,就完成了脱壳