(Windows)某个程序的基地址永远不会改变

时间:2016-01-14 08:30:33

标签: windows base-address

我启用了aslr,当我玩一个叫做攻击立方体的游戏时,这个程序的基地址始终是相同的(00400000)我通过GetModuleHandle(NULL)得到它也试图用windbg获取它并且它也说00400000我想知道为什么它永远不会改变,因为对于其他程序它总是会改变?

1 个答案:

答案 0 :(得分:0)

即使您已全局启用ASLR,Windows也只会将其应用于明确表示支持它的应用程序。否则可能会导致遗留应用程序意外崩溃,从而导致兼容性问题。所有可执行文件和支持DLL必须明确指出它们支持ASLR。

通过指定the /DYNAMICBASE option(至少在使用Microsoft的链接器时)链接目标文件时,表明您支持ASLR。现代版本的链接器默认启用它,但如果您的游戏是使用较旧版本的工具集编译的,则动态地址重定位支持是默认值(例如,VS 2008及更早版本)或者来自不同供应商的链接器很可能与ASLR支持无关。

这在the relevant MSDN article中被提及(强调添加):

  

ASLR在系统启动时将可执行映像移动到随机位置,这使得利用代码更难以可预测地运行。 对于支持ASLR的组件,它加载的所有组件也必须支持ASLR。例如,如果A.exe使用B.dll和C.dll,则所有三个组件都必须支持ASLR。 默认情况下,Windows Vista及更高版本会随机化系统DLL和EXE,但ISV创建的DLL和EXE必须选择使用/DYNAMICBASE链接器选项支持ASLR。

另请参阅:Vista ASLR is not on by default for image base addresses

请注意,您可以修改现有二进制文件的PE标头,通过运行SDK提供的editbin实用程序,强制它支持ASLR。与链接器一样,the /dynamicbase switch将打开它。

或者,您可以通过编辑以下注册表项来全局强制ASLR:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages

当然,这些都不会实际更改代码,因此如果存在兼容性问题,应用程序将会中断。