检测reflectionDLL注入

在过去的几年中,恶意软件(以及一些笔式testing工具,如Metasploit的meterpreter载荷)已经开始使用reflection式DLL注入(PDF)将DLL加载到进程的内存中。 好处是文件永远不会写入磁盘,而且很难检测到。 我见过的很多例子都是基于Joachim Bauch的作品 。

然而,在DEF CON 20安德鲁·金表明,他能够检测DLL注入使用reflectionDLL注入 。 他的演讲被称为“ 检测reflection注射 ”。 不幸的是,他还没有发布源代码(他当然没有义务这么做)。

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

另外,一个名为“ Antimeter ”的工具可以在使用reflection型dll注入加载时检测meterpreter引擎。 再次,封闭的来源。

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

有没有人有一些通用的源代码(Python,C,Delphi或其他),他们愿意分享,演示如何检测reflectionDLL注入? 有内存取证工具,可以分析内存转储,并find这个,但我正在执行一个正在运行的系统上的应用程序(如antimeter),并findreflection注入DLL的过程。

如果你有兴趣了解如何reflectionDLL注入工作,有一些用Delphi写的开源代码 ,说明如何做到这一点。

更新 :我testing了,我可以reflection注入DLL的没有pipe理员权限(和作为一个普通用户),但当然作为一个用户,我只能注入进程在相同的完整性级别运行(在我的会话)…但仍涵盖Office套件,Internet Explorer等应用程序

Solutions Collecting From Web of "检测reflectionDLL注入"

怎样挂钩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在内核空间处理这个。 对? TODO:验证

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

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

如果你需要API挂钩的更多信息,只需要在网上询问或阅读大量的文章。 另一个候选钩子是:FlushInstructionCache(…)。 但是我认为只有暴雪正在使用这个作为warden反作弊模块,因为x86架构没有理由这样做。

… 只是一个想法,