c++ - 如果加载到应用程序,DLL 中的函数地址是否可以更改?

标签 c++ function dll memory-address

我反汇编了一个 DLL 并看到了一些函数。我找到了我需要的函数,它的地址是 0x10001340

如果我将这个 dll 加载到我的应用程序中,这个地址会保持不变吗?那么我可以通过我的应用程序的地址调用该函数吗?

我问是因为我不确定:如果加载此 dll 时,主应用程序中的某些函数已经具有相同的地址怎么办?因此,也许 dll 中的函数可以在加载等时更改地址。

最佳答案

在 Windows 上,dll 有一个优先加载地址,但如果加载程序注意到虚拟地址空间的这一部分已被使用,则加载程序能够更改所有这些引用。这个过程称为“ rebase ”。

“默认”基地址是在链接时指定的(/BASE 与 Microsoft 链接器),如果您计划使用dll与另一个具有相同基地址的dll一起;这加快了加载过程,因为加载程序不必在每次加载时都对其中一个 dll 进行 rebase 。 (IIRC 也有一些工具可以对现有的 dll 进行 rebase 并将结果保存在磁盘上)

请记住,从 Windows Vista 开始,使用指定标志编译的 dll 总是加载到随机基地址以避免某种攻击。

关于c++ - 如果加载到应用程序,DLL 中的函数地址是否可以更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10970472/

相关文章:

c++ - Cpp Pantheios 日志库,调试断言失败错误

c++ - STL 容器作为模板参数

c# - 从 C# 程序访问 DLL 中的方法

python - SWIG C++ 预编译 DLL

.net - 从哪里获得 .net 的 apache poi 端口

c++ - __m128 何时在 xmm 寄存器中?

c++ - 从 std::set C++ 中删除重复项

python - 捕获变量中的结果

javascript - 动态修改 JavaScript 中的构造函数?

c - 基本 C 指针和函数