如何调用 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
的非导出函数吗? (GetProcAddress
在LoadLibrary
之后只调用不是为非导出设计的修饰导出函数。)
【问题讨论】:
你如何知道你需要调用的函数(原型)。有来源吗? 实际上,所有非导出函数的函数签名(原型)本身都需要 DLL 才能进行调用。我正在编写一个调试器实用程序,它需要调用和测试这些非导出函数。对于调用,我们需要知道函数签名(它需要的输入/输出参数),导出函数在调用之前总是未修饰(因为我们知道它们的地址并且在未修饰之后,我们得到完整的签名)如果是非导出函数,我们不知道这些函数在哪里,而且它们没有被装饰,也没有放在任何表中(例如导出表) 了解函数签名(原型)是第一步,让它们调用是第二步。这就是为什么我们首先需要所有未导出的函数签名。但是如何...???? 你真的需要知道原型吗? DLL 使用 stdcall 调用约定,因此清除了他们自己的堆栈(他们“知道”他们得到了多少参数) FARPROC WINAPI proc = GetModuleHandle("mylib") +使用 DIA SDK 后我自己解决了这个问题。
我从那里收集了函数地址,然后通过汇编程序我可以直接调用该函数。 谢谢大家的cmets。
【讨论】:
他使用了*.pdb
调试数据库文件。它始终可用,尤其是对于生产程序(非调试)以上是关于如何调用 DLL 的非导出函数?的主要内容,如果未能解决你的问题,请参考以下文章