SmokeLoader加载器的全面分析——典型加载器家族系列分析三
时间 : 2025年04月30日
加载器系列分析报告引言
随着网络攻击技术的不断演变,恶意代码加载器逐渐成为恶意代码执行的关键组成部分。此类加载器是一种用于将各种恶意代码加载到受感染的系统中的恶意工具,通常负责绕过系统安全防护,将恶意代码注入内存中并执行,为后续的特洛伊木马类型恶意代码的部署奠定基础。加载器的核心功能包括持久性机制、无文件内存执行以及多层次规避技术。
安天CERT将近几年历史跟踪储备的典型恶意加载器家族有关信息汇总成专题报告,并持续追踪新的流行加载器家族。本项目专题将聚焦加载器技术细节,深入挖掘其在攻击链中的核心功能,包括其混淆技术、加密机制以及注入策略等。此外,我们也会不断完善自身安全产品能力,采取有效技术方案进一步提升针对加载器的识别率和准确率,帮助用户组织提前发现并阻止潜在威胁。
1.概述
SmokeLoader是一个具有插件功能的恶意程序加载器,最初于2011年在暗网上进行销售,从2014年开始专供俄罗斯黑客进行使用。SmokeLoader主要通过钓鱼邮件进行传播,并通过带有恶意VBS宏的doc文档进行运行。SmokeLoader本体仅具有加载功能,但通过插件,SmokeLoader可以进行窃密、远控等行为[1],对用户的隐私构成严重威胁。此外SmokeLoader作为加载器,还会投递其他恶意程序,进一步危害用户的系统安全。
为了规避检测,SmokeLoader从运行环境、运行模块和硬件信息等方面进行了细致的环境检测。SmokeLoader还通过增加运行阶段,将不同功能的载荷进行分离,既增加了加密层数,又减少了后续阶段代码带来的特征,以干扰安全人员对其进行分析和检测。SmokeLoader还通过加密常量及函数,手动加载ntdll等手段,进一步隐藏自身行为及特征,增加隐蔽性。当SmokeLoader成功运行后,还会持续监控应用列表,关闭运行中的分析工具,以阻碍分析人员对其行为进行监控。这些反调试手段大大增加了SmokeLoader的隐蔽性,使其安装后难以被发现,发现后难以被分析,让SmokeLoader成为十年来臭名昭著的威胁之一。
该加载器详细信息参见安天病毒百科[2] 。
图1-1 长按识别二维码查看SmokeLoader加载器详细信息
2. SmokeLoader加载器生存技术举例分析
2.1 加密技术分析
SmokeLoader通过异或和RC4算法对不同阶段数据和代码进行加密,并根据加密内容的不同使用了不同的密钥生成方式。
图2-1 SmokeLoader解密代码
2.2 反调试技术分析
SmokeLoader通过检测调试特征、获取进程列表等多种方式,检测沙箱、虚拟机与调试器,以避免自身在分析环境中运行。
表2-1 SmokeLoader反调试技术列表
反沙箱 |
检测SetErrorMode行为差异判断沙箱 |
检测是否被注入沙箱DLL(sbiedll、aswhook、snxhk) |
|
反虚拟机 |
检测IDE和SCSI设备信息判断是否为虚拟机 |
检测是否具有虚拟机相关进程 |
|
检测是否加载虚拟机相关系统模块 |
|
反调试 |
检测PEB的BeingDebugged变量是否置1 |
检测PEB的NtGlobalFlag变量是否为0x70 |
|
检测系统是否允许测试签名或开启调试模式 |
|
定期搜索窗口名称和进程名以关闭调试程序 |
2.3 反挂钩技术分析
SmokeLoader会将ntdll通过MapViewOfFile映射进内存并重新获取ntdll相关函数地址,以避免函数被hook。
图2-2 SmokeLoader将ntdll映射到0x21A0000地址空间
2.4 注入技术分析
SmokeLoader会根据系统解密并加载32位或64位载荷。
图2-3 SmokeLoader根据系统加载不同位数载荷
随后通过RtlCreateUserThread注入到explorer中进行执行。
图2-4 SmokeLoader通过注入到explorer中创建新线程
2.5 持久化技术分析
SmokeLoader会尝试将载荷复制到APPDATA或TEMP目录下,删除Zone.Identifier标记并设置系统属性和隐藏属性,并修改文件时间戳进行隐藏。
图2-5 SmokeLoader将自身复制到APPDATA下并进行伪装
之后SmokeLoader会创建计划任务以完成持久化。
图2-6 SmokeLoader创建计划任务实现持久化
3.攻击流程
SmokeLoader加载共分为五个阶段,第一阶段会将第二阶段载荷解密,映射进内存并执行。第二阶段在第一阶段的基础上增加了解压功能。在第三阶段,SmokeLoader会执行反沙箱的操作,如果运行环境没有异常,则解压并执行SmokeLoader第四阶段。在第四阶段,SmokeLoader会进行反调试、反沙箱、反hook、反虚拟机等操作,并会检查使用者地理位置,同时SmokeLoader还会检查当前程序完整性级别,如果等级过低则会进行提取操作。当完成全部操作后,SmokeLoader将会执行第五阶段。在第五阶段,SmokeLoader会创建线程用于检测调试程序,一旦发现则将其关闭。同时SmokeLoader还会在第五阶段完成持久化操作,并连接C2,加载插件并投递其他恶意程序。
图3-1 SmokeLoader加载流程
4.样本分析
4.1 样本标签
表4-1 SmokeLoader样本标签
病毒名称 |
Trojan/Win32.SmokeLoader |
MD5 |
C56489FED27114B3EAD6D98FAD967C15 |
处理器架构 |
Intel 386 or
later processors and compatible processors |
文件大小 |
191 KB (196,096 字节) |
文件格式 |
BinExecute/Microsoft.EXE[:X86] |
时间戳 |
2024-05-27 03:07:49 |
数字签名 |
无 |
加壳类型 |
无 |
编译语言 |
Microsoft Visual
C/C++(15.00.21022) |
VT首次上传时间 |
2024-12-16 16:27:58 |
VT检测结果 |
33/72 |
4.2 SmokeLoader第一阶段
SmokeLoader使用特定种子的随机数序列异或解密并运行第二阶段载荷。
图4-1 SmokeLoader解密第二阶段载荷
4.3 SmokeLoader第二阶段
在第二阶段,SmokeLoader会使用和第一阶段相同的异或算法解密第三阶段载荷,在解密完成后会根据配置对载荷进行解压操作,随后运行第三阶段载荷。
图4-2 SmokeLoader解密并解压第三阶段载荷
4.4 SmokeLoader第三阶段
在第三阶段,SmokeLoader会通过SetErrorMode检查是否在沙箱中运行。
图4-3 SmokeLoader检测是否在沙箱中运行
在第三阶段,SmokeLoader会将下一阶段载荷覆盖到当前主进程地址空间中运行第四阶段载荷。
图4-4 SmokeLoader加载第四阶段载荷
为了反自动化分析,SmokeLoader将函数导入表、资源表和重定向表的地址和大小单独储存,在加载时进行修复。
图4-5 SmokeLoader修复directory
4.5 SmokeLoader第四阶段
在第四阶段,SmokeLoader会通过PEB的BeingDebugged变量检查调试器。
图4-6 SmokeLoader通过BeingDebugged检测调试器
SmokeLoader会通过PEB的NtGlobalFlag变量再次检查调试器。
图4-7 SmokeLoader通过NtGlobalFlag检测调试器
SmokeLoader会在执行时解密使用到的函数,在使用结束后重新加密。
图4-8 SmokeLoader临时解密代码
SmokeLoader会将哈希表以及下一阶段的载荷进行加密,在运行时进行解密。
图4-9 SmokeLoader解密函数
SmokeLoader会通过键盘布局判断运行地区,如果满足特定条件则不继续运行。
图4-10 SmokeLoader判断键盘布局
SmokeLoader会检测当前程序完整性级别,如果小于中完整性,则会通过wmic重启进程进行提权。
图4-11 SmokeLoader检测程序完整性级别
SmokeLoader会将ntdll映射进内存并重新获取ntdll相关函数地址,以避免函数被hook。
图4-12 SmokeLoader手动加载ntdll
SmokeLoader会通过检查系统的完整性设置检测系统是否允许测试签名或开启了调试模式。SmokeLoader还通过NtQueryInformationProcess检查是否拥有调试端口判断是否被附加调试器。
图4-13 SmokeLoader检测调试器
SmokeLoader会检查自身是否被注入特定的DLL来检测沙箱。
图4-14 SmokeLoader通过检测DLL的方式检测沙箱
SmokeLoader会通过注册表枚举IDE和SCSI设备信息,检查其中是否包含特定关键字来检测虚拟机。
图4-15 SmokeLoader通过检测设备检测虚拟机
SmokeLoader会通过检测进程的方式检测虚拟机。
图4-16 SmokeLoader通过检测进程检测虚拟机
SmokeLoader通过枚举系统模块检测虚拟机。
图4-17 SmokeLoader检测系统模块来检测虚拟机
当完成所有检测后,SmokeLoader会判断系统位数,并根据检测结果运行相应的载荷。
图4-18 SmokeLoader检测系统位数
最后SmokeLoader会将下一阶段的载荷注入进explorer.exe中,并通过创建新线程的方式执行下一阶段载荷。
图4-19 SmokeLoader运行第五阶段载荷
其中第五阶段载荷的DOS头和NT头的标志位被销毁,由SmokeLoader手动解析PE结构并映射进内存。
图4-20 销毁DOS头和NT头标志位的第五阶段载荷
4.6 SmokeLoader第五阶段
在第五阶段,SmokeLoader会在初始化期间创建新线程,用于持续检测系统的进程列表,如果检测到调试程序则将其关闭。
图4-21 SmokeLoader检测进程关闭调试程序
SmokeLoader会检测窗口名称,如果发现调试程序则将其关闭。
图4-22 SmokeLoader检测窗口关闭调试程序
其中检测的部分程序如下:
表4-2 SmokeLoader环境检测列表
进程名称 |
autoruns |
procexp |
procexp64 |
procmon |
procmon64 |
tcpview |
wireshark |
ollydbg |
|
x32dbg |
x64dbg |
idaq |
idaw |
|
idaq64 |
idaw64 |
|
|
|
进程窗口 |
autoruns |
PROCMON_WINDOW_CLASS |
ollydbg |
WinDbgFrameClass |
在完成初始化后,SmokeLoader会将父进程复制到APPDATA目录下,如果未能获取APPDATA目录,SmokeLoader则会将其复制到TEMP目录下。
图4-23 SmokeLoader选择目录
复制完成后,SmokeLoader将会删除其Zone.Identifier标记以避免产生安全警报。
图4-24 SmokeLoader删除Zone.Identifier标记
SmokeLoader会将复制的文件设置系统和隐藏属性,并伪装文件时间信息使其与advapi32.dll相同。
图4-25 SmokeLoader隐藏文件
最后SmokeLoader创建计划任务完成持久化,其中计划任务创建者与用户名相同,任务名称伪装为Firefox Default Browser Agent。任务具有两个触发器,其中一个每10分钟触发一次,另一个触发器在用户登录时触发。
图4-26 SmokeLoader创建计划任务
完成持久化后,SmokeLoader会先后向C2发送10001、10002和10003指令,并根据返回的数据执行不同的功能。在获取指令的过程中,SmokeLoader会将系统版本、电脑名称、磁盘序列号、SmokeLoader版本、ID和运行的完整性级别发送到C2服务器。其中指令列表如下:
表4-3 SmokeLoader指令列表
请求指令号 |
返回指令号 |
功能 |
10001 |
105 |
获取SmokeLoader插件,并通过10002指令获取载荷并运行 |
114 |
卸载SmokeLoader |
|
117 |
通过10002指令获取载荷,运行后结束进程 |
|
其他 |
根据返回值,通过10002指令获取n次载荷并运行 |
|
10002 |
1 |
指示载荷为exe程序,应保存到temp文件夹并通过CreateProcessInternalW运行 |
2 |
指示载荷为dll,应保存到temp文件夹并通过LoadLibraryW运行 |
|
3 |
指示载荷为dll,应保存到temp文件夹并通过regsvr32运行 |
|
4 |
指示载荷应通过载入自身内存的方式运行 |
|
5 |
指示载荷为bat,应保存到temp文件夹并通过ShellExecuteW运行 |
|
10003 |
无 |
上报载荷运行结果 |
当完成与C2的通信后,SmokeLoader创建一个explorer进程,并通过篡改程序入口点汇编的方式运行C2下发的插件。
图4-27 SmokeLoader运行插件
5.IoCs
IoCs |
C56489FED27114B3EAD6D98FAD967C15 |
2AD41EC1178D897AD1E1A268E36E46C7 |
115DABE16A3C04545E0C838A1EAD826D |
86B51400A85E24992157572B3BABA111 |
34B804FE1D7DD4F7B8A7F90A26B2B043 |
843D55B01492A467CCACDC0CC93EB7E8 |
6.样本对应的ATT&CK映射图谱
图6-1 技术特点对应ATT&CK的映射
具体ATT&CK技术行为描述表:
表6-1 ATT&CK技术行为描述表
ATT&CK阶段/类别 |
具体行为 |
注释 |
持久化 |
利用计划任务/工作 |
通过计划任务实现持久化 |
提权 |
滥用提升控制权限基址 |
通过wmic启动进程以提升完整性级别 |
防御规避 |
规避调试器 |
通过BeingDebugged、NtGlobalFlag和NtQueryInformationProcess检测调试器 |
通过检查系统完整性级别以避免内核级别调试器 |
||
会持续检查进程以及程序窗口并关闭调试器 |
||
修改文件和目录权限 |
通过删除Zone.Identifier标记防止产生安全警报 |
|
反混淆/解码文件信息 |
使用压缩以及异或算法加密不同阶段载荷 |
|
隐藏行为 |
通过手动加载ntdll以防止被hook |
|
在持久化过程中会将文件添加隐藏和系统属性 |
||
在持久化过程中会伪装文件时间戳,使其与系统文件相同 |
||
删除信标 |
在使用函数时临时解密,使用完成后重新加密 |
|
会破坏第五阶段载荷PE头部特征 |
||
在释放重要内存前会使用RtlZeroMemory将其清零 |
||
进程注入 |
通过进程注入执行第五阶段载荷以及后续插件 |
|
虚拟化/沙箱逃逸 |
通过SetErrorMode检测沙箱 |
|
通过检测加载的DLL检测沙箱 |
||
通过检测设备检测虚拟环境 |
||
通过检测进程检测虚拟环境 |
||
通过检测内核模块检测虚拟环境 |
||
发现 |
发现系统信息 |
获取系统版本 |
发现系统地理位置 |
通过键盘布局检测地理位置 |
|
发现系统所有者/用户 |
获取计算机名 |
|
命令与控制 |
使用应用层协议 |
使用HTTP或HTTPS协议与C2进行通信 |
使用加密通信 |
使用RC4对通信的内容进行加密 |
7.安天澜砥威胁检测分析垂直大模型
安天澜砥威胁检测分析垂直大模型能对样本进行自动化分析,解析内容如下:
- 判定结果
判定结果为: Trojan.Win32.Kryptik
评估日志中的结果准确度: 95%
- 判定依据详细解释
- 特征字符串识别:
- 日志中多次出现与恶意软件相关的字符串,如:
- KERNEL32.dll
- GetLastError
- LoadLibraryW
- VirtualAlloc
- FreeLibrary
- MessageBoxA
- 这些函数和API调用是恶意软件常用的,用于加载和执行恶意代码。
- 代码混淆和加密:
- 日志中出现大量的混淆代码片段,如:
- CC D1 27 A9 ... 和 BE
22 F0 ...
- 这些代码片段通常用于隐藏真实的恶意行为,使得检测工具难以识别。
- 加密的代码片段(如 ?? 表示的数据未被选中作为特征使用)是恶意软件常见的混淆手段,以逃避检测。
- 异常调用模式:
- 日志中出现了大量的重复或不一致的调用模式,如:
- 00000060: 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20
- 这些调用模式可能用于绕过检测或隐藏恶意行为。
- 虽然这些模式在正常程序中也可能出现,但在恶意软件中更为常见。
- 文件结构异常:
- 日志显示文件大小为 196096 字节,大小适中,但存在大量的重复和混淆代码,可能用于隐藏实际的恶意代码。
- 文件头信息为 4D 5A,对应于 Windows 可执行文件格式(PE格式),表明该文件是一个 Windows 可执行程序。
- 缺乏正常程序特征:
- 日志中未检测到常见的正常程序特征,如:
- 常见的
API 调用、字符串或数据段。
- 正常的文件结构和内容。
- 结论
综合以上分析,日志中展示的特征字符串、混淆代码、异常调用模式和文件结构均符合 Trojan.Win32.Kryptik 恶意软件的典型特征。因此,模型判定该文件为 Trojan.Win32.Kryptik 是合理的。
- 准确度评估
95% 的准确度基于以下因素:
- 高匹配度: 日志中的特征与已知的 Trojan.Win32.Kryptik 恶意软件特征高度吻合。
- 多维度特征: 虽然日志中包含了一些正常程序的特征,但恶意软件特征的占比远超正常程序,使得判定结果可信度高。
- 建议
- 进一步验证: 使用其他检测工具或静态分析工具进行二次验证,以确认判定结果。
- 隔离和清理: 如果确认该文件为恶意软件,建议立即隔离并清理,避免潜在的安全风险。
按照国标草案给出威胁分类为Trojan.Win32.Kryptik,自动提取特征生成的YARA规则如下:
rule Trojan.Win32.Kryptik:Trojan {
meta:
description = "这是一段由 VILLM V2 模型生成的 YARA 规则。用于检测Trojan.Win32.Kryptik"
strings:
$a = { e8 ef f8 ff ff 59 59 8b 75 08 8d 34 f5 88 11 42 }
$b = { e9 45 ff ff ff 33 ff 8b 75 0c 6a 04 e8 44 f1 ff }
$c = { 89 85 e4 fc ff ff ff 15 d8 e0 41 00 6a 00 8b d8 }
condition:
all of them
}
安天澜砥威胁检测分析垂直大模型是国内首个通过国家网信办备案的威胁检测生成式算法。模型基于安天赛博超脑20余年积累的海量样本特征工程数据训练而成,训练数据包括文件识别信息、判定信息、属性信息、结构信息、行为信息、主机环境信息、数据信息等,支持对不同场景下向量特征进行威胁判定和输出详实的知识理解,形成应用不同需求和场景的多形态的检测方式,提升后台隐蔽威胁判定能力,进一步为安全运营赋能。
图7-1 安天澜砥威胁检测分析垂直大模型样本分析结果
8.安天智甲助力用户防御加载器威胁
经过测试,安天智甲终端安全系列产品(以下简称“智甲”)依托安天自研威胁检测引擎和内核级主动防御能力,可以有效查杀和防御本次发现病毒样本。
智甲可对本地磁盘进行实时监测,对新增文件自动化进行病毒检测。针对此次威胁,当用户通过接收邮件附件、微信传输、网络下载等方式将SmokeLoader加载器存储至本地时,智甲会立即对该病毒进行告警并清除恶意文件,防止用户启动文件导致终端遭受攻击。
图8-1 发现病毒时,智甲第一时间捕获并发送告警
智甲还为用户提供统一管理平台,管理员可通过平台集中查看网内威胁事件详情,并批量进行处置,提高终端安全运维效率。
图8-2 智甲管理中心助力管理员实现高效的终端安全管理