【问题标题】:How to call function from DLL with only function name ? C++如何仅使用函数名从 DLL 调用函数? C++
【发布时间】:2019-11-24 11:15:33
【问题描述】:

可以在不知道函数原型的情况下从 DLL 文件调用函数吗?我尝试使用 pe-parser 库从 DLL 文件中提取所有导出的函数,但我只有函数名称,我不知道函数输入/输出。是否有任何解决方案可以从 dll 文件中找到导出的函数输入/输出?还是在不知道函数原型的情况下调用函数?

【问题讨论】:

  • 您当然可以在不知道其签名的情况下调用 DLL 中的函数,但除非您碰巧获得正确的签名,否则程序将具有未定义的行为。函数需要的参数将从堆栈中挑选出来,如果你没有把这些参数放在那里,它会挑选它可以在堆栈上找到的东西,相信它确实是正确的参数。返回值也是如此。这不是正确的方法。
  • 不确定您要做什么,但简短的回答是否定的,没有。在你打电话之前,你必须知道你在打电话。仅仅拥有函数地址是不够的,而且缺少一些 c++ 名称解构和/或反汇编程序业务端的一些重要时间,你只是没有它。这就是为什么打算公开调用的库提供描述参数、调用约定等的适当标题。
  • @WhozCraig, 描述参数的标题 我没有头文件。并在 DLL 文件中找到导出的函数,但我不知道如何调用该函数。
  • 我明白你想要什么。我(和其他所有人)告诉你的是没有灵丹妙药。正如先知贾格尔几十年前所宣称的那样,“你不能总是得到你想要的。”如果没有具有正确调用约定和参数描述的函数指针类型,您能做的最好的事情就是临时的、偶然发生的、老式的反汇编。这是一个颠簸的旅程,所以祝你好运。如果您有 PDB,那将有很大帮助,但如果您甚至没有标头,我假设 PDB 已经远离雷达。

标签: c++ windows dll function-pointers


【解决方案1】:

TL;DR - 没有。

为了正确调用函数,你需要知道函数原型。它通常在 DLL 附带的 h 文件中提供。

您可以尝试对 DLL 进行逆向工程以找出原型,但此信息不是 PE 文件的一部分。

如果您有一个 PDB 文件,您可以从中提取相关信息。见this answer

【讨论】:

  • 它通常在一个h文件中提供......我没有它,想知道DLL文件中的导出函数。
【解决方案2】:

我不明白为什么每个人都感到惊讶,这是完全正常的问题。 Steve P.Miller 有一个名为“Dependency walker”的程序:https://www.dependencywalker.com/ 该程序曾经与 Windows SDK 一起分发,但在某些时候微软决定忘记它。我还在用这个程序。

我使用的是 2.2.6000 版本,2006 年 10 月 29 日构建的,完全没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多