VMProtect 壳保护 构造 ROP 链 DLL 内存加载 “白加黑” 多层内存解密 后门 免杀 远控

恶意后门利用多种免杀手段,可远控用户电脑 - 知乎 https://zhuanlan.zhihu.com/p/644588718

恶意后门利用多种免杀手段,可远控用户电脑

 
42 人赞同了该文章

近期,火绒威胁情报系统监测到一款后门病毒正在快速传播,被激活后会通过远程服务器下载多个恶意文件并获取远端恶意代码,随后黑客可以进行截取受害者屏幕图像、远程控制受害者电脑等各种恶意操作。不仅如此,该病毒还使用多种手段来躲避安全软件的查杀,隐蔽性极强。目前,火绒安全产品可对上述病毒进行拦截查杀,请用户及时更新病毒库以进行防御。

火绒查杀图

 

该黑客团伙投递的文件名大部分与用户常用软件有关, 火绒安全实验室目前收集到其伪装的部分文件名如下图所示:

相关文件名

 

火绒工程师分析发现,该病毒使用了包括 VMProtect 壳保护、构造 ROP 链、DLL 内存加载、“白加黑” 、多层内存解密等多种技术来躲避安全软件的查杀,因此,火绒安全提醒用户不要轻易点击来历不明的文件,建议先查杀后再使用。

 

注:“ROP (返回导向编程) ” 是一种将栈上写入的 shellcode 指令串联起来,使其能作为函数被已加载指令调用的一种手段。

 

一、样本分析

本次分析的病毒执行流程如下所示:

病毒执行流程

 

该病毒类型随着时间线推进,分别使用了 UPX、VMP 等保护壳,而目前监测到最新的版本为无壳版本,可见作者仍在积极开发测试当中:

加壳情况

 

病毒首先在栈中开辟大块区域写入代码,该代码块随后作为 EnumFontsW 的回调函数被执行。这种通过记录栈中的可执行流(ROP)的方式可以绕过数据执行保护(DEP),增强其隐蔽性。

栈中记录代码

 

获取栈中展开的代码后发现内嵌了一个 DLL 文件,该 DLL 在内存中自加载,并调用其唯一的导出函数 make,这种加载方式能使其无法通过 ProcessExplorer 等软件检测出加载的行为,进一步增强了免杀效果。

DLL 内存加载

 

在 make 函数的执行过程中,其会先判断当前执行的文件名是否包含预定义数字,这些数字目前理解有两个含义:回连标志和单独执行标志。执行流程图如下所示:

执行流程图

 

1:第一个是回连标志,当包含特定的数字(回连标志)时,其会从 C2 下载相应的 jpg 文件并重命名为 md.jpg,分别存放在 "C:\Users\Public\" 和 "C:\Users\Public\Documents\" 目录下以供后续使用。

下载指定 jpg 文件

 

每一个下载的 jpg 文件实际上都是一个 shellcode,不同的 jpg 文件在代码层上都是统一的,但是在数据段中有着不同的回传 IP 和 C2 域名,所以称其为回连标志。(该类 shellcode 将在后面分析,每个 jpg 所含有的 IP 在附录中可查)

jpg(shellcode) 文件解析

 

2:第二个是单独执行标志,当程序不具备单独执行标志(这里是 "16116")时,其必须先拥有 md.jpg 文件,然后再下载其他恶意文件。这些病毒文件会分别存放到不同的位置中,包括 :

  • "C:\Users\Public\Documents" 目录下 ttd.exe、UnityPlayer.dll
  • “C:\Users\Public\” 目录下 zd.exe、md.exe、zd.jpg
其它文件下载

 

分类执行:

根据 make 函数中的执行逻辑可知,所下载的恶意文件分成 3 大部分:

第一部分:zd.exe (单独线程执行,内存加载 zd.jpg)

第二部分:md.exe(单独线程执行,内存加载 md.jpg(如果有的话))

第三部分:Documents 下的 ttd.exe、UnityPlayer.dll (设置隐藏属性,暂时保留)

分别执行

 

第一部分——zd.exe:

zd.exe 是一个由 Rust 编写的恶意加载程序,用于将一同下载的 zd.jpg 作为 shellcode 加载并执行:

由 Rust 编写

 

在 zd.exe 内部也存在着 PDB 路径,许多调试符号,有意义的字符串等信息可以验证分析:

字符串等验证信息

 

