1

.exe内置 Visual Studio的默认基地址是 0x00400000。

d3dx9_30.dllodbcint.dll(都存在于 中)的默认基地址%windir%\system32也是 0x00400000。因此,默认情况下,exe链接到这些 dll 中的任何一个的 s 都会发生运行时地址冲突。操作系统会自动将 重新定位dll到不同的基地址并根据需要修复指针,当我附加 VS 调试器时,我可以看到这种情况:重新定位的模块得到一个感叹号图标覆盖。

重新定位系统 DLL 是一个非常糟糕的主意,更不用说在用户系统上几乎不可能做到。所以我决定重新设置我exe的 s 以防止这种地址冲突,从而防止运行时重新设置基础。

如果我将客户端 EXE 更改为不同的基地址以将其移开d3dx9_30.dll,它可以正常工作:没有地址冲突、没有重定位、没有修复。

但是,如果我将我的服务器 EXE 更改为不同的基地址以将它们移开odbcint.dll,它就不起作用。

odbcint.dll在内存中是 0x17000 字节,并且首选基地址 0x00400000。我尝试将我的 EXE 设置为 0x00420000,然后设置为 0x00660000。仍然odbcint.dll在运行时重新定位。我使用 进行了分析depends.exe,这表明在odbcint.dll加载之前没有其他模块试图声明此地址。

有没有人有理论解释为什么我无法odbcint.dll在其首选地址加载?

Update: vadump 显示,当我进入 main() 时,位于 0x00400000-0x00470000 的内存被声明为“UNKNOWN_MAPPED”。我一直无法找到有关这到底意味着什么的更多信息。我假设某些系统 dll 在加载时保留了此内存;我的调试功能不够强大,无法发现是哪个、为什么或确切的时间。

4

1 回答 1

1

如果您下载 VADump(可在Windows 资源工具包中获得:) ,您可以准确地看到哪些模块正在访问这些页面并导致它丢失其地址。(运行 vadump -op pid。)

你没有说你正在使用什么操作系统,但是在 Vista/2K8+ 上你应该也知道ASLR

于 2009-04-19T18:29:52.180 回答