代码之家  ›  专栏  ›  技术社区  ›  Didier Trosset

如何用简单的jmp程序集实现导入库?

  •  1
  • Didier Trosset  · 技术社区  · 16 年前

    生成的导入库(用于链接将加载dll的程序的导入库)AFAICS以程序集的形式实现对导入函数的各种调用 jmp 支柱。

    这看起来确实是一个非常理想的解决方案。它不需要第二次推送参数,也不需要从调用返回。

    我想创建自己的导入库,在其中添加一些其他函数。为此,我必须打电话给 LoadLibrary() GetProcAddress() 函数获取dll中函数的地址。但是,我必须提供自己的函数,这些函数将通过函数地址调用导入的函数。但这意味着两个调用,并再次推送堆栈上的参数。我希望这个双重调用得到优化。

    有人知道在C中实现一个导入库的方法吗 jmp公司 诡计?(或者编译器是否优化了trail调用?)

    1 回复  |  直到 16 年前
        1
  •  1
  •   torak    16 年前

    听起来你可能对我认为的“函数转发”感兴趣。它允许您从一个DLL中导出一个函数,该DLL实际上是在另一个DLL中实现的。

    应该是最有效的解决方案

    1. 您不需要调用LoadLibrary()/getprocadaddress()
    2. 从导出dll导入时,加载程序将实际实现的地址存储在导入表中,因此 call 还有一个 jmp

    可能最简单的实现方法是

    #pragma comment(linker, "/export:ExportedFuncName=ActualDll.ActualFuncName")
    

    如果您想知道,这实际上等同于在链接器命令行上传递“/export:ExportedFuncName=actualdl.ActualFuncName”。也可以使用模块定义(.DEF)文件的导出部分来执行此操作。见底部 here 详细情况。