c++ - 在 DLL 中调用非导出函数

标签 c++ dll assembly function

我有一个加载 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/

相关文章:

c++ - QT程序无法启动,因为缺少libgcc_s_dw2-1.dll

c++ - GLM 功能不起作用

c++ - 为什么我的 C++ 程序找不到必要的 .dll 文件?

linux - Midnite 指挥官 ELF 查看器 - 这些符号是什么意思?

c - C 编程如何在没有头文件的情况下工作?

c++ - 相机同步

c++ - GD 图片库 : Range of colour component arguments for TrueColor images

c++ - 我一定是在构建 DLL 时做错了什么

vb6 - 如何在 VB6 中创建包装器 DLL/类型库?

c - Linux 内核模块 makefile 中的特殊文件编译