22

在过去的几年里,恶意软件(以及一些渗透测试工具,如 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、C、Delphi 或其他)来演示如何检测反射 DLL 注入?有内存取证工具可以分析内存转储并找到它,但我希望在正在运行的系统上执行应用程序(就像 antimeter 一样)并找到反射注入 DLL 的进程。

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

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

4

1 回答 1

4

挂钩 VirtualProtect API 怎么样。因为加载自身的 DLL 肯定会在其内存代码范围内设置执行。这是因为(正如您所提到的)他们使用用户访问权限,因此他们必须使用进程用户空间 API。

NTSYSAPI NTSTATUS NTAPI ZwProtectVirtualMemory(
    IN HANDLE ProcessHandle,
    IN PVOID *  BaseAddress,
    IN SIZE_T *     NumberOfBytesToProtect,
    IN ULONG    NewAccessProtection,
    OUT PULONG  OldAccessProtection 
);

如果您在程序的一开始就挂钩,您可以过滤掉可疑的保护调用(启用代码执行的调用)。然后,我会在请求的页面前面扫描 PE 标头等,以了解它是一个可加载的模块...注意:我认为常规 DLL 不会调用此功能,因为 LoadLibrary 在内核空间内处理此问题。正确的?待办事项:验证

通常,PE 标头位于第一个可执行代码前面的 0x1000(4096)字节或一页。所以一个非常基本的方法可以是扫描“MZ”标签:

char* pe = ((char*)BaseAddress) - 0x1000;
if ((NewAccessProtection == PAGE_EXECUTE || ... ) & pe[0] == 'M' && pe[0] == 'Z')
{
    // do checks here
}

如果您需要有关 API 挂钩的更多信息,请询问或阅读网络上的大量文章。另一个挂钩候选者是:FlushInstructionCache(...)。但我认为只有暴雪将它用于守望者反作弊模块,因为 x86 架构没有理由调用它。

... 只是一个想法,

将要

于 2012-10-05T13:07:41.450 回答