我有一个加载 DLL 的程序,我需要调用它包含的一个非导出函数。有什么办法可以通过在调试器中搜索或其他方式来做到这一点?在任何人问之前,是的,我有这些功能的原型(prototype)和 Material 。
最佳答案
是的,至少有点,但这不是一个好主意。
在 C/C++ 中,所有函数指针都是内存中的地址。因此,如果您能以某种方式找到该函数的地址,您就可以调用它。
让我问一些问题,你怎么知道这个 DLL 包含这个函数?你有源代码吗?否则我不知道你怎么能确定这个函数存在或者调用它是否安全。但是,如果您有源代码,则只需公开该功能即可。如果 DLL 编写者没有公开此函数,他们永远不会期望您调用它并且可以随时更改/删除实现。
抛开警告,如果你有调试符号或 MAP file,你可以找到函数地址您可以在 DLL 中找到偏移量。如果除了 DLL 之外什么都没有,那么就无法知道该函数在 DLL 中的位置 - 它不存储在 DLL 本身中。
一旦你有了偏移量,你就可以像这样将它插入到代码中:
const DWORD_PTR funcOffset = 0xDEADBEEF;
typedef void (*UnExportedFunc)();
....
void CallUnExportedFunc() {
// This will get the DLL base address (which can vary)
HMODULE hMod = GetModuleHandle("My.dll");
// Calcualte the acutal address
DWORD_PTR funcAddress = (DWORD_PTR)hMod + funcOffset;
// Cast the address to a function poniter
UnExportedFunc func = (UnExportedFunc)funcAddress;
// Call the function
func();
}
还要意识到每次重建 DLL 时此函数的偏移量都会更改,因此这非常脆弱,让我再说一遍,这不是一个好主意。
关于c++ - 在 DLL 中调用非导出函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2918234/