检测反射 DLL 注入

信息安全 视窗 恶意软件 注射 反恶意软件 元数据
2021-09-03 02:58:57

在过去的几年里,恶意软件(以及一些渗透测试工具,如 Metasploit 的 Meterpreter 有效负载)已经开始使用反射 DLL 注入 (PDF)将 DLL 加载到进程的内存中。好处是文件永远不会写入磁盘并且很难检测到。我看到的许多例子都是基于Joachim Bauch 的工作

然而,在DEF CON 20 上,Andrew King 证明他能够使用反射 DLL injection 检测 DLL 的注入他的演讲名为“ Detecting Reflective Injection ”。不幸的是,他没有发布源代码(他当然没有义务这样做)。

更新:显然我错过了,但安德鲁几年前做了开源这项工作:https ://github.com/aking1012/dc20

此外,一个名为“ Antimeter ”的工具可以在使用反射dll注入加载时检测到meterpreter引擎。再次,闭源。

我知道 Andrew King 的工具和 Antimeter 都是用 Python 编写的,并且使用 pydbg/pydasm 来枚举正在运行的可执行文件的内存。

有没有人愿意分享一些通用的源代码(Python 或其他)来演示如何检测反射 DLL 注入?有内存取证工具可以分析内存转储并找到它,但我希望在正在运行的系统上执行应用程序(就像 antimeter 一样)并找到反射注入 DLL 的进程。

如果您有兴趣了解反射 DLL 注入的工作原理,有一些用 Delphi 编写的开源代码展示了如何做到这一点。

更新:我进行了测试,我可以在没有管理员权限的情况下(并且作为普通用户)反射性地注入 DLL,但当然作为用户,我只能注入以相同完整性级别运行的进程(以及在我的会话中)......但是仍然涵盖 Office 套件、Internet Explorer 等应用程序。

4个回答

考虑一下反射 DLL 注入是什么:您利用应用程序让它执行任意代码,然后这个 shell 代码将一个 DLL 作为数据块加载到内存中(到目前为止所有标准 shell 代码的东西......),然后让它执行这样的DLL 通过 PE 加载器将自身作为 DLL 正确加载。整个想法的目的:让您编写一个完整的应用程序,该应用程序可以用您选择的语言编译成 DLL,而不是将整个恶意软件编写为具有固定内存偏移的汇编代码。

因此,要进行检测,您需要查找仅存在于内存中而不存在于磁盘上并且正在其中运行代码的 PE 文件。因此,通过可执行内存 blob 扫描看起来像 PE 文件但与磁盘文件无关的东西。这可以作为开发后取证来完成。或者,如果您想实时检测通常与反射 DLL 注入相关的挂钩调用,例如 LoadLibrary、GetProcAddress 和 VirtualAlloc,并更智能地执行上一步。ambuships.com

我知道这已经很老了,但我正在为将来可能遇到的其他人添加这个。

诸如遍历 VAD 树之类的技术对于查找反射注入的 DLL 很有用,只要它们没有使用特定的反取证技术来掩盖其在该区域的踪迹。2007 年有一篇关于此的取证论文 ( PDF ),可能有助于未来检测这些问题的努力。

检测并不像在进程的 PEB(进程环境块,反射 DLL 未注册)中查看加载的模块列表那样简单;但是,通过良好的交叉引用和此类工具可以使用 VAD 树进行检测。VAD 树可以在进程的 EPROCESS 块中找到(存储在系统空间中)。

我编写了一个工具(在 C# 和 powershell 中使用反射),它遍历线程堆栈并使用 GetMappedFile 报告函数调用的加载位置。如果 MappedFile 属性为空,则显示所有函数从哪里执行(即哪个 dll 和磁盘上的位置),很可能是反射加载的;)https://github.com/secabstraction/PowerWalker

我已经完成了一个大型安全产品。VAD 在内核模式下行走,还借助检测远程线程的功能。

首先,您检测远程线程以获取内存位置。注入的线程大多有一个不在应用程序加载的任何模块中的起始地址。这不会发生,之后您可以在内存中回溯并检测 PE 标头或 IAT/EAT 部分,这可以帮助定位注入恶意代码的位置