脱壳之加密壳

脱壳一般流程

  1. 信息搜集
    查看壳是什么是什么语言编写的,以及是什么类型的壳
    搜集到信息可以用于判断壳/OEP 的二进制特征或API特征
    vs2013特征:
    二进制特征 E8???E9
    API特征 GetSystemTimeAsFileTime
    vc6.0特征
    API特征 GetVersion
    Delphi特征
    GetModuleHandleA
  2. 找到OEP
    可以通过中调用的函数找到IAT表,并从中判断IAT表是否有被加密
    如果没有被加密就可以直接dump,并脱壳
  3. 解密IAT
    如果IAT被加密就需要根据壳的类型进行解密,在将进行dump

信息搜集

  1. 查壳
    首先我们在脱壳之前要知道壳使用什么语言编写,以及是什么类型的壳,所以第一步我们需要使用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,就完成了脱壳