zd.jpg 作为 shellcode 被加载执行,在代码与数据之间,病毒作者以 codemark 作为分界线。在数据区中,前面部分字节被赋予了特定的含义,有用作函数参数的,有用于作为执行条件的,称其为标志位区。后面有可直接使用的域名信息,称其为字符串区。最后是待解密使用的字符,称其为解密数据区(在后面会使用)。

shellcode 加载

 

当定位到分隔符 "codemark",获取特定标志位信息及域名字符串  后,便会对其发起连接请求。这里发送给 C2 的 "64" 猜测是要求回传 64 位的代码,由此也可进一步猜测有 32 位版本。

从 C2 下载恶意代码

回传代码部分:

C2 对指令的响应可能在不同的时间有着不同的下发代码,也可能还存在别的响应指令,这里仅讨论本次下发的代码内容。本次下发的恶意代码进行了包括屏幕截图,注册表读取,保持回连等操作。详细分析如下:

本次接收的代码依旧处于加密状态,在解密运算中,从 E byte 位开始为待解密信息,解密计算从 0 偏移处开始算起,解密逻辑如下。

解密回传代码

 

然而,在解密后的代码中发现里面还嵌套着两个 DLL 文件,并且是递归嵌套,下图并未展示嵌套关系:(在母 DLL 里面还嵌套着子 DLL 文件,但子 DLL 并未执行)。

DLL 嵌套

 

在执行过程中,其会先后执行内嵌母 DLL 的 dllmain 函数和 load 函数:

回传代码执行

 

虽然该 DLL 有 3 个导出函数,并且 run 和 zidingyixiugaidaochuhanshu(喻指自定义修改导出函数)并未执行,但是它们所作的操作都围绕着两个点:

  • 第一个是获取并修改前面 zd.jpg 待解密数据区中数据进行解密并与注册表中 IP 数据相关联。

这部分代码将 shellcode 末尾加密数据的特定字符进行包括字符替换等解密方式后,得到一个类似于域名,时间,路由消息组成的以 "|" 分隔的关键字串,猜测是想创建并写入注册表 IpDate 中进行后续提取利用。

shellcode 末尾数据区解密

 

  • 第二个是开启两个后台线程,一个是屏幕截图,另一个是保持回连。

屏幕截图所在的线程先会获取系统目录 "C:\ProgramData",然后在该目录下创建 quickScreenShot 文件夹,以当天日期创建分类文件夹,最后把拍摄的屏幕数据以 "日期时间" 的命名方式写入并保存。

获取屏幕截图

 

在进行屏幕截图的过程中,另一个保持回连的线程也会同步开启,但该线程会先休眠整整60分钟:

进程休眠

 

之后会进行代码解密操作,以 hackbrian 作为 key 执行解密算法:

代码解密

 

解密后的代码与前面分析的 shellcode 同类,用于等待 C2 的下一步操作,可以执行包括远程控制在内的各种操作。(这里  域名是错误的,末尾少了个m,怀疑由作者的疏漏导致)。

内嵌加密 shellcode

 

最后在该内嵌 dll 的字符串中发现有 "上线模块.dll",猜测会在后续阶段的由 C2 下发。

上线字符串

第二部分——md.exe

md.exe 也是由 rust 编写,经过逻辑对比发现其与 zd.exe 一致, 代码字节也是相同,故不再重复分析。

逻辑对比图

 

代码字节对比图

 

第三部分——ttd.exe 和UnityPlayer.dll

ttd.exe 在本次样本分析属于第三部分,并未被启动运行,怀疑是在开发中或暂时保留以备后续操作的模块,这里出于安全研究的目的继续对其进行分析。

病毒作者在这里利用了白加黑手法,通过合法的 ttd.exe 加载携带恶意代码的 UnityPlayer.dll 躲避查杀,该 dll 在被加载时也会 "变相" 执行 shellcode 中的代码进行后续操作。

其先进行文件复制,把 "C:\Users\Public\Documents\md.jpg" 复制成 "C:\Users\8.jpg" :

文件复制

 

然后执行打开本地画板程序 mspaint.exe,以进程注入的方式在其内存空间中开辟适当空间,并写入 jpg 中的 shellcode 代码,随后调用 CreateRemoteThread 进行远程线程执行。

进程注入

 

加载并写入 shellcode

 

shellcode 的后续执行部分在前面已详细叙述,这里不再重复分析。

 

二、附录:

C&C

 

HASH

 

发布于 2023-07-19 18:01・IP 属地北京

 

 

posted @ 2023-12-04 10:23  papering  阅读(339)  评论(0编辑  收藏  举报