【问题标题】:Windows 64bit address spaceWindows 64 位地址空间
【发布时间】:2016-11-10 12:26:23
【问题描述】:

我正在开发一个带有几个 dll 的 64 位应用程序。

来自win 32,其中加载的dll的默认基地址 是 0x10.000.000,然后它们在发生冲突时被移动。

Wintellect 的 John Robbins 建议为 dll 设置唯一地址,这样不同运行时内存空间使用情况相同。

他在调试 .net 2.0 应用程序的书中建议,基地址应以 dll 名称的第一个字母为指导。

a-c 0x60.000.000
d-f 0x61.000.000
g-i 0x62.000.000
j-l 0x63.000.000
m-o 0x64.000.000
p-r 0x65.000.000
s-u 0x66.000.000
v-x 0x67.000.000
y-z 0x68.000.000

我认为 64 位已经改变了。 (至少是地址)。 有没有人找到更好的解决方案? (所以在另一台电脑上运行的地址可以映射到我的吗?
- 或者我可以加载某个地方制作的小型转储。)

【问题讨论】:

  • ASLR 的引入使关于基地址的旧论点无效,因为 (1) ASLR 会随机更改您的基地址;你很少再被加载到你的标称基地址,并且 (2) 与 ASLR 一起出现了一种更有效的重定位算法,因此重定位 DLL 的成本非常低,TL;DR:一旦你有了这个指导就不再适用了ASLR。

标签: c# c++ dll 64-bit virtual-address-space


【解决方案1】:

由于您转向 64 位,我猜您的目标是 Windows Vista 或更高版本,因为 XP 64 位从未如此流行(并且扩展支持已终止)。

在 Windows Vista 中,引入了地址空间随机化 (ASLR),从而提高了安全性,因为猜测内存位置变得更加困难。

ASLR 将随机化基地址并通过/DYNAMICBASE (MSDN) 启用。因此,不再需要自己生成或计算基地址。

正如您所说,变基可能已经发生在 32 位应用程序中。这和 ASLR 不会对调试故障转储产生影响。调试器将能够解析符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2013-08-21
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多