随着网络攻击技术的不断演变,恶意代码加载器逐渐成为恶意代码执行的关键组成部分。此类加载器是一种用于将各种恶意代码加载到受感染的系统中的恶意工具,通常负责绕过系统安全防护,将恶意代码注入内存中并执行,为后续的特洛伊木马类型恶意代码的部署奠定基础。加载器的核心功能包括持久性机制、无文件内存执行以及多层次规避技术。
安天CERT将近几年历史跟踪储备的典型恶意加载器家族有关信息汇总成专题报告,在未来几个月依次发布,并持续追踪新的流行加载器家族。本项目专题将聚焦加载器技术细节,深入挖掘其在攻击链中的核心功能,包括其混淆技术、加密机制以及注入策略等。此外,我们也会不断完善自身安全产品能力,采取有效技术方案进一步提升针对加载器的识别率和准确率,帮助用户组织提前发现并阻止潜在威胁。
XLoader是一种由Formbook发展而来的僵尸网络加载器[1],于2020年首次出现在黑客论坛上,并以“恶意软件即服务”(Malware-as-a-Service, MaaS)的形式进行销售。该加载器具有跨平台的特性,能够在Windows和macOS操作系统上运行。XLoader能够窃取多种浏览器、邮件客户端和Windows凭证管理器中保存的凭证信息,并能够获取桌面截图,记录剪贴板内容以及键盘按键,对用户隐私构成了严重威胁。此外XLoader加载器还能够执行来自攻击者的指令,进一步下载和执行其他恶意程序,给用户系统安全带来额外风险。
图2‑1 XLoader在暗网上的售卖信息
为了规避检测,XLoader采用了高度复杂的加载方式。该加载器将自身的关键代码和数据全部进行加密,运行时按需解密,并且使用后会重新加密,以增强隐蔽性。同时,XLoader将会通过进程镂空的方式将自身移动到其他进程中运行,以便隐藏自身的进程。此外,XLoader还会对运行环境进行细致的检查以反调试和反虚拟化,并采取反hook手段避免关键API调用被挂钩,降低自身被自动化分析的风险。为了隐藏C2,XLoader将真实C2地址与大量虚假地址混合使用,使其难以区分,进一步提高隐蔽性。经验证,安天智甲终端防御系统(简称IEP)可有效查杀该僵尸网络加载器。该加载器详细信息参见安天病毒百科[2]。
长按识别二维码查看XLoader加载器详细信息
为了实现恶意功能,XLoader加载器将从多个方向提高自己的生存能力。其中XLoader通过加密技术将自己的重要数据与核心代码进行加密,以防止静态分析及内存dump。并通过大量的环境检测代码,防止自身在分析环境中运行,实现反调试的目的。XLoader加载器还通过反挂钩技术进一步防止自身API调用被挂钩,进一步降低自身被监控的风险。最后通过注入技术,既能隐藏自身进程,又能进入目标程序地址空间执行恶意逻辑,实施恶意行为。并通过修改注册表进行持久化,达成生存的目的。
3.1 加密技术分析
XLoader加载器中的数据都使用了一个关键的RC4密钥用作加密。其中XLoader加载器使用了用于导入函数的哈希表的sha1作为加密该RC4密钥的一环,以确保哈希表未被篡改。
图3‑1 XLoader解密RC4密钥
为了增强加密的程度,XLoader加载器使用了一种特殊的方式保存数据。XLoader加载器会在数据之间掺杂无用的字节,在读取时根据读取到的字节值选择丢弃和保留字节的数量。
图3‑2 XLoader读取数据
在解密时,XLoader加载器会通过差分,RC4解密再差分的方式,进行解密运算,以增加加密函数的复杂度。
图3‑3 XLoader的加密算法
对于C2地址,XLoader加载器有额外的加密。在解密后的字符串表中,C2地址表现为base64编码的格式。XLoader会在运行时base64解码并再次通过差分和RC4算法进行解密。
对于加密C2所用的RC4密钥,XLoader加载器使用异或的方式对其进行加密。
图3‑4 XLoader解密C2 RC4密钥
为了增加分析难度,XLoader加载器将C2的RC4密钥与异或密钥分散在不同的函数中进行加密,用于异或的密钥可以在构造XLoader
XLNG数据的函数中找到。
图3‑5 XLoader初始化解密C2 RC4的异或密钥
对于代码,XLoader加载器使用了双重RC4密钥加密。为了增加逆向难度,XLoader 加载器会将两次解密分散在程序不同位置。为了增加密钥和加密代码块提取难度,XLoader加载器在运行时动态计算加密代码块的起止特征值和密钥,以防止自动化提取。
图3‑6 XLoader解密代码块
为了防止内存dump,XLoader加载器会在函数使用结束后对代码重新进行加密。
图3‑7 XLoader函数使用结束后重新对其加密
3.2 反调试技术分析
XLoader加载器会从多方面检测运行环境以判断是否继续执行,其中检测内容包括:DLL名称、DLL路径、调试端口、内核调试信息、WOW32Reserved是否被hook、运行中的进程名称、自身镜像名称和用户名。
XLoader加载器会通过NtQueryInformationProcess检测是否被调试。
图3‑8 XLoader检测进程是否被调试
XLoader加载器通过NtQuerySystemInformation发现内核调试器。
图3‑9 XLoader检测是否有内核调试器
XLoader加载器会检测WOW32Reserved所在的Wow64cpu.dll是否为64位,如果为64位则说明当前环境可能存在API hook,XLoader会停止运行。
图3‑10 XLoader检测Wow64cpu.dll是否被修改
XLoader加载器会寻找是否加载了sbiedll.dll以判断是否在Sandboxie沙箱中运行。
图3‑11 XLoader通过遍历PEB寻找DLL
XLoader加载器检查DLL路径以判断是否在Cuckoo和SandCastle等沙箱中运行。
图3‑12 XLoader通过检查DLL判断是否在沙箱中运行
XLoader加载器会检测自身的进程名称,如果进程名称满足特定的哈希值,或者其长度大于31且不包含空格,则会停止运行。
图3‑13 XLoader检测进程名
XLoader加载器会通过检测用户名判断是否在沙箱中运行。
图3‑14 XLoader检测用户名是否在黑名单中
其中XLoader加载器具体的环境检测列表如下。
DLL模块 | sbiedll.dll |
|
|
|
DLL路径 | \cuckoo\ | \sandcastle\ | \aswsnx\ | \sandbox\ |
\smpdir\ | \samroot\ | \avctestsuite\ |
|
黑名单进程 | vmwareuser.exe | vmwareservice.exe | vboxservice.exe | vboxtray.exe |
sandboxiedcomlaunch.exe | sandboxierpcss.exe | procmon.exe | filemon.exe |
wireshark.exe | netmon.exe | SharedIntApp.exe | vmsrvc.exe |
vmusrvc.exe | python.exe | perl.exe | regmon.exe |
进程名称哈希 | 0x7C81C71D |
|
|
|
用户名称 | cuckoo | sandbox- | nmsdbox- | xxxx-ox- |
cwsx- | wilbert-sc | xpamast-sc
|
|
在运行完所有的环境检测函数后,XLoader加载器会通过一个函数集中判断运行环境是否满足条件,如果不满足则会退出程序。
图3‑15 XLoader集中判断运行环境检测结果
此外,为了进一步增加逆向难度,当XLoader加载器检测环境符合要求时,会修正后续用于导入函数的哈希表和导入DLL的字符串表,如果环境不符合要求,XLoader加载器则会破坏它们以防止程序进一步运行。此行为既能增加动态调试时绕过环境检测的难度,又能在静态分析时防止直接通过解密哈希表和字符串表中获取关键信息。
图3‑16 XLoader根据环境检测结果决定破坏还是修复hash_table
3.3 反挂钩技术分析
XLoader加载器在初始化的过程中会手动加载ntdll以防止部分关键API被hook,为实现此目的XLoader加载器从硬盘中读取ntdll,并手动进行重定向操作。
图3‑17 XLoader手动重定向ntdll
XLoader加载器将所有API通过EAT hook的方式重定向到原有的ntdll中。
图3‑18 XLoader通过EAT hook重定向函数到旧ntdll
XLoader加载器unhook特定函数,使函数导出表重新指向手动载入的ntdll,以确保特定函数执行时未被hook。
图3‑19 XLoader unhook特定API函数
如果执行的系统为32位,XLoader加载器还会将SystemCallStub设置为KiFastSystemCall以进一步防止syscall被挂钩。
图3‑20 XLoader设置SystemCallStub为KiFastSystemCall
如果执行的系统为64位,XLoader加载器在加载函数时会进一步检查WOW32Reserved是否被挂钩。如果被挂钩,XLoader将会把WOW32Reserved恢复为初始状态,以防止系统调用被监控。
图3‑21 XLoader反WOW32Reserved hook
XLoader加载器在手动加载的ntdll中执行的函数如下。
表3.2 XLoader在手动加载的ntdll中执行的函数KiFastSystemCall | NtCreateProcessEx | NtOpenProcess | NtOpenThread |
NtGetContextThread | NtSetContextThread | NtSuspendThread | NtResumeThread |
NtQueueApcThread | NtDelayExecution | NtQuerySystemInformation | NtQueryInformationProcess |
NtOpenDirectoryObject | NtCreateMutant | NtQuerySection | NtCreateSection |
NtMapViewOfSection | NtUnmapViewOfSection | NtCreateKey | NtSetValueKey |
NtQueryValueKey | NtEnumerateKey | NtEnumerateValueKey | NtOpenProcessToken |
NtQueryInformationToken | NtAdjustPrivilegesToken | NtWaitForSingleObject | NtQueryInformationFile |
NtSetInformationFile | NtCreateFile | NtWriteFile | NtReadFile |
NtDeleteFile | NtClose | NtWriteVirtualMemory | NtQueryVirtualMemory |
NtReadVirtualMemory
| NtAllocateVirtualMemory | NtProtectVirtualMemory | NtFreeVirtualMemory |
3.4 注入技术分析
XLoader加载器的运行严重依赖进程注入,XLoader会通过进程注入执行不同阶段载荷。
当XLoader加载器在不同阶段迁移时,XLoader通过一个随机的后台进程来创建用于执行XLoader下一阶段的新进程,以便减少新进程与XLoader之间的联系。
图3‑22 XLoader选择用于注入的进程
XLoader加载器会通过劫持主线程和APC注入让目标进程执行创建新进程的代码,不同于进程镂空,XLoader加载器会保留原进程的内存并记录EIP,以便在执行结束后使其恢复运行。
图3‑23 XLoader劫持主线程并APC注入
最后被注入的进程将会执行创建新进程的代码,并通过共享内存传回到XLoader中。
图3‑24 被注入的进程创建新进程
如果注入的目标进程为64位,则XLoader加载器将通过天堂之门切换到64位代码以适应目标进程地址空间,当注入结束后恢复到32位代码运行。其64位代码功能与32位代码相同。
图3‑25 XLoader切换至64位代码运行
其中XLoader加载器可创建的进程如下:
表3.3 XLoader可用于运行其他阶段载荷的进程svchost.exe | msiexec.exe | wuauclt.exe | lsass.exe | wlanext.exe |
msg.exe | lsm.exe | dwm.exe | help.exe | chkdsk.exe |
cmmon32.exe | nbtstat.exe | spoolsv.exe | rdpclip.exe | control.exe |
taskhost.exe | rundll32.exe | systray.exe | audiodg.exe | wininit.exe |
services.exe | autochk.exe | autoconv.exe | autofmt.exe | cmstp.exe |
colorcpl.exe | cscript.exe | explorer.exe | WWAHost.exe | ipconfig.exe |
msdt.exe | mstsc.exe | NAPSTAT.EXE | netsh.exe | NETSTAT.EXE |
raserver.exe | wscript.exe | wuapp.exe | cmd.exe |
|
3.5 持久化技术分析
XLoader加载器首先会检测程序是否具有管理员权限,如果有管理员权限,XLoader加载器会在HKEY_LOCAL_MACHINE下创建自启动项,否则XLoader会在HKEY_CURRENT_USER下创建自启动项。
图3‑26 XLoader选择创建自启动项位置
随后XLoader加载器通过随机数决定是在\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run下创建自启动项还是在\SOFTWARE\Microsoft\Windows\CurrentVersion\Run下创建自启动项。
图3‑27 XLoader通过随机数决定创建自启动项的位置
XLoader加载器通常通过钓鱼邮件进行传播,并利用NSIS加载进行加载。XLoader的运行总共分为三个阶段:第一阶段主要负责环境检测,当XLoader检测到调试器或者沙箱时则会停止运行,否则会创建一个新进程用于执行XLoader第二阶段。第二阶段将会执行窃密逻辑,窃取浏览器、邮件客户端及Windows凭证管理器中保存的账户信息,并获取屏幕截图上传至C2服务器。同时,第二阶段还会创建远控线程,接受和执行来自攻击者的指令。随后,XLoader会将自身进一步注入到浏览器、FTP客户端和邮件客户端中执行XLoader第三阶段。在第三阶段,XLoader会hook网络相关的API并监控按键和剪贴板,并从中进一步获取账密信息上传至C2服务器。
图4‑1 XLoader加载流程
病毒名称 | Trojan/Win32.XLoader |
MD5 | 3CD23779C02B9A35DE36B1DAFA13C268 |
处理器架构 | Intel 386 or
later processors and compatible processors |
文件大小 | 318 KB (326,302字节) |
文件格式 | BinExecute/Microsoft.EXE[:X86] |
时间戳 | 2015-12-27 05:38:43 |
数字签名 | 无 |
加壳类型 | NSIS |
编译语言 | Microsoft Visual
C/C++(17.00.50727) |
VT首次上传时间 | 2024-10-25 05:04:42 |
VT检测结果 | 47/71 |
5.2 XLoader加载阶段
XLoader加载器使用了NSIS进行打包。NSIS(Nullsoft Scriptable
Install System)是一个开源的Windows系统下安装程序制作程序,该NSIS安装程序会释放一个加载器用于解密并运行XLoader。
该加载器会解密并运行一段shellcode,该shellcode通过EnumSystemCodePagesA的回调函数运行。
图5‑1 用于加载XLoader的加载器解密并运行shellcode该shellcode会进一步解密XLoader,并通过进程镂空的方式运行。
图5‑2 shellcode通过进程镂空的方式运行XLoader5.3 XLoader加载器第一阶段
在第一阶段,XLoader加载器的主要逻辑代码被全部加密,在解密后执行XLoader加载器第一阶段主要逻辑。XLoader加载器第一阶段主要用于检测执行环境并注入执行第二阶段代码。
XLoader加载器会通过NtQueryInformationProcess检测进程是否被调试。
XLoader加载器会通过NtQuerySystemInformation检测是否具有内核调试器。
XLoader加载器会通过检测Wow64cpu.dll是否为32位来检测是否被hook。
图5‑6 XLoader检测WOW32Reserved是否被hookXLoader加载器检测加载的DLL列表。
图5‑7 XLoader检测是否加载了sbiedll.dllXLoader加载器会检测加载到内存中的DLL模块路径。
图5‑9 XLoader检测运行中的程序是否在黑名单中XLoader加载器会检测自身进程名称是否满足特定条件。XLoader加载器检测用户名称是否满足特定条件。图5‑11 XLoader检测用户名是否在黑名单中XLoader加载器在检测完运行环境后会尝试通过创建互斥量防止重复运行。图5‑12 XLoader第一阶段创建互斥量防止重复运行XLoader加载器检测所在地区,如果满足条件则停止运行。XLoader加载器会尝试获取SeDebugPrivilege权限。图5‑14 XLoader获取SeDebugPrivilege权限当XLoader加载器一阶段加载结束后会通过劫持主线程和APC注入的方式注入到其他进程内部,并通过explorer.exe随机创建一个进程用于加载后续第二阶段逻辑。当XLoader加载器获取到创建的子进程后,XLoader会通过进程镂空的方式加载二阶段逻辑。
图5‑16 XLoader通过进程镂空运行第二阶段代码在进程镂空的过程中,XLoader加载器会用随机数抹除PE头部信息来干扰取证分析。在抹除PE头部信息后,XLoader会向PE头写入一串随机的的SHA1数据,用于在后续的程序中作为PE头的标记以便搜索程序的基址。此外,XLoader加载器同时通过设置环境变量和写内存参数的方式向子进程传递父进程路径信息,以便后续在子进程中移动自身位置。
当通过环境变量传递父进程路径时,XLoader加载器会用用户名生成的随机字符串作为名称传递路径信息。图5‑18 XLoader通过设置环境变量传递父进程路径信息当通过内存传递父进程路径时,XLoader加载器会向子进程内存基址0x200偏移处写入路径信息。图5‑19 XLoader通过写内存变量的方式传递父进程路径信息5.4 XLoader加载器第二阶段
XLoader加载器第二阶段会经历和第一阶段相同的初始化流程,在第二阶段,XLoader会使用通过用户名生成的随机字符串来创建互斥量来防止重复运行。在第二阶段,XLoader加载器会在运行时解密所需要的函数,当函数不再使用时,XLoader会再次将其进行加密处理。XLoader加载器会检查程序路径,如果XLoader加载器不在C:\Program
Files (x86)或%appdata%目录下,则会删除自身,并在后续的代码中移动位置。XLoader加载器会收集系统信息并上传到C2服务器。
图5‑24 生成BOT ID并获取系统版本和用户名在第二阶段,XLoader加载器会尝试窃取多种浏览器和邮箱保存的凭据。
其中受影响的程序如下:
Outlook | Internet
Explorer | Firefox | Thunderbird | Chrome |
Opera | Foxmail | AVG Secure Browser | Kinza | URBrowser |
Avast Secure
Browser | SalamWeb | CCleaner Browser
| Opera Software | YandexBrowser |
Slimjet | 360Chrome | Comodo Dragon | ChromePlus | Chromium |
torch | Brave-Browser | Iridium | Opera Neon | 7Star |
Amigo | Blisk | CentBrowser | Chedot | CocCoc Browser |
Elements Browser | Epic Privacy
Browser | Kometa | Orbitum | Sputnik |
uCozMedia Uran | Sleipnir5 | Citrio | Coown | liebao |
QIP Surf | Microsoft Edge | Vivaldi |
|
|
在XLoader加载器第二阶段,还可以接受并执行C2指令。
图5‑26 XLoader执行C2指令
指令号 | 功能 |
1 | 通过ShellExecuteA保存并执行C2下发的可执行文件 |
2 | 更新系统中的XLoader |
3 | 卸载系统中的XLoader |
4 | 通过ShellExecuteA执行指定程序 |
5 | 清理Cookies文件并重启explorer.exe |
6 | 重新执行窃密逻辑 |
7 | 重启目标计算机 |
8 | 关闭目标计算机 |
随后XLoader加载器将会将自身注入到exploer.exe中运行第三阶段代码。
图5‑27 XLoader注入到exploere.exe执行第三阶段逻辑
5.5 XLoader加载器第三阶段
在第三阶段的初始化,XLoader加载器并不会像前两个阶段一样检查运行环境,而只会加载运行中所必要的信息,XLoader加载器初始化结束后会检测当前所注入的程序。
图5‑28 XLoader检测当前所注入的程序
在此次分析的XLoader加载器中,XLoader仅会在注入explorer.exe时执行恶意行为,此时XLoader加载器会创建一个线程用来窃取剪贴板和窗口信息。图5‑29 XLoader窃取剪贴板信息
IoCs |
3CD23779C02B9A35DE36B1DAFA13C268 |
8D80D388BE65DFAF7BBD1CA61D87CADE |
14321BB37BA45223C9BE4633CA4E11B9 |
59A95C9FCCA51D487259BA447380AD41 |
图7‑1 技术特点对应ATT&CK的映射
具体ATT&CK技术行为描述表:
ATT&CK阶段/类别 | 具体行为 | 注释 |
初始访问 | 网络钓鱼 | XLoader通过钓鱼邮件实现初始访问 |
执行 | 利用API | XLoader依赖进程镂空与APC注入执行不同阶段载荷 |
持久化 | 利用自动启动执行引导或登录 | XLoader通过修改注册表实现持久化的目的 |
提权 | 操纵访问令牌 | XLoader通过AdjustTokenPrivilege函数获取SeDebugPrivilege权限 |
防御规避 | 规避调试器 | XLoader检测WOW32Reserved是否被hook |
XLoader通过NtQuerySystemInformation检测是否有内核级别调试器及调试端口 |
XLoader检测是否有进程/模块/用户名与黑名单匹配 |
删除信标 | XLoader会抹除注入程序的PE头信息以避免检测 |
XLoader会将初始访问所用的文件删除 |
XLoader在远控功能中可以被卸载 |
混淆文件或信息 | XLoader大部分代码和数据需要多次差分和RC4进行解密
|
XLoader通过计算函数哈希动态载入API |
XLoader重要数据需要通过一种复杂的方式进行读取以丢弃其中的无用字节 |
XLoader在函数使用结束后会重新对其进行加密 |
XLoader解密代码与数据块的密钥被异或加密 |
凭证访问 | 从存储密码的位置获取凭证 | XLoader会获取多种浏览器、邮件客户端以及Windows Credentials Vault中的密码 |
发现 | 发现应用程序窗口 | XLoader会记录被hook程序的窗口信息 |
发现系统信息 | XLoader会收集系统版本信息 |
发现系统地理位置 | XLoader会根据系统地理位置决定是否运行 |
发现系统所有者/用户 | XLoader会获取用户名并上传到C2服务器 |
收集 | 自动收集 | XLoader会通过hook的方式收集程序发送出的TCP及HTTP流量 |
收集剪贴板数据 | XLoader通过GetClipboardData函数收集剪贴板数据 |
输入捕捉 | XLoader会hook窗口消息函数以捕获键盘输入 |
屏幕捕获 | XLoader会截屏并回传到C2服务器 |
命令与控制 | 使用应用层协议 | XLoader用HTTP协议与C2服务器通信 |
编码数据 | XLoader会将消息进行RC4+base64加密 |
数据渗出 | 使用C2信道回传 | XLoader使用C2相同信道回传窃密信息 |
影响 | 系统关机/重启 | XLoader可以关闭/重启计算机 |
建议企业用户部署专业的终端安全防护产品,对本地新增和启动文件进行实时检测,并周期性进行网内病毒扫描。安天智甲终端安全系列产品(以下简称“智甲”)依托安天自研威胁检测引擎和内核级主动防御能力,可以有效查杀本次发现病毒样本。智甲可对本地磁盘进行实时监测,对新增文件自动化进行病毒检测,对发现病毒可在其落地时第一时间发送告警并进行处置,避免恶意代码启动。
图8‑1 发现病毒时,智甲第一时间捕获并发送告警
智甲还为用户提供统一管理平台,管理员可通过平台集中查看网内威胁事件详情,并批量进行处置,提高终端安全运维效率。
安天澜砥威胁检测分析垂直大模型能对样本进行自动化分析,部分解析内容如下:
图9‑1 安天澜砥威胁检测分析垂直大模型样本分析解读
按照国标草案给出威胁分类为Trojan.Win32.BlackBand,自动提取特征生成的YARA规则如下:ruleTrojan_Win32_BlackBand:Trojan
{
meta: description = "这是一段由 VILLM V2 模型生成的 YARA 规则。用于检测 Trojan.Win32.BlackBand"
strings:
$a = {53 51 53 53 53 50 }
condition:
$a
}
安天澜砥威胁检测分析垂直大模型是国内首个通过国家网信办备案的威胁检测生成式算法。模型基于安天赛博超脑20余年积累的海量样本特征工程数据训练而成,训练数据包括文件识别信息、判定信息、属性信息、结构信息、行为信息、主机环境信息、数据信息等,支持对不同场景下向量特征进行威胁判定和输出详实的知识理解,形成应用不同需求和场景的多形态的检测方式,提升后台隐蔽威胁判定能力,进一步为安全运营赋能。
图9‑2 安天澜砥威胁检测分析垂直大模型样本分析结果
参考资料
[1]安天.对某单位遭受投递FormBook窃密木马的分析报告[R/OL].(2021-10-21)
https://www.antiy.cn/research/notice&report/research_report/20211021.html
[2].安天.Trojan/Win32.XLoader病毒详解与防护-计算机病毒百科[R/OL].(2025-01-22)
https://www.virusview.net/malware/Trojan/Win32/XLoader