在Win32 C ++中调用未导出的函数

时间:2009-08-28 01:47:12

标签: c++ function winapi

如何在Win32 C ++中调用未导出的函数?

3 个答案:

答案 0 :(得分:6)

调用与代码相同的模块(DLL / EXE)中定义的未导出函数:只需像调用其他C ++函数一样调用它们。显然这不是你所要求的。如果要在不同的模块中调用未导出的函数,则需要以某种方式查找其地址。

执行此操作的一种方法是让第一个模块在第二个模块中调用导出的函数,该模块返回一个函数指针。 (或者:包含函数指针的结构,指向类实例的指针等)。考虑工厂模式。

另一种方法是从第一个模块导出注册函数,并让第二个模块的初始化代码调用它,将指针传递给未导出的函数以及某种识别信息。 (最好还有一个相应的注销功能,在卸载第二个模块之前调用它。)

另一种方法是使用dbghelp.dll来浏览调试符号。这不适用于实际应用,因为它需要分发调试符号,并且速度极慢,更不用说过于复杂了。

答案 1 :(得分:3)

除了bk1e的答案之外,还有另一种方法(不推荐)。

  1. 在dll中获取该函数的相对地址(例如,通过反汇编)。这必须在编译之前手动完成。
  2. 在程序中,您现在必须在内存中获取dll的startadress(例如使用导出的函数和一些计算)。
  3. 现在您可以使用函数的相对地址+导出函数的startadress直接调用该函数。
  4. 我不建议这样做。它仅适用于该dll的一个定义版本。任何重新编译和地址都可能发生变化。或者可能不再需要该功能并被删除。必须有一个原因,为什么不导出此功能。一般情况下 - 你试图存档图书馆作者故意不想要你做的事情,而且大部分时间都是“邪恶的”。


    你提到了ida-name。这个名字包括startadress。

答案 2 :(得分:0)

没有两种方法,你将不得不研究反汇编来弄清楚什么被推到堆栈上,以及它是如何用来确定类型的。