如何在Win32 C ++中调用未导出的函数?
答案 0 :(得分:6)
调用与代码相同的模块(DLL / EXE)中定义的未导出函数:只需像调用其他C ++函数一样调用它们。显然这不是你所要求的。如果要在不同的模块中调用未导出的函数,则需要以某种方式查找其地址。
执行此操作的一种方法是让第一个模块在第二个模块中调用导出的函数,该模块返回一个函数指针。 (或者:包含函数指针的结构,指向类实例的指针等)。考虑工厂模式。
另一种方法是从第一个模块导出注册函数,并让第二个模块的初始化代码调用它,将指针传递给未导出的函数以及某种识别信息。 (最好还有一个相应的注销功能,在卸载第二个模块之前调用它。)
另一种方法是使用dbghelp.dll
来浏览调试符号。这不适用于实际应用,因为它需要分发调试符号,并且速度极慢,更不用说过于复杂了。
答案 1 :(得分:3)
除了bk1e的答案之外,还有另一种方法(不推荐)。
我不建议这样做。它仅适用于该dll的一个定义版本。任何重新编译和地址都可能发生变化。或者可能不再需要该功能并被删除。必须有一个原因,为什么不导出此功能。一般情况下 - 你试图存档图书馆作者故意不想要你做的事情,而且大部分时间都是“邪恶的”。
你提到了ida-name。这个名字包括startadress。
答案 2 :(得分:0)
没有两种方法,你将不得不研究反汇编来弄清楚什么被推到堆栈上,以及它是如何用来确定类型的。