脱壳之自定义壳
文章中涉及的恶意程序通过壳检测器并没有检测出壳的迹象,但是通过经验能感觉到被加壳了。这在自定义的壳中是非常常见的,这种壳通常是一次性定制的产品,因此没有通用的签名。很多查壳软件通过检测pid来判断壳的类型,但是很难给每种壳设置固定的签名,因而有些壳很难被检测出来
一、壳
(1)使用PEiD查看是否加壳及壳的情况,发现判断使用了yoda的壳

查看节查看器

(2)使用Exeinfo PE查看是否加壳,显示加壳

(3)使用Detect It Easy查看壳的情况,并未发现有壳的迹象。

(4)使用IDA打开DIFxAPI.exe显示


查壳的两种方式:第一种通过检测壳的pid,第二种为查看字符串文本和导入表
二、使用在线解包
https://www.unpac.me/results/3227e49a-2d4b-431d-be1d-ccd289cbb110
三、手动解包
1、使用Process Explorer查看进程信息
这是一个技巧,将Process Explorer.exe重命名为funfun.exe,因为有些恶意软件会通过检查Process Explorer字符串和正在运行的进程树来检查Process Explorer软件的存在。将DIFxAPI.exe复制一份副本DIFxAPI - 副本.exe,以防恶意软件运行后会有一个删除自身的行为。启动DIFxAPI - 副本.exe,在funfun.exe中查看DIFxAPI - 副本.exe进程轨迹

从上图中看出该病毒复制自身并创建了一个不同名的子进程,该子进程又创建了一个子进程,随即删除自身。可知将自己重命名为audioshed.exe,并删除自身。接下来结束这个audioshed.exe进程,以防止产生恶意的操作。因此如果我们想要研究解包后的状态,很多创建进程的操作在用户层面都会调用的最底层API是CreateProcessInternalW。因而当我们去hook CreateProcessInternalW的时候,代码可能已经去除壳了
2、使用x32dbg动态调试
(1)在CreateProcessInternalW处右键选择切换断点,该位置为正在创建一个子进程,它正在进行解包,这可能是一个PE文件

断点设置成功

(2)运行程序,程序在断点处会自动终止

(3)切换到内存布局,寻找标记为执行的受保护部分即ERW(E-执行,R-可读,W-可写),重点关注不在PE文件中被标记为E的部分,如下图所示红色方框中的两个部分,info信息为空,它仅仅是一个内存段,可被读和写,但不该被执行。【理由:在内存中执行需要被标记为可执行文件,可执行的PE文件会标记为E】

(4)将上面两个部分分别右键->follow in dump
第二部分如下所示,并没有迹象表明这是一个PE文件,它看起来更像是一个正在执行的代码。寻找PE的头部信息,整个PE文件被注入到内存中

第一个部分,从内存窗口中可以看出该部分包含PE的头部信息MZ,这是一个未被定义的被注入到内存中的PE文件,因此并没有被操作系统加载,仅仅被注入到这儿。它包含一个PE的头部信息并标记为E可执行,因此将该部分dump下来,进行更为详细的分析

(5)内存布局->将内存中转存到文件,将该PE文件dump下来,另存为默认文件名difxapi_00140000.bin

重点关注text部分,想要研究文件的实际内容。打开.text部分,发现全为0。接下来查看文件是否被映射。PE文件呈现这种格式有两种原因。一是磁盘上的文件,这是PE文件的标准格式并且所有的头部信息将匹配原始偏移量,因此原始偏移量意味着实际文件;二是当一个磁盘上的PE文件被映射到内存中并且被运行时,由原始地址转移为虚拟地址,分割了PE文件并将其注入到内存中,因为此时原始的地址指向内存中的地址,因此此时的原始格式全为0

(6)使用PE-bear打开dump出的PE文件即difxapi_00140000.bin,首先查看Section Hdrs发现两个数据表,一个重定位表,一个包含代码的文本部分

希望在该部分看到很多二进制代码,意味着为可执行的PE文件。一个简单且直接的方法是修改PE头部的原始地址去匹配虚拟偏移地址,这可能会导致该PE文件变的很大,但是我们仅仅想要在IDA中进行逆向分析,并不会去执行该PE文件,因而对分析的影响很小

接下来在Optional Hdr部分修改PE文件的基地址即PE文件实际加载到内存中的部分为从内存中拉取出来时的地址,即140000

查看.text的内容,发现.text区段非全为0,但是打开Imports表,发现依然有些问题

先暂时将修改后的文件中.text部分另存为difxapi_00140000_align.bin

(7)从内存中转储的 PE 重建导入地址表,使用自动化工具PyIATRebuild(https://github.com/OALabs/PyIATRebuild)
1
2
3
4
5
6
|
环境python2.
7.8
pip install winappdbg
pip install elfesteem
安装VCForPython27.msi(python2.
7
的C语言编译器)
【https:
/
/
github.com
/
reider
-
roque
/
sulley
-
win
-
installer
/
VCForPython27.msi】
pip install distorm3
|

参数均为10进制
1)pid

2)基地址即默认文件名中的140000,十六进制基地址转化成十进制基地址为1310720

3)OEP=Entry Point+基地址,并转换成10进制

重建地址表,虽然有个警告信息,但是不影响

函数对齐了字符串的引用,所有的导入表都可以显现。表明已正确对其了所有的内容
四、总结
通过Proexp寻找病毒停止状态时调用的API, 通过该API可以发现病毒在内存中脱壳时的状态。我们发现该病毒创建了一个子进程,因此给createprocessInternalW下断点,接下来在内存布局中寻找进程中特殊的可执行区域,然后得到一个PE文件,dump下该PE文件,对该PE文件进行反映射,之后使用import重建表来重建import