常见的dll注入思路都是在要注入的进程里开一个远程线程,然后再利用这个线程调用API函数loadlibrary,然后装载dll到要注入的进程中。
但是这种方法需要dll落地,然后过于常见。导致这种方法非常容易报毒。
而反射式dll注入则可以避免dll落地,同时也避免了使用loadlibrary函数。大致思路是为待注入的DLL添加一个导出函数,ReflectiveLoader,这个函数实现的功能就是装载它自身。那么我们只需要将这个DLL文件写入目标进程的虚拟空间中,然后通过DLL的导出表找到这个ReflectiveLoader并调用它,从而实现让dll自身不使用LoadLibraryA函数,将自身映射到目标进程内存中。
注射器
1.在目标进程开辟空间
2.将Payload写到开辟的空间去
3.最后调用DLL中的反射加载函数
DLL
1.获取目标进程PEB,从而获取一些需要用到的函数地址,如:VirtualAlloc。
2.复制PE头,由于PE头的形态并没有像节一样需要展开,所以为复制。
3.解析PE头,并加载节,与2不一样的是,这里用的是加载,到了节这里,已经在PE头中的信息指定了RVA,所以这里要进行“加载”。
4.处理导入表,获取导入函数的地址。
5.处理重定位表,由于基址和默认的加载地址不同,所以需要修改重定位表,否则,程序内的直接寻址会出问题。
6.调用镜像入口点,至此,镜像已经加载完毕。
https://github.com/stephenfewer/ReflectiveDLLInjection
https://github.com/sud01oo/ProcessInjection/tree/master/ReflectiveDLLPEForm
https://github.com/sud01oo/ProcessInjection/tree/master/ReflectiveDLLInjection
https://github.com/sud01oo/ProcessInjection/tree/master/ReflectiveDLL