众所周知,系统Dll加载的一个核心函数是NtMapViewOfSection,这个函数负责将Dll文件映射到内存。
如果我们Hook了NtMapViewOfSection函数,在加载正常Dll时使用我们自己写的方案,将内存中的Dll数据二次映射到内存,替换掉原来的Dll,那么就可以实现Dll的直接内存加载。
为此需要重写一个NtMapViewOfSection:
重写的MyMapDll原理大致如下:
Map好Dll后,只需要将新映射好的内存地址和大小反馈会NtMapViewOfSection参数即可。
效果如下:
可以看到,显示加载了“测试Dll.dll”,实际上加载了内存中的Dll(如果你还记得我的第一个帖子的话,你会知道这里确实不是加载的“测试Dll.dll”)