如何调用 DLL 的非导出函数?

Posted

技术标签:

【中文标题】如何调用 DLL 的非导出函数?【英文标题】:How to call non-exported functions of a DLL? 【发布时间】:2011-01-16 21:46:13 【问题描述】:

我需要调用(获取)DLL 的非导出函数。与 PE 导出表不同,非导出表没有任何包含这些条目的表。此外,所有像 IDAPro 和其他调试器这样的反汇编程序只显示带有修饰名称的导出函数名称(在 IDA 的情况下,在 Shift+F3 之后)并显示所有其他函数,如 sub_000FF 之类的。

知道如何以编程方式获取和调用DLL 的非导出函数吗? (GetProcAddressLoadLibrary 之后只调用不是为非导出设计的修饰导出函数。)

【问题讨论】:

你如何知道你需要调用的函数(原型)。有来源吗? 实际上,所有非导出函数的函数签名(原型)本身都需要 DLL 才能进行调用。我正在编写一个调试器实用程序,它需要调用和测试这些非导出函数。对于调用,我们需要知道函数签名(它需要的输入/输出参数),导出函数在调用之前总是未修饰(因为我们知道它们的地址并且在未修饰之后,我们得到完整的签名)如果是非导出函数,我们不知道这些函数在哪里,而且它们没有被装饰,也没有放在任何表中(例如导出表) 了解函数签名(原型)是第一步,让它们调用是第二步。这就是为什么我们首先需要所有未导出的函数签名。但是如何...???? 你真的需要知道原型吗? DLL 使用 stdcall 调用约定,因此清除了他们自己的堆栈(他们“知道”他们得到了多少参数) FARPROC WINAPI proc = GetModuleHandle("mylib") + @Usman:您似乎有混淆的主题。 dll 不需要原型,C 和类似语言编译时需要原型。 dll 实际上不再具有该信息。 DLL 通常还会内联/删除未导出的函数,因此它们可能不存在而无法直接调用。 【参考方案1】:

使用 DIA SDK 后我自己解决了这个问题。

我从那里收集了函数地址,然后通过汇编程序我可以直接调用该函数。 谢谢大家的cmets。

【讨论】:

他使用了*.pdb 调试数据库文件。它始终可用,尤其是对于生产程序(非调试)

以上是关于如何调用 DLL 的非导出函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有的dll里没有导出函数?

MFC生成的DLL导出类的函数,在Qt中如何调用

寻找如何在 VS 9 中调试到导出的 dll 函数。可能吗?

怎么提取DLL文件中的导出函数呢?

如何显示 DLL 可导出的函数

是否可以调用驻留在 exe 中的非导出函数?