【问题标题】:Get signatures of exported functions in a DLL获取 DLL 中导出函数的签名
【发布时间】:2010-09-28 00:28:06
【问题描述】:

是否可以从 DLL 中获取导出的(C 风格?)函数的签名(参数计数/类型、返回类型)?我可以使用DLL Export Viewer 查看函数名称、地址、序数等列表,但无法查看签名。我只有 dll 文件,没有 .h 和 .def 文件。

更新:使用名为API Monitor 的工具,我可以附加到使用上述 dll 的进程并查看对函数的调用。这让我可以看到参数的数量、返回值及其整数值(指针?),但这并没有多大帮助。我可能应该找到一种方法来确定这些指针在调用时指向的结构类型。

【问题讨论】:

    标签: c++ c function dll apimonitor


    【解决方案1】:

    DLL 不存储它们导出的函数的签名。其他答案提到了 C++,当一个 C++ 函数被导出为 C++ 时,这个名字确实会被破坏。使用正确的编译器的修饰方案对其进行解码,您将获得签名。但大多数 DLL 不使用其 C++ 名称导出 C++ 函数。相反,DLL 选择导出的函数是使用 C 样式名称导出的,因此即使 DLL 是用 C++ 编写的,导出的函数仍然没有任何签名信息。

    你没有标题?大多数供应商都在他们的 SDK 中包含了这类东西。如果你没有得到一个,然后向供应商投诉。如果您不应该得到一个,那么也许您正在以错误的方式执行任务;你确定你应该直接使用那个 DLL 吗?

    如果您没有头文件,那么您可能还会问自己,您是否真的被允许在法律上在您的程序中使用 DLL。如果它只是您在系统上找到的任意 DLL,那么即使您可以为它编写代码,也可能不允许在发布程序时重新分发它。

    【讨论】:

      【解决方案2】:

      对于 C 函数,此信息根本不存储在 DLL 中。我唯一能建议的就是反汇编函数并查看它如何与堆栈上的变量交互,然后尝试确定签名。

      祝你好运!

      【讨论】:

        【解决方案3】:

        在 C++ 中,函数签名是“mangled”以编译器依赖的方式进入名称。这在 C 中不会发生。因此,如果您的 DLL 中有 C 函数,您将看到未损坏的名称。如果它是 C++ 的,你会看到损坏的。

        C++ 需要修改名称以允许链接器解析具有不同签名的重载函数。

        我认为您没有任何方法可以从“C”DLL 中获取函数签名。他们根本不存在。

        【讨论】:

          猜你喜欢
          • 2011-01-02
          • 2015-07-21
          • 2015-03-19
          • 2019-06-02
          • 1970-01-01
          • 2012-12-20
          • 1970-01-01
          • 2013-08-17
          • 1970-01-01
          相关资源
          最近更新 更多