stephenfewer/ReflectiveDLLInjection

GitHub: stephenfewer/ReflectiveDLLInjection

利用反射编程原理实现从内存直接加载 DLL 到目标进程的注入技术,无需依赖磁盘文件。

Stars: 3260 | Forks: 824

# 关于 反射式 DLL 注入是一种库注入技术,它利用反射编程的概念,将库从内存加载到宿主进程中。因此,该库通过实现一个最小的可移植可执行 (PE) 文件加载器来负责加载自身。这样,它就可以在与宿主系统和进程极少交互的情况下,控制自身的加载方式以及与宿主的交互方式。 该注入技术适用于从 Windows NT4 到 Windows 8(含)的系统,支持 x86、x64 和 ARM(如适用)架构。 # 概述 将库远程注入到进程的过程分为两步。首先,必须将要注入的库写入目标进程的地址空间(以下称为宿主进程)。其次,必须以满足库运行时期望的方式将库加载到该宿主进程中,例如解析其导入或将其重定位到内存中的合适位置。 假设我们在宿主进程中拥有代码执行权限,并且希望注入的库已经被写入宿主进程内存中的任意位置,反射式 DLL 注入的工作原理如下。 * 执行权限通过 `CreateRemoteThread()` 或一段微小的引导 shellcode 传递给库的 `ReflectiveLoader` 函数,该函数是库导出表中的一个导出函数。 * 由于库的镜像当前位于内存中的任意位置,`ReflectiveLoader` 将首先计算其自身镜像在内存中的当前位置,以便能够解析自己的头部供以后使用。 * `ReflectiveLoader` 随后将解析宿主进程的 `kernel32.dll` 导出表,以计算加载器所需的三个函数的地址,即 `LoadLibraryA`、`GetProcAddress` 和 `VirtualAlloc`。 * `ReflectiveLoader` 现在将分配一块连续的内存区域,并将其自身的镜像加载到该区域中。具体位置并不重要,因为加载器稍后会正确地重定位镜像。 * 库的头部和节被加载到内存中的新位置。 * `ReflectiveLoader` 随后将处理其镜像新加载副本的导入表,加载任何额外的库并解析它们各自的导入函数地址。 * `ReflectiveLoader` 随后将处理其镜像新加载副本的重定位表。 * `ReflectiveLoader` 随后将使用 `DLL_PROCESS_ATTACH` 参数调用其新加载镜像的入口点函数 `DllMain`。此时,库已成功加载到内存中。 * 最后,`ReflectiveLoader` 将执行权返回给调用它的初始引导 shellcode,如果是通过 `CreateRemoteThread` 调用的,则线程将终止。 # 构建 在 Visual Studio C++ 中打开“rdi.sln”文件,并以 Release 模式构建解决方案,以生成 inject.exe 和 reflective_dll.dll # 用法 使用 inject.exe 将 reflective_dll.dll 通过进程 ID 注入到宿主进程中进行测试,例如: # 许可证 根据 3 条款 BSD 许可证授权,详情请参阅 LICENSE.txt。
标签:C/C++, DLL注入, PE文件加载器, Reflective DLL Injection, Shellcode, SSH蜜罐, UML, Windows内核, x86/x64/ARM, 中高交互蜜罐, 事务性I/O, 免杀技术, 内存加载, 动态链接库, 安全攻防, 客户端加密, 恶意软件开发, 技术调研, 暴力破解检测, 流量审计, 白帽子, 端点可见性, 红队开发, 进程注入, 远程线程注入