如何仅使用函数名从 DLL 调用函数? C++

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于如何仅使用函数名从 DLL 调用函数? C++的主要内容,如果未能解决你的问题,请参考以下文章

c++调用dll导出函数

如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅仅是 DLL 文件)

从 Qt (c++) 调用 DLL 中的函数

Visual Lisp:如何调用外部 C++ DLL 中的函数

c++ 怎么调用 dll?

从 C++ 调用 DLL 中的函数