gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:42:11 31 4
gpt4 key购买 nike

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com