Zypherion-Technologies/Nemesis

GitHub: Zypherion-Technologies/Nemesis

Nemesis 是一款 .NET 进程监控工具,通过在 native 层 hook CLR 来捕获反射式加载的内存程序集并检测 AMSI/ETW 绕过行为,专为分析 jlaive 风格的恶意软件加载器链而设计。

Stars: 39 | Forks: 4

# Nemesis [![网站](https://img.shields.io/badge/zypherion.tech-1f6feb?logo=googlechrome&logoColor=white)](https://www.zypherion.tech) [![Discord](https://img.shields.io/badge/Discord-5865F2?logo=discord&logoColor=white)](https://discord.gg/JXx32jKJXY) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?logo=telegram&logoColor=white)](https://t.me/zypherion_technologies) [![X](https://img.shields.io/badge/Follow-000000?logo=x&logoColor=white)](https://x.com/Zypherion_Tech) 我做的一个 Windows 工具,因为我厌倦了在恶意软件样本中盯着 jlaive 的各种 fork,却没有任何公开工具能在运行时真正将它们拆开分析。 简而言之,它是一个 .net 进程监视器,在 native 层 hook clr,跟踪反射式 assembly 加载,并自动直接从内存中 dump PE。它还会对照磁盘上的原始二进制文件检查 amsi 和 etw 的完整性,同时检测诸如 `clr.dll` 字符串 patch 和直接使用 `LoadFromBuffer` 等绕过技术。 ## 为什么叫这个名字? 你可能会想,为什么叫 nemesis 这个名字? 因为它代表了该工具的明确目的。nemesis 象征着持续挑战对手或导致其覆灭的存在,这正是这个项目背后的理念。 在希腊神话中,[nemesis](https://en.wikipedia.org/wiki/Nemesis_(mythology)) 是神圣复仇的化身,负责向那些过于傲慢或自认天下无敌的人施加报应。如果你问我的看法,对于那些吹嘘自己是“FUD”的恶意软件来说,这名字简直再合适不过了。 ## 为什么会有这个项目 我是一名恶意软件分析师。如果你从事这份工作(对我来说是爱好)足够久,你就会开始一遍又一遍地看到相同的 loader 链,尤其是自从 jlaive(也叫 crybat)火了之后,每个 script kiddy 都去 fork 它。 这个模式简单到有点蠢,但处理起来烦人得要命: ``` something.bat → obfuscated powershell → csharp stub → your actual payload ``` 你双击一个看起来像天书一样的 `.bat`。cmd 启动了一长串充满垃圾字符的 powershell。powershell 解密/解压了一个 .net stub(aes、gzip、base64)。这个 stub patch 了 amsi + etw,在内存中反射式加载了真正的 exe/dll,然后一切就结束了——没有任何有用的东西会以友好的形式落到磁盘上。 这让我很困扰。针对这种特定的链路,目前真的没有什么好的**公开**工具:在 .net payload 真正落地的地方进行 hook,在进程自我销毁之前将其 dump,并捕捉这些 stub 总是会做的 amsi/etw patch。所以我开发了 nemesis。 它不是万能药。它不会替代你的沙箱。但它为你提供了一个真实的工具,可以在测试机上针对可疑的 `.bat` 运行,并真正从中提取出有用信息。 ## 它的具体功能 **launcher** (`Launcher.exe`) - 创建挂起状态的目标进程(exe、bat、cmd 等等) - 在主线程运行之前注入 `Nemesis.dll` - 等待 nemesis 发出准备就绪的信号 - 恢复运行。如果目标进程派生了 powershell 子进程,launcher 也可以一并注入 **nemesis dll** (`Nemesis.dll`) - hook jlaive 风格 stub 实际会触发的 clr 加载路径: - `nLoadImage` - `nLoadFile` - `AssemblyNative::LoadFromBuffer`(基于 nLoadImage 的特征码解析) - 当内存中出现反射式 PE 时 -> 将其排入 dump 队列,保存至 `%TEMP%\Nemesis_dumps` - 将运行中的 `amsi.dll` / `ntdll.dll` 导出表与磁盘上的副本进行对比(捕捉经典的 `AmsiScanBuffer` / `EtwEventWrite` 上的 `ret` patch) - amsi 检查还会在 clr 加载时查看 clr 的 `.rdata` 字符串(有些绕过技术会去 patch 这些字符串,vxug 上有一篇关于此的很棒的论文,名为:`2024-11-21 - New AMSI Bypss Technique Modifying CLRDLL in Memory.pdf` ) - 记录到控制台(带颜色)+ `%TEMP%\Nemesis.log`,它还启用了 `ENABLE_VIRTUAL_TERMINAL_PROCESSING`,以避免控制台出现一些奇怪的问题 :D 基本上:让 bat 链运行,在 crypter 实际加载 payload 的地方捕捉它,并沿途记录下它使用的各种规避伎俩。 ## 证明: image image image ## 编译 需要安装带有 C++ 桌面开发 + masm (x64) 组件的 Visual Studio 2022 及以上版本。 打开 `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` - dump 出的 PE → `%TEMP%\Nemesis_dumps` ## nemesis 是什么 / 不是什么 **是:** - 针对类似 jlaive 风格 crypter(bat → ps1 → csharp 链)的运行时分析辅助工具 - 适合在实验环境的虚拟机中使用,当你手头有样本并希望获取内存 dump 及 amsi/etw 遥测数据时非常有用 - 欢迎其他分析师使用、扩展或吐槽 **不是:** - EDR 的替代品 - 不保证能抓到所有的 fork 变种(混淆方式会变,还会出现新的绕过技术,例如无 patch 的 amsi/etw,因为它目前还不是为此设计的,不过我计划在未来解决这个问题) 也许这会演变成某种托管语言工具包。 ## 注意事项 - 目前仅支持 x64,因为需要处理 clr 的 asm detours - cmd.exe 宿主进程通常没有 clr,不过 nemesis 无论如何都会发出就绪信号,因此 launcher 不会卡住;真正的工作会在 powershell/dotnet 出现时发生 - 编译时遇到 `LNK1104` 错误?说明还有进程占用着 nemesis.dll——结束目标进程后再重新编译即可 - 编译时出现 `pwsh.exe` 的 vcpkg 噪音是无害的,直接忽略即可 ## 延伸阅读(jlaive 生态系统) 如果你想了解你正在对抗的是什么: - [Trend Micro 关于 BatCloak / Jlaive 的分析](https://www.trendmicro.com/en_us/research/23/b/attackers-target-microsoft-users-with-batcloak-engine.html) — 解析 bat → ps1 → csharp 的多层结构 - [Fortinet 关于 ScrubCrypt 的分析](https://www.fortinet.com/blog/threat-research/scrubcrypt-deploys-venomrat-with-arsenal-of-plugins) — jlaive 令人头疼的继任者,如果你对 scrubcrypt 的不同之处感兴趣的话,那就是他们会在 .bat 中使用管道符(pipe sign)来传递命令,这招其实挺好用的... - [Unprotect.it — ScrubCrypt](https://unprotect.it/technique/scrubcrypt/) — 技术细节拆解 - https://github.com/backdoorskid/ClrAmsiScanPatcher - 找到了前面提到的 .net 字符串,强烈建议阅读那篇 .pdf 文件 :) ## 免责声明 **使用 nemesis 即表示您接受以下条款。** 本项目按“原样”提供,**不提供任何保证** —— 您需自行承担所有风险。 您需对合法、授权的使用(实验虚拟机、自有系统、已获得明确许可)负全责。在法律允许的最大范围内,作者及 [zypherion.tech](https://zypherion.tech) **对因使用或不当使用而产生的任何损害、损失或法律索赔不承担任何责任**。完整条款请参阅 [LICENSE](LICENSE)。 ## 许可证 **非商业 / 个人 / 研究 / 爱好用途** → [PolyForm Noncommercial 1.0.0](LICENSE) **商业用途**(出售它、作为付费产品、用于 SaaS、客户项目等) → 您需要获取单独的商业授权。PolyForm Noncommercial 许可证不涵盖此类用途。 如果您需要商业授权,请通过以下方式联系我: **[adam@zypherion.tech / @wd6g(discord) / telegram: @ZypherionTechnologies]** # 待办事项
标签:DAST, Ruby on Rails, 云资产清单, 内存转储, 多人体追踪, 恶意软件分析, 端点可见性, 逆向工程