在过去几年中,恶意软件(以及某些笔测试工具,如Metasploit的meterpreter有效载荷)已开始使用reflective DLL injection (PDF)将DLL加载到进程的内存中。好处是文件永远不会写入磁盘并且难以检测。我见过的很多例子都基于Joachim Bauch's work。
然而,在DEF CON 20 Andrew King demonstrated that he was able to detect DLL's injected using reflective DLL injection。他的演讲被称为“Detecting Reflective Injection”。 不幸的是,他没有发布源代码(他当然没有义务这样做)。
更新:显然我错过了,但几年前安德鲁开源了这项工作:https://github.com/aking1012/dc20
此外,一个名为“Antimeter”的工具可以在使用反射dll注入加载时检测meterpreter引擎。再次,闭源。
据我所知,Andrew King的工具和Antimeter都是用Python编写的,并使用pydbg / pydasm来枚举运行可执行文件的内存。
有没有人有他们愿意分享的一些通用源代码(在Python,C,Delphi或其他方面),演示如何检测反射DLL注入?有一些内存取证工具可以分析内存转储并找到它,但我希望在运行的系统上执行一个应用程序(比如antimeter),并找到反射注入DLL的进程。
如果您有兴趣了解反射DLL注入的工作原理,可以使用一些open-source code written in Delphi来说明如何执行此操作。
更新: 我测试过,我可以反射性地注入没有管理员权限的DLL(以及作为普通用户),但当然作为用户我只能注入运行在相同完整性级别(以及在我的会话中)的进程......但这仍然涵盖Office套件,Internet Explorer等应用程序
答案 0 :(得分: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在内核空间内处理它。对? 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架构没有理由这样称呼它。
......只是一个想法,
将