首页
论坛
课程
招聘
[原创]yoda的壳脱壳笔记
2021-12-31 12:52 25455

[原创]yoda的壳脱壳笔记

2021-12-31 12:52
25455

脱壳之自定义壳

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

一、壳

(1)使用PEiD查看是否加壳及壳的情况,发现判断使用了yoda的壳

 

image-20211009110437093

 

查看节查看器

 

image-20211009110416886

 

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

 

image-20211009112811123

 

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

 

image-20211009135622896

 

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

 

image-20211009102246228

 

image-20211231113007037

 

查壳的两种方式:第一种通过检测壳的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进程轨迹

 

image-20211008164029667

 

从上图中看出该病毒复制自身并创建了一个不同名的子进程,该子进程又创建了一个子进程,随即删除自身。可知将自己重命名为audioshed.exe,并删除自身。接下来结束这个audioshed.exe进程,以防止产生恶意的操作。因此如果我们想要研究解包后的状态,很多创建进程的操作在用户层面都会调用的最底层API是CreateProcessInternalW。因而当我们去hook CreateProcessInternalW的时候,代码可能已经去除壳了

 

2、使用x32dbg动态调试

 

(1)在CreateProcessInternalW处右键选择切换断点,该位置为正在创建一个子进程,它正在进行解包,这可能是一个PE文件

 

image-20211008164858753

 

断点设置成功

 

image-20211008165116860

 

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

 

image-20211008165229607

 

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

 

image-20211229204042186

 

(4)将上面两个部分分别右键->follow in dump

 

第二部分如下所示,并没有迹象表明这是一个PE文件,它看起来更像是一个正在执行的代码。寻找PE的头部信息,整个PE文件被注入到内存中

 

image-20211009163659068

 

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

 

image-20211008175434912

 

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

 

image-20211229204949590

 

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

 

image-20211231110727043

 

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

 

image-20211231110653381

 

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

 

image-20211231110841585

 

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

 

image-20211231110940815

 

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

 

image-20211231111027002

 

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

 

image-20211231111055015

 

(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

image-20211230102138859

 

参数均为10进制

 

1)pid

 

image-20211231112446119

 

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

 

image-20211231111752333

 

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

 

image-20211231112619352

 

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

 

image-20211231112253579

 

函数对齐了字符串的引用,所有的导入表都可以显现。表明已正确对其了所有的内容

四、总结

通过Proexp寻找病毒停止状态时调用的API, 通过该API可以发现病毒在内存中脱壳时的状态。我们发现该病毒创建了一个子进程,因此给createprocessInternalW下断点,接下来在内存布局中寻找进程中特殊的可执行区域,然后得到一个PE文件,dump下该PE文件,对该PE文件进行反映射,之后使用import重建表来重建import


【看雪培训】目录重大更新!《安卓高级研修班》2022年春季班开始招生!

最后于 2021-12-31 13:11 被kanxue编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 577
活跃值: 活跃值 (414)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Silvia- 活跃值 2021-12-31 14:13
2
0
大佬,带带弟弟
雪    币: 426
活跃值: 活跃值 (174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
时生 活跃值 2021-12-31 14:16
3
0
Silvia- 大佬,带带弟弟[em_20][em_20][em_20]
你们都是大佬

雪    币: 27
活跃值: 活跃值 (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hishark 活跃值 2022-3-13 23:06
4
0
大佬能附上原文件动手试试就好了
游客
登录 | 注册 方可回帖
返回