文章总结: 该文档深度分析了GachiLoader这一Node.js恶意软件,它通过YouTube推广游戏外挂传播。作者开源了Node.jsTracer工具以绕过其反分析机制,并首次披露了一种名为VectoredOverloading的新型PE注入技术,利用向量异常处理在内存中加载恶意载荷。最终载荷为Rhadamanthys窃密器,文中包含详细的逆向过程、防御绕过技巧及完整IoC,极具实战价值。
综合评分: 95
文章分类: 恶意软件,逆向分析,威胁情报,二进制安全
GachiLoader:通过 API 跟踪击败 Node.js 恶意软件
aeverj
aeverj
红队工坊
2026年3月5日 10:33
中国台湾
翻译自 GachiLoader: Defeating Node.js Malware with API Tracing
引言
在 [此前的研究] https://research.checkpoint.com/2025/youtube-ghost-network/ 中,我们曾深入分析过 YouTube 幽灵网络——一个由大量被入侵账号组成的、协同推广恶意内容的攻击网络。本次研究聚焦该网络中的一个特定活动:其部署的恶意软件采用了一种此前未被记录的 PE 注入技术,通过滥用向量异常处理(VEH),诱导系统从内存中加载恶意 PE 文件,而非合法 DLL。
攻击活动概览
与我们此前分析的活动类似,此次攻击链始于被入侵的 YouTube 账号——这些账号发布诱饵视频,诱导用户从外部网盘下载恶意软件。本次活动的主题集中在游戏外挂与盗版软件上:
图1 — 被入侵账号发布恶意游戏外挂广告示例
视频简介中通常包含解压密码,并附带”关闭 Windows Defender”的操作指引。
我们共识别出100 多个相关视频,累计播放量约 22 万次,分布在 39 个被入侵账号中,最早视频发布于 2024 年 12 月 22 日,意味着该活动已持续超过 9 个月。在我们向 YouTube 举报后,大部分视频已被下架,但新账号仍可能继续上传同类内容。
自我们开始监控该活动以来,其最终载荷均为 [Rhadamanthys] https://research.checkpoint.com/2025/rhadamanthys-0-9-x-walk-through-the-updates/ 信息窃取器,由我们命名为 GachiLoader 的定制加载器分发。
GachiLoader 分析
GachiLoader 是一种高度混淆的 Node.js JavaScript 恶意软件,用于在受感染主机上部署后续载荷。Node.js 正成为攻击者不断扩展的攻击工具链中的一员——他们持续将非传统语言与平台纳入攻击体系,以传播恶意软件。
由于混淆 JavaScript 的手动逆向工作量巨大,我们开发了Node.js 脚本跟踪器,通过动态分析手段,轻松绕过常见反分析技巧,显著降低人工分析成本。该工具不仅适用于 GachiLoader,也适用于所有高度混淆的 Node.js 恶意软件。因此,我们决定将其开源,供社区使用:
https://github.com/CheckPointSW/Nodejs-Tracer
部分 GachiLoader 样本会释放第二阶段加载器 Kidkadi,其技术尤为值得关注——实现了一种新型 PE 注入技术,可诱导 Windows 加载器从内存中加载恶意 PE 文件,而非合法 DLL。我们将其命名为 Vectored Overloading(向量覆盖),并基于该技术编写了可公开验证的概念验证(PoC)程序。
技术分析
GachiLoader 的 JavaScript 模块通过 nexe 打包器封装为独立可执行文件(大小约 60–90 MB)。nexe 是一个开源项目,可将 Node.js 应用与运行时环境打包成单文件,使其无需预装 Node.js 即可运行。尽管体积较大,但受害者本就期望下载到完整软件包,因此不会引起怀疑。可通过 [nexe_unpacker] https://npm.io/package/nexe_unpacker 工具提取其中的混淆 JS 源码。
图2 — 混淆(但已格式化)的 JavaScript 源码
反分析机制
为逃避安全研究人员或自动化沙箱的检测,GachiLoader 实施了多项反分析检查:
- 检查内存是否 ≥ 4 GB
- 检查 CPU 核心数是否 ≥ 2
- 比对用户名是否在黑名单中(如
honey、vmware、sandbox等,详见附录 A) - 比对主机名是否在黑名单中(如
desktop-vrsqlag、desktop-d019gdm等,详见附录 B) - 扫描运行进程,与分析工具/沙箱特征进程比对(如
wireshark.exe、ollydbg.exe、vboxservice.exe等,详见附录 C)
随后,它会执行 PowerShell 命令,通过 WMI 查询系统资源:
- 检查是否存在端口连接对象:
(Get-WmiObject Win32_PortConnector).Count - 获取硬盘厂商信息并比对黑名单(如
VMware、Virtual、QEMU等,详见附录 D) - 获取显卡名称并比对虚拟机特征(如
VBox、Hyper-V、QEMU等,详见附录 E)
一旦检测到沙箱或虚拟环境,程序将进入死循环,不断向 linkedin.com、grok.com、whatsapp.com 等合法网站发起 HTTP GET 请求:
图3 — 检测到沙箱环境后持续发送 GET 请求
此外,为防止短时间重复运行,程序首次执行时会在 %TEMP% 目录下创建一个随机名 .lock 文件作为互斥锁;若该文件已存在或 5 分钟内被修改,则程序退出。
借助 Node.js Tracer,我们轻松绕过了所有反分析机制:工具通过 Hook 相关 API,向恶意程序返回伪造的结果,使其顺利执行并暴露恶意行为:
图4 — Node.js Tracer 成功绕过反分析检测
通过 UAC 提权
若环境判断为非沙箱,程序会通过 net session 命令检查是否以管理员权限运行(该命令在非管理员上下文中预期会失败)。若失败,则通过 PowerShell 以 UAC 提权方式重启自身:
powershell -WindowStyle Hidden -Command "Start-Process cmd.exe -Verb RunAs -WindowStyle Hidden -ArgumentList '/c \"<程序路径>\"'"
尽管会弹出 UAC 提示框,但因其伪装成常规软件安装程序,用户很可能会点击”是”。
防御规避
为规避后续载荷被检测,程序会:
-
强制终止 Windows Defender 的
SecHealthUI.exe进程:taskkill /F /IM SecHealthUI.exe -
为以下路径添加 Defender 排除项:
-
C:\Users\ -
C:\ProgramData\ -
C:\Windows\ -
其他所有已挂载磁盘的根目录(如
D:\) -
为
*.sys文件添加全局排除项:Add-MpPreference -ExclusionExtension '.sys'(但本次样本中未发现此类文件)
载荷投递与执行
GachiLoader 分为两种变种:
- 变种一:从远程 URL 下载最终载荷
- 变种二:释放第二阶段加载器
kidkadi.node,通过 Vectored Overloading 技术加载嵌入在 JS 源码中的最终载荷
变种一:远程载荷
图5 — 变种一从远程 URL 加载载荷
首先,程序收集主机信息(如杀软类型、系统版本),通过 POST 请求发送至 C2 的 /log 接口。各样本内置多个 C2 地址以实现冗余,我们通过跟踪发现其会依次尝试每个地址:
图6 — Node.js Tracer 追踪到的 C2 通信
随后,向 /richfamily/<key> 接口发起 GET 请求(<key> 为每样本唯一标识),并携带 X-Secret: gachifamily 头,获取最终载荷的 Base64 编码 URL。但真正下载载荷时,还需再次使用嵌入在二进制中的唯一密钥(如 X-Secret: 5FZQY1gYj0UKw4ZC99d1oNYR8LvTPtrfN357Eh5gmRvsMaPYgXtMxRXpMb2bTFOb2h2HqMnvUKT9CUpj9864gckmPUzf9uLIIU9),否则服务器返回 Forbidden。
最终载荷下载至 %TEMP%,以随机名保存,伪装成 KeePass.exe、GoogleDrive.exe、UnrealEngine.exe 等合法软件,实则为经 VMProtect 或 Themida 加壳保护的 Rhadamanthys 窃密器。
变种二:Kidkadi
该变种不连接 C2,而是将载荷直接嵌入 JS 源码中,释放为 %TEMP%\kidkadi.node:
图7 — 变种二释放 Kidkadi
.node 文件是 Node.js 的原生插件,本质为 DLL,可通过 dlopen 从 JS 调用。攻击者向 JS 暴露一个函数(函数名因样本而异),部分样本中函数名及错误提示甚至带有俄语特征:
图8 — 向 JS 暴露函数
加载器将恶意 PE 以二进制缓冲区形式传入 Kidkadi,再通过反射式 PE 加载执行。我们发现其基于 [Module Overloading] https://github.com/hasherezade/module_overloading 技术,创新性地滥用 VEH(向量异常处理),在调用 LoadLibrary 加载任意 DLL 时,欺骗系统执行恶意 PE。该技术尚未被公开记录,显示出攻击者对 Windows 内部机制的深入理解,我们将其命名为 Vectored Overloading。
通过 Vectored Overloading 加载 PE
攻击流程如下:
- 创建合法节:从
wmp.dll(Windows Media Player 使用的 DLL)创建一个带SEC_IMAGE标志的新节; - 覆盖载荷:将恶意 PE 内容写入该节,并通过
NtMapViewOfSection映射到进程内存; - 重定位与保护:逐段复制 PE 节,应用重定位及内存保护属性;
- 伪装映射:最终形成一个”合法 DLL 节”,但实际内容为恶意 PE 的内存视图——后续将被 Windows 加载器(
ntdll!Ldr*)误加载。
由于 Windows 加载器仅允许加载具备 DLL 特征的 PE,若载荷非 DLL,程序会:
- 将
FileHeader.Characteristics设为IMAGE_FILE_DLL; - 清零入口点(避免调用非 DLL 入口函数)。
随后,程序注册一个 VEH(向量异常处理器)。VEH 是用户态回调,在系统发生异常(如硬件断点触发)时被调用。攻击者利用此机制,在 NtOpenSection 上设置硬件断点(HWBP):
图11 — 在 NtOpenSection 上设置硬件断点
接着,通过 LoadLibrary 加载 amsi.dll,触发注入流程:
图12 — 加载目标 DLL 并移除异常处理器
LoadLibrary 内部会调用 NtOpenSection 创建目标 DLL 的节对象,触发 HWBP → VEH。此时,VEH 将原 amsi.dll 的节句柄替换为恶意 PE 的节句柄,并跳过内核调用,直接返回有效句柄,模拟 NtOpenSection 行为:
图13 — 替换输出参数为恶意 PE 的节句柄
VEH 退出前,会再次设置 HWBP 到 NtMapViewOfSection:
图14 — 在 NtMapViewOfSection 上设置硬件断点
当 Windows 加载器调用 NtMapViewOfSection 映射节时,再次触发 VEH,替换输出参数为恶意 PE 的内存地址(因该地址已在早期写入 wmp.dll 的节中,可直接使用):
图15 — 替换输出参数为恶意 PE 指针
最后,HWBP 设置在 NtClose,用于验证关闭的是正确的节句柄。
图16 — 在 NtClose 上设置硬件断点
回到主流程后:
- 若载荷为 EXE,直接调用入口点;
- 若为 DLL,则视为
.node插件,解析并调用对应导出函数:
图17 — EXE 与 DLL 的调用方式
此外,我们还发现一个名为 HookPE.exe 的独立文件(非本次活动相关),是该技术的 64 位 PoC,含调试信息,用于将 calc.exe 加载进内存。其错误提示表明使用了 [libpeconv] https://github.com/hasherezade/libpeconv 进行 PE 处理:
图18 — HookPE PoC 项目
该注入技术相比传统 RunPE 具有以下优势:
-
隐蔽性:注入的 DLL 在磁盘上仍显示为
wmp.dll(因节最初基于该 DLL 创建),但内存内容不一致,可被 [Moneta]https://github.com/forrest-orr/moneta等工具检测:
图19 — Moneta 可检测不匹配模块,但多数工具仍显示原 DLL 名 -
简化开发:部分加载工作由 Windows 加载器完成,攻击者无需手动处理导入表、TLS 回调等(许多公开 PE 加载器甚至不支持 TLS 回调);
-
规避 ETWti 事件:通过模拟系统调用,跳过内核回调(如 ETWti),可能绕过仅依赖 ETWti 事件的安全产品(尽管早期映射阶段仍会触发事件,但顺序异常)。
我们已将该技术的 64 位实现开源,供安全研究人员分析与检测测试:
https://github.com/CheckPointSW/VectoredOverloading
为绕过 JS 源码的静态反混淆难题,我们对所有 GachiLoader 样本运行 Node.js Tracer,自动绕过反分析检测并提取最终载荷。通过 Hook 文件系统 API,我们可在恶意程序删除文件前保存其下载内容:
图20 — Tracer 显示 GachiLoader 释放 Kidkadi
两种变种的最终载荷均经 Themida 或 VMProtect 加壳。在自动化沙箱中运行后,我们成功从内存中转储未保护的配置,提取出最终载荷的 C2 地址:
图21 — 最终载荷的 Detect-it-Easy 输出
所有样本最终均部署 Rhadamanthys 窃密器,其 C2 地址见下方 IoC 部分。
结论
基于 Node.js 的恶意软件日益增多,且多为混淆形式,静态反混淆耗时费力。通过开源工具 Node.js Tracer,分析师可动态跟踪与 Hook Node-API,大幅缩短分析时间,并轻松绕过常见反分析机制。
GachiLoader 的攻击者展现出对 Windows 内部机制的深入理解,对已有技术进行了创新性改进。这提醒我们:安全研究人员必须持续更新对 PE 注入等技术的认知,主动识别攻击者规避检测的新手法。
YouTube 幽灵网络利用用户对平台的信任,诱导其下载恶意软件。用户应特别警惕所谓”盗版软件、外挂、破解工具”等——这些文件常被植入窃密木马。尽管安全社区与 YouTube 正积极清除此类内容,攻击仍持续不断。
防护措施
Check Point Threat Emulation 与 Harmony Endpoint 可全面覆盖本报告所述攻击手法、文件类型与操作系统,提供有效防护。
指示器(IoC)
| 描述 | 值(哈希/URL) |
| — | — |
| .zip 归档文件 | 062d342f... (共 20 个 SHA-256 哈希,见原文) |
| 变种一 — GachiLoader | 00bcfecad... (共 100+ 个 SHA-256 哈希,见原文) |
| GachiLoader 的 C2 服务器 | davpniktonevidit[.]cfd 、nupogodi[.]cfd、94[.]154[.]35[.]99、nexus-cloud-360[.]com 等 |
| 变种二 — Kidkadi Dropper | 01bdbb37... (共 100+ 个 SHA-256 哈希,见原文) |
| Rhadamanthys C2 | 176[.]46[.]152[.]18:8181/gDatFeDway/... 、180[.]178[.]189[.]34:8181/... 等 |
| Kidkadi.node | 2ac4f1a2... 、f87b964e...(8 个 SHA-256 哈希) |
| HookPE.exe | ded68a8f... (SHA-256) |
附录 A:用户名黑名单
mashinesssss, sandbox, honey, vmware, currentuser, nepenthes, andy, hal9th, johndoe, wdagutilityaccount, abby, peter, wilson, hmarc, patex, john-pc, rdhj0cnfevzx, keecfmwgqj, frank, 8nl0colnq5bq, lisa, john, pxmduopvyx, 8vizsm, w0fjuovmcpa, lmvwjj9b, pqonjhvwxss, 3u2v9m8, julia, heuerzl, harry, johnson, j.seance, a.monaldo, tvmt, johanna, malware, maltest, virus, test, user, sand, bog, bruno, anand, it-admin, walker
附录 B:主机名黑名单
b30f0242-1c6a-4, desktop-vrsqlag, q9itrkphr, xc64zb, desktop-d019gdm, desktop-wi8clet, server1, lisa-pc, john-pc, desktop-b0t93d6, desktop-1pypk29, desktop-1y2433r, wileypc, wok, 6c4e733f-c2d9-4, ralphs-pc, desktop-wg3myjs, desktop-7xc6gez, desktop-5oy9s0o, qarzhrdbj, orelee, pc, archibaldpc, julia-pc, d1b_coursek, comname_5076, work, q9iatrkphr
附录 C:进程黑名单
human.exe, cred-store.exe, device-sense.exe, private-cloud-proxy.exe, tib_monitor_monitor.exe, tmsmonitor.exe, vmtoolsd.exe, adpagent.exe, fakenet.exe, dumpcap.exe, httpdebugger.exe, wireshark.exe, fiddler.exe, vboxservice.exe, df5serv.exe, vboxtray.exe, ollydbg.exe, pestudio.exe, vmwareuser.exe, vgautservice.exe, vmacthlp.exe, x96dbgn.exe, vmsrvc.exe, x32dbgn.exe, vmusrvc.exe, prl_cc.exe, prl_tools.exe, xenservice.exe, qemu-ga.exe, joeboxcontrol.exe, ksdumperclient.exe, ksdumper.exe, joeboxserver.exe, vmwareservice.exe, vmwaretray.exe, todaydeathdo.exe, mitmdump.exe, idaw.exe, vxtkernelsvcntmgr.exe, windbg.exe, dumpit.exe, procmon.exe, rammap.exe, rammap64.exe, inetsim.exe, hvix64.exe, ida64.exe, x64dbg.exe, cutter.exe, r2.exe, binaryninja.exe, dbgview.exe, tcpdump.exe, netcat.exe, idaq64.exe, frida-server.exe, frida-inject.exe, frida.exe, pin.exe, drrun.exe, apimonitor.exe, volatility.exe, rekall
附录 D:硬盘厂商黑名单
vmware, xen, msft, virtual, hyper-v, kvm, red hat, aws, azure, google, gcp, openstack, cinder, ovirt, citrix, virtuozzo, virtio
附录 E:显卡设备黑名单
virtualbox, graphics adapter, vbox disp adapter, qemu virtual video, hyper-v video, parallels display adapter, wddm, red hat qxl, xen vga, citrix display adapter
如果你对网络安全、红队攻防技术充满热情,渴望学习更多实战技巧,例如渗透测试、自动化脚本编写、免杀技术等, 欢迎关注我的公众号
在这里,我会持续分享更多高质量的技术文章,与你一同探索网络安全的奥秘,提升实战技能! 让我们一起在队攻防的道路上,不断精进,突破边界!
免责声明: 本文仅供安全技术研究与学习交流之用。 严禁将本文所提及的技术用于任何非法用途,包括但不限于未经授权的渗透测试、网络攻击、恶意代码传播等。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:红队工坊 aeverj
aeverj《GachiLoader:通过 API 跟踪击败 Node.js 恶意软件》