关于
反射式DLL注入是一种库注入技术,它利用反射式编程的概念,将库从内存加载到宿主进程中。因此,该库通过实现一个最小的可移植可执行文件(PE)加载器来负责自身的加载。它可以在与宿主系统和进程进行最小交互的情况下,控制自身如何加载以及与宿主交互。
该注入技术适用于从Windows NT4到Windows 8(含)的系统,并在适用的x86、x64和ARM架构上运行。
概述
将库远程注入进程的过程分为两步。首先,您希望注入的库必须被写入目标进程(下文称为宿主进程)的地址空间。其次,该库必须以满足其运行时预期的方式加载到宿主进程中,例如解析其导入表或将其重定位到内存中的合适位置。
假设我们在宿主进程中拥有代码执行能力,并且希望注入的库已被写入宿主进程内存中的任意位置,那么反射式DLL注入的工作方式如下。
- 执行权通过CreateRemoteThread()或一个微小的引导shellcode传递给库的ReflectiveLoader函数,该函数是库导出表中找到的一个导出函数。
- 由于库的映像当前存在于内存中的任意位置,ReflectiveLoader将首先计算自身映像在内存中的当前位置,以便稍后解析其自身的头文件。
- 随后,ReflectiveLoader将解析宿主进程的kernel32.dll导出表,以计算加载器所需的三个函数的地址,即LoadLibraryA、GetProcAddress和VirtualAlloc。
- ReflectiveLoader现在将分配一块连续的内存区域,并在此区域中加载自身的映像。该位置并不重要,因为加载器稍后会正确重定位映像。
- 库的头文件和节区被加载到它们在内存中的新位置。
- ReflectiveLoader随后将处理其映像新加载副本的导入表,加载任何附加库并解析它们各自导入的函数地址。
- ReflectiveLoader随后将处理其映像新加载副本的重定位表。
- ReflectiveLoader随后将调用其新加载映像的入口点函数DllMain,并传入DLL_PROCESS_ATTACH。此时,该库已成功加载到内存中。
- 最后,ReflectiveLoader将执行权返回给最初调用它的引导shellcode,或者如果它是通过CreateRemoteThread调用的,则该线程将终止。
构建
在Visual Studio C++中打开'rdi.sln'文件,并以Release模式构建解决方案,以生成inject.exe和reflective_dll.dll。
用法
要测试,请使用inject.exe通过进程ID将reflective_dll.dll注入宿主进程,例如:
inject.exe 1234
许可证
根据三条款BSD许可证授权,详情请参阅LICENSE.txt。