文章中涉及的恶意程序通过壳检测器并没有检测出壳的迹象,但是通过经验能感觉到被加壳了。这在自定义的壳中是非常常见的,这种壳通常是一次性定制的产品,因此没有通用的签名。很多查壳软件通过检测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)
参数均为10进制
1)pid
2)基地址即默认文件名中的140000,十六进制基地址转化成十进制基地址为1310720
3)OEP=Entry Point+基地址,并转换成10进制
重建地址表,虽然有个警告信息,但是不影响
函数对齐了字符串的引用,所有的导入表都可以显现。表明已正确对其了所有的内容
通过Proexp寻找病毒停止状态时调用的API, 通过该API可以发现病毒在内存中脱壳时的状态。我们发现该病毒创建了一个子进程,因此给createprocessInternalW下断点,接下来在内存布局中寻找进程中特殊的可执行区域,然后得到一个PE文件,dump下该PE文件,对该PE文件进行反映射,之后使用import重建表来重建import
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-12-31 13:11
被kanxue编辑
,原因: