内存加载模块,支持32/64 DLL文件

http://blog.csdn.net/wr960204/article/details/2134157

上几天有人说找遍互联网也找不到内存加载模块能够成功加载DelphiXE2编译出来的的64位DLL的.

看了一下,其实DelphiXE2编译出来的DLL本身是没问题的,而是这些内存加载忽略了X64情况下异常处理和X86不同.而XE2编译出来的 DLL的DLLMain的退出地方用到了halt0,这里面又用的抛异常方式跳出来的.这里就用到了64位PE文件的异常处理部分.而VC等编译的DLL 如果没有用到SEH则不会出现问题.

花了2天写了这个相对可以完整的处理32/64位Windows动态库的加载模块.

 

上传到了谷歌Code.如果哪位兄弟改了代码记得通知我哦.

http://code.google.com/p/delphi-memory-module/

大家需要看的可以在上面链接的SVN上拉取代码.也可以在这里下载.

32/位64位通用内存加载模块代码

此条目发表在Delphi, 未分类分类目录。将固定链接加入收藏夹。

内存加载模块,支持32/64 DLL文件》有21条回应

  1. 匿名说:

    很多VC DLL加载不了。。
    如果能加载user32.dll这类的系统DLL就好了。^_^

    • admin说:

      user32.dll是可以加载的.但是加载后没有模块句柄.系统是不知道的.如果你的程序有界面还是会尝试调用user32.dll,会有问题的.

  2. 匿名说:

    老大,测试了一下,不支持加过壳的DLL

  3. dunken说:

    老大,在WIN8 64 位操作系统 下, 用 DELPHI XE 32的DLL 加载失败
    如果有新的帮发一个 272487184@QQ.COM

  4. dunken说:

    BTMemoryModule.PAS 只找到了32位的

  5. Core说:

    松哥 你的这个加载dll的有崩溃的迹象
    delphi xe编译x32位 exe 去加载delphi7 编译的DLL 直接崩溃。。。。

  6. 谢谢说:

    松哥:

    遇到麻烦了,win7、Delphi XE3、32位程序,调用DLL函数成功,调用MemFreeLibrary(FM)释放内存后弹出错误:
    Access violation at address 00409078 in module ‘程序名.exe’.Read of address 0307C2A4
    如果不调用释放(或者不调用DLL函数直接释放)就不会出错,但内存渐长不行啊。
    用try *** except,不会在except下弹出异常,貌似在全部代码结束后才弹出的。
    在网上找了另一个和您这个功能相同但写法不同的代码,测试后结果还是一样。
    我没改您的代码,找不到问题在哪,请松哥帮忙啊!
    谢了!

    • 谢谢说:

      补充:
      我是调用DLL函数成功后立即MemFreeLibrary(FM)释放的,刚才发现,用两个按钮,一个调用DLL函数,另一个再释放,这样就不会出错,内存也被减下来了。难道有异步,释放需要延时?求解!

      • 谢谢说:

        再补充:
        确实邪门!延时10秒后释放也报错,调用按钮2的过程来释放也报错,只要在同一个按钮事件中释放就报错。只要分开两个按钮,快速点击都不报错。疑惑…..

  7. lzl_17948876说:

    老大, 请教下, 调用你的单元加载dll没问题, 但是dll中用到了GetModuleFileName来获取当前dll所在路径, 并且加载这个路径下的其他文件(只读取, 不是加载其他dll)

    这时, 内存加载后, 发现GetModuleFileName获取不到路径信息, 这个如何解决呢
    网上查了查, 只找到一篇文章说附加个PeBlock, 奈何我才疏学浅没看明白….-_-
    https://blog.csdn.net/lisunlin0/article/details/1748173

    希望老大有时间能够指点一下

    • admin说:

      实际上根源在于是内存加载DLL,不存在模块和文件的概念。GetModuleFileName也就有问题。
      我之前遇到这个问题都是HOOK这几个函数的。返回我希望给回的文件名。
      如果要彻底改变就修改PEB中的模块链表,给它加个模块。这样在操作系统层面看起来就完全是个正常模块,但是似乎又失去了内存加载的意义。

  8. lzl_17948876说:

    哈 昨天折腾了一天系统, 没来得及看, 感谢老大回复
    暂时我使用SetCurrentDirectory来指定工作目录解决了, 不过需要同步修改dll, 好在dll也是自己写的
    万分感谢~

  9. zzk_1说:

    不支持加过壳的DLL的问题,松哥能解决一下吗? 谢谢!

  10. zzk_1说:

    用ASPack_2.4压缩后,windows的loadlibrary、GetProcAddress可以自由地加载dll,但用MemGetProcAddress操作就提示读地址为全0

评论已关闭。