|
分享源码
界面截图: |
|
是否带模块: |
纯源码 |
备注说明: |
- |
前言:
- 本程序不是什么Hook了LoadLibrary、GetProcAddress等简单粗暴地将Dll命令地址强行转向内存。
- 本程序的Dll加载和重定向部分全部由系统完成,稳定性和兼容性极好(理论上和原生LoadLibrary完全相同)
解析:
-
众所周知,系统Dll加载的一个核心函数是NtMapViewOfSection,这个函数负责将Dll文件映射到内存。
-
如果我们Hook了NtMapViewOfSection函数,在加载正常Dll时使用我们自己写的方案,将内存中的Dll数据二次映射到内存,替换掉原来的Dll,那么就可以实现Dll的直接内存加载。
-
为此需要重写一个NtMapViewOfSection:
-
重写的MyMapDll原理大致如下:
- 首先是解析Dll的IMAGE_SECTION_HEADER,计算Dll需要的内存。
- 分配相应大小的内存。
- 将Dll的SECTION写到内存中。
-
Map好Dll后,只需要将新映射好的内存地址和大小反馈会NtMapViewOfSection参数即可。
-
效果如下:
-
可以看到,显示加载了“测试Dll.dll”,实际上加载了内存中的Dll(如果你还记得我的第一个帖子的话,你会知道这里确实不是加载的“测试Dll.dll”)
PS:
- 为什么要使用这么麻烦的方法实现内存Dll?
- 首先现在论坛中所谓的内存Dll均存在或多或少的兼容性问题,而本方案则是相当于将内存Dll用最接近系统原生的方案进行加载(完全不考虑IAT,TLS等修复问题),理论上兼容性和原生LoadLibrary完全相同。
- 本方案无需继续Hook诸如LoadLibrary、GetProcAddress等函数用于重定向,加载好的Dll就是原生内存Dll,API直接声明便可直接使用。
附件下载:
main-test.zip
(402.24 KB, 下载次数: 1022)
|
评分
-
查看全部评分
|