深入理解反射式dll注入技术

本文深入探讨反射式DLL注入技术,介绍了常规DLL注入的不足和反射式DLL注入的优势,详细讲解了反射式DLL注入的实现步骤,包括修复导入表和重定位表,并通过MSF migrate模块分析其工作原理。此外,还讨论了检测反射式DLL注入的方法和攻防对抗策略。
摘要由CSDN通过智能技术生成

 

前言

dll 注入技术是让某个进程主动加载指定的 dll 的技术。恶意软件为了提高隐蔽性,通常会使用 dll 注入技术将自身的恶意代码以 dll 的形式注入高可信进程。

常规的 dll 注入技术使用 LoadLibraryA() 函数来使被注入进程加载指定的 dll。常规dll注入的方式一个致命的缺陷是需要恶意的 dll 以文件的形式存储在受害者主机上。这样使得常规 dll 注入技术在受害者主机上留下痕迹较大,很容易被 edr 等安全产品检测到。为了弥补这个缺陷,stephen fewer 提出了反射式 dll 注入技术并在 github开源,反射式dll注入技术的优势在于可以使得恶意的dll通过 socket 等方式直接传输到目标进程内存并加载,期间无任何文件落地,安全产品的检测难度大大增加。

本文将从 dll 注入技术简介、msf migrate 模块剖析、检测思路和攻防对抗的思考等方向展开说明反射式 dll 注入技术。

dll注入技术简介

1 常规dll注入技术

常规 dll 注入有:

1)  通过调用 CreateRemoteThread()/NtCreateThread()/RtlCreateUserThread() 函数在被注入进程创建线程进行 dll 注入。

2)  通过调用 QueueUserAPC()/SetThreadContext() 函数来劫持被注入进程已存在的线程加载 dll。

3)  通过调用 SetWindowsHookEx() 函数来设置拦截事件,在发生对应的事件时,被注入进程执行拦截事件函数加载 dll。

以使用 CreateRemoteThread() 函数进行 dll 注入的方式为例,实现思路如下:

1)  获取被注入进程 PID。

2)  在注入进程的访问令牌中开启 SE_DEBUG_NAME 权限。

3)  使用 openOpenProcess() 函数获取被注入进程句柄。

4)  使用VirtualAllocEx()函数在被注入进程内开辟缓冲区并使用 WriteProcessMemory() 函数写入 DLL 路径的字符串。

5)  使用 GetProcAddress() 函数在当前进程加载的 kernel32.dll 找到 LoadLibraryA函数的地址。

6)  通过 CreateRemoteThread() 函数来调用 LoadLibraryA() 函数,在被注入进程新启动一个线程,使得被注入进程进程加载恶意的 DLL。

 

常规 dll 注入示意图如上图所示。该图直接从步骤3)开始,步骤1)和步骤2)不在赘述。

2 反射式dll注入技术

反射式 dll 注入与常规 dll 注入类似,而不同的地方在于反射式 dll 注入技术自己实现了一个 reflective loader() 函数来代替 LoadLibaryA() 函数去加载 dll,示意图如下图所示。蓝色的线表示与用常规dll注入相同的步骤,红框中的是 reflective loader() 函数行为,也是下面重点描述的地方。

Reflective loader 实现思路如下:

1)  获得被注入进程未解析的 dll 的基地址,即下图第7步所指的 dll。

2)  获得必要的 dll 句柄和函数为修复导入表做准备。

3)  分配一块新内存去取解析 dll,并把 pe 头复制到新内存中和将各节复制到新内存中。

4)  修复导入表和重定向表。

5)  执行 DllMain() 函数。

Msf migrate模块

msf 的 migrate 模块是 post 阶段的一个模块,其作用是将 meterpreter payload 从当前进程迁移到指定进程。

在获得 meterpreter session 后可以直接使用 migrate 命令迁移进程,其效果如下图所示:

migrate 的模块的实现和 stephen fewer 的 ReflectiveDLLInjection 项目大致相同,增加了一些细节,其实现原理如下:

1)  读取 metsrv.dll(metpreter payload模板dll)文件到内存中。

2)  生成最终的 payload。

  1. msf 生成一小段汇编 migrate stub 主要用于建立 socket 连接。

  2. 将 metsrv.dll 的 dos 头修改为一小段汇编 meterpreter_loader 主要用于调用reflective loader 函数和 dllmain 函数。在 metsrv.dll 的 config block 区填充meterpreter 建立 session 时的配置信息。

  3. 最后将 migrate stub 和修改后的 metsrv.dll 拼接在一起生成最终的 payload。

3)  向 msf server 发送 migrate 请求和 payload。

4)  msf 向迁移目标进程分配一块内存并写入 payload。

5)  msf 首先会创建的远程线程执行 migrate stub,如果失败了,就会尝试用 apc 注入的方式执行 migrate stub。migrate stub 会调用 meterpreter loader,meterpreter loader 才会调用 reflective loader。

6)  reflective loader 进行反射式 dll 注入。

7)  最后 msf client 和 msf server 建立一个新的 session。

原理图如下所示:

 

图中红色的线表示与常规反射式dll注入不同的地方。红色的填充表示修改内容,绿色的填充表示增加内容。migrate 模块的 reflective loader 是直接复用了 stephen fewer 的 ReflectiveDLLInjection 项目的 Refl

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听铃的声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值