Python 检测反射DLL注入
在过去几年中,恶意软件(以及一些笔测试工具,如Metasploit的MeterMeter有效负载)开始用于将DLL加载到进程的内存中。这样做的好处是,该文件从未写入磁盘,而且很难检测到。我看到的许多例子都是基于 然而,在。他的演讲被称为“演讲”。不幸的是,他没有发布源代码(他当然没有义务这么做) 更新:显然我错过了,但安德鲁几年前做了开源的这项工作: 此外,当使用反射dll注入加载时,名为“”的工具可以检测MeterMeter引擎。同样,闭源代码 我知道Andrew King的工具和Antimeter都是用Python编写的,并且使用pydbg/pydasm来枚举运行中可执行文件的内存 有没有人愿意分享一些通用的源代码(Python、C、Delphi或其他语言)来演示如何检测反射DLL注入?有一些内存取证工具可以分析内存转储并找到它,但我希望在运行的系统上执行应用程序(就像antimeter一样),并找到具有反射注入DLL的进程 如果您有兴趣了解反射DLL注入是如何工作的,那么有一些演示了如何做到这一点 更新:Python 检测反射DLL注入,python,c,windows,delphi,winapi,Python,C,Windows,Delphi,Winapi,在过去几年中,恶意软件(以及一些笔测试工具,如Metasploit的MeterMeter有效负载)开始用于将DLL加载到进程的内存中。这样做的好处是,该文件从未写入磁盘,而且很难检测到。我看到的许多例子都是基于 然而,在。他的演讲被称为“演讲”。不幸的是,他没有发布源代码(他当然没有义务这么做) 更新:显然我错过了,但安德鲁几年前做了开源的这项工作: 此外,当使用反射dll注入加载时,名为“”的工具可以检测MeterMeter引擎。同样,闭源代码 我知道Andrew King的工具和Antime
我进行了测试,可以反射性地注入DLL,而无需管理员权限(作为普通用户),但作为用户,我当然只能注入以相同完整性级别运行的进程(在我的会话中)……但这仍然包括Office套件、Internet Explorer等应用程序。挂接VirtualProtect API怎么样。因为加载自身的DLL肯定会在其内存代码范围内设置execute。这是因为(正如您所提到的)他们使用用户访问权限,因此他们必须使用process userspace 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”标记:
如果你需要更多关于API挂钩的信息,只需在网上询问或阅读大量文章即可。另一个挂钩候选对象是:FlushInstructionCache(…)。但我认为只有暴雪将其用于典狱长反作弊模块,因为x86体系结构上没有理由称之为此
。。。只是一个想法
will值得注意:您链接的论文指出,“如果要执行这些步骤,您应该在主机进程中执行某种形式的代码,这可能是通过利用远程代码执行漏洞获得的。”因此,您正在处理一台已经受损的机器,使用的是更多的“行人”技术,不一定。我可以在我拥有管理员权限的系统上使用Delphi(或C++)进行此操作:。但是你是对的,这种攻击需要一些复杂度…或者稍微复杂一点,假设你可以使用Metasploit框架,并且你的目标至少有1个未修补的Java vuln或IE 0-day:)如果你有管理员权限,你可以做任何事。@DavidHeffernan:如果我正确阅读了链接文章,反射DLL注入不需要管理员权限。这个练习的主要目的似乎是让恶意代码对AV软件隐藏起来。(更具体地说,它允许您以编写任何其他Windows DLL的相同方式编写隐藏的恶意代码。)在Antimeter页面的评论中,作者解释说,他只是在内存中搜索与MeterMeter相关的字符串。这对我来说都是非常新的,因此是一个很好的学习机会。您是否设法验证了您的
待办事项
?
char* pe = ((char*)BaseAddress) - 0x1000;
if ((NewAccessProtection == PAGE_EXECUTE || ... ) & pe[0] == 'M' && pe[0] == 'Z')
{
// do checks here
}