5

在它自己的镜像库中重新定位主程序非常高之后。

如何保证加载的 dll 将加载到 0x400000

dllImageBase = LoadLibrary("test.dll");
printf("imagebase = 0x%x", dllImageBase);

我总是得到 0x460000 而不是 0x400000

我需要我的 dll 第一条指令从 0x401000 开始,它曾经在变基之前从 0x600000 开始

链接器变基的命令是

#pragma comment( linker, "/BASE:8000000") 

所以 0x400000 现在实际上是免费的,但默认情况下它不使用它。所以我可以通过任何方式控制它,它应该重新定位。也许一些WIN32API?

4

2 回答 2

5

您将不得不禁用地址空间布局随机化以将 DLL 加载到您想要的位置。旨在阻止您尝试执行操作的功能。/DYNAMICBASE 链接器选项。当我尝试它时,在 0x400000 处加载有效。

于 2011-09-11T18:29:34.357 回答
3

永远不要依赖在特定基础上加载 DLL。如果您可以强制 DLL 在特定的基础上加载,那么您将打开一个潜在的安全漏洞。

如果你有一个地图文件,你就知道给定函数的偏移量是多少。因此,您可以使用 GetProcAddress 计算出 DLL 的基地址。这是一种更安全的工作方式,即使这意味着更新 DLL 会破坏加载 DLL 的代码。

于 2011-09-11T18:32:36.710 回答