为什么反射dll注入需要在目标进程中执行加载?

逆向工程 dll注入
2021-06-18 14:05:13

我不确定我是否理解反射加载。

注入器进程在目标中分配内存,写入存根和要加载的 dll 二进制文件,存根在该二进制文件中调用 ReflectiveLoad。ReflectiveLoad 然后执行 Windows 加载程序将执行的操作,以便正确映射 dll 并在需要时访问导入。

让我困惑的是,手动加载部分原则上可以由注入器完成,仍然实现不掉文件吗?我的意思是从注入器的进程中读取目标的内存,以确定如何将 dll 加载到目标中分配的内存地址处。是需要还是方便?为什么会做出这样的选择?

1个回答

是的,可以在注入 DLL 之前在注入器过程中执行必要的加载步骤(即解析导入地址),并且一些注入器/恶意软件会这样做。例如参见地址0x18007CD00我的科姆拉茨IDB

但是,这样做比较麻烦,因为目标进程(也不是注入器进程)可能尚未加载某些必需的 DLL。因此,您必须在注入之前将一个或多个线程注入目标以加载导入的 DLL。要获取导入函数的地址,您还必须在注入器进程中加载​​ DLL(这应该可以工作,因为 Windows ASLR 不会重新随机化已加载的 DLL 的基地址,因为内存因为 DLL 将被共享),或者您必须在目标进程中解析导入地址,因此需要创建更多线程。反射加载通过强制 DLL 在开始正常执行之前加载它自己的导入来绕过这一点。