VMProtect 壳保护 构造 ROP 链 DLL 内存加载 “白加黑” 多层内存解密 后门 免杀 远控
恶意后门利用多种免杀手段,可远控用户电脑 - 知乎 https://zhuanlan.zhihu.com/p/644588718
恶意后门利用多种免杀手段,可远控用户电脑
近期,火绒威胁情报系统监测到一款后门病毒正在快速传播,被激活后会通过远程服务器下载多个恶意文件并获取远端恶意代码,随后黑客可以进行截取受害者屏幕图像、远程控制受害者电脑等各种恶意操作。不仅如此,该病毒还使用多种手段来躲避安全软件的查杀,隐蔽性极强。目前,火绒安全产品可对上述病毒进行拦截查杀,请用户及时更新病毒库以进行防御。
火绒查杀图
该黑客团伙投递的文件名大部分与用户常用软件有关, 火绒安全实验室目前收集到其伪装的部分文件名如下图所示:
相关文件名
火绒工程师分析发现,该病毒使用了包括 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",获取特定标志位信息及域名字符串 http://yk.ggdy.com 后,便会对其发起连接请求。这里发送给 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 的下一步操作,可以执行包括远程控制在内的各种操作。(这里 http://ttkk.youbi.co 域名是错误的,末尾少了个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