检测反射DLL注入

Mic*_*ick 22 c python windows delphi winapi

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

然而,在DEF CON 20中,Andrew King证明他能够使用反射DLL注入来检测DLL的注入.他的演讲被称为" 检测反射注射 ".不幸的是,他没有发布源代码(他当然没有义务这样做).

更新:显然我错过了,但几年前安德鲁做了这项工作的开源: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等应用程序.

msc*_*ock 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 
);
Run Code Online (Sandbox Code Playgroud)

如果您在程序的一开始就挂钩它,则可以过滤掉可疑的保护调用(启用代码执行的调用)。然后,我会扫描请求页面前面的 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
}
Run Code Online (Sandbox Code Playgroud)

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

... 只是一个想法,

将要