我做了这个 Windows 工具,因为我厌倦了在恶意软件样本中看到一堆 jlaive 的 fork,却没有一个公开的工具能在运行时真正把它们拆解开来。
简而言之,它是一个 .NET 进程监视器,在原生层挂钩 CLR,跟踪反射式程序集加载,并直接从内存中自动转储 PE。它还会对照原始磁盘二进制文件检查 AMSI 和 ETW 的完整性,同时检测诸如 clr.dll 字符串修补和直接 LoadFromBuffer 使用等绕过技术。
在哪里找样本?我建议看看 https://tria.ge(不是广告),你可以下载任何想要的样本,并根据家族进行筛选。
你可能想知道,为什么叫 Nemesis?
因为它代表了这工具的准确用途。Nemesis 是对手永恒的挑战或克星——这正是这个项目的理念。
在希腊神话中,Nemesis 是神圣报应之神,专门惩罚那些过于傲慢或自以为无法被触及的人。对于那些吹嘘自己“FUD”的恶意软件来说,这个名字再贴切不过了,你说呢?
我是一名恶意软件分析师。如果你干这行够久(对我来说是爱好),你会反复看到同样的加载器链条,尤其是自从 jlaive(也叫 crybat)流行起来,每个脚本小子都 fork 了一个。
这种模式愚蠢又简单,但处理起来烦人得很:
something.bat → 混淆后的 PowerShell → C# 存根 → 你的实际载荷
你双击一个看起来像乱码的 .bat。cmd 启动 PowerShell,传进去一堆垃圾文本。PowerShell 解密/解压一个 .NET 存根(AES、Gzip、Base64)。那个存根修补 AMSI + ETW,在内存中反射加载真正的 EXE/DLL,然后你就完事了——没有任何友好的东西以可用形式落到磁盘上。
这让我很烦。没有一款真正好用的公开工具专注于对抗这种特定链条:在 .NET payload 实际加载的地方挂钩,在进程自毁前转储它,捕获这些存根总是会做的 AMSI/ETW 修补。所以我构建了 Nemesis。
它不是银弹,也不会取代你的沙箱。但它能给你一个实实在在的东西,让你在测试机上对着可疑的 .bat 运行,并真正提取出工件。
启动器 (Launcher.exe)
Nemesis.dllNemesis DLL (Nemesis.dll)
nLoadImagenLoadFileAssemblyNative::LoadFromBuffer(通过 nLoadImage 解析出模式)%TEMP%\Nemesis_dumpsamsi.dll / ntdll.dll 的导出项与磁盘上的副本进行比较(捕获经典的 ret 修补:AmsiScanBuffer / EtwEventWrite).rdata 字符串(有些绕过会改为修补这些字符串,有一篇很棒的 VXUG 论文讲这个;标题是 2024-11-21 - New AMSI Bypss Technique Modifying CLRDLL in Memory.pdf)%TEMP%\Nemesis.log。它还启用了 ENABLE_VIRTUAL_TERMINAL_PROCESSING,以避免控制台出现一些奇怪的问题 :D简而言之:让 .bat 链条运行,在加密器实际加载载荷的地方捕获它,并记录沿途的规避技巧。
需要 Visual Studio 2022+,包含 C++ 桌面开发以及 MASM(x64)。
打开 Nemesis.slnx,选择 Release | x64,生成解决方案。
这是实际使用场景:将其指向一个可疑的 .bat,看看会掉出什么:
cd x64\Release
.\Launcher.exe "C:\path\to\suspicious.bat"
-- 后的额外参数会传递给目标:
.\Launcher.exe myapp.exe -- --some-flag
自定义 DLL 路径:
.\Launcher.exe --dll C:\path\Nemesis.dll myapp.exe
产物:
%TEMP%\Nemesis.log%TEMP%\Nemesis_dumps是:
不是:
LNK1104?可能是仍有 Nemesis.dll 被加载,杀掉目标进程再重建pwsh.exe 出现的 vcpkg 输出是无害的,忽略即可如果你想了解你正在对抗的东西:
|)来传递命令,效果很好...使用 Nemesis 即表示你接受以下条款。 它按“现状”提供,不附带任何担保——你承担所有风险。
你自行负责合法、授权的使用(实验室虚拟机、自有系统、明确许可)。在法律允许的最大范围内,作者和 zypherion.tech 不承担因使用或滥用而产生的任何损害、损失或法律索赔的责任。详见 LICENSE。
非商业 / 个人 / 研究 / 爱好用途 → PolyForm Noncommercial 1.0.0
商业用途(出售、付费产品、SaaS、客户工作等)→ 你需要单独的许可证。PolyForm Noncommercial 不涵盖这种情况。
想要商业许可证请联系我:
[[email protected] / @wd6g (Discord) / Telegram: @ZypherionTechnologies]
快速备注:我需要研究一下 compilemethod 并修复它。目前它并不是很需要,因为加密器通常根本不使用它……它们得用
asm.load(...)另外提醒了我,我需要检查 rdata 字符串,因为我很遗憾还没好好测试它…… 请不要用愚蠢的代码提交 PR。你不能正常挂接 n(Native) 后端,比如 nLoadImage,你必须保留寄存器,这很烦人,所以我们才使用 asm。