易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

【全网首发】加载Dll时直接转向内存Dll,兼容性极佳   [复制链接]

    2022-09-05 08:56:00
    模块控件源码
    易语言资源网
    3032 次浏览
    来源链接

前言:

  • 本程序不是什么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直接声明便可直接使用。


点我下载 (已有 247 次下载)

引用模块





引用支持库


源码文件名 支持库文件名 支持库标识
main-test.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
另一个测试Dll.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
测试Dll.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325


[错误报告]   上一篇:vx3.7.6.29 wxid查好友信息...     下一篇:易语言多线程下载支持断点续传...