【发布时间】:2016-01-14 08:30:32
【问题描述】:
我启用了 aslr,当我玩一些名为突击立方体的游戏时,这个程序的基地址总是相同的 (00400000) 我通过 GetModuleHandle(NULL) 得到它也试图用 windbg 得到它,它也说 00400000我想知道为什么它从来没有改变,因为对于其他程序它总是改变?
【问题讨论】:
标签: windows base-address
我启用了 aslr,当我玩一些名为突击立方体的游戏时,这个程序的基地址总是相同的 (00400000) 我通过 GetModuleHandle(NULL) 得到它也试图用 windbg 得到它,它也说 00400000我想知道为什么它从来没有改变,因为对于其他程序它总是改变?
【问题讨论】:
标签: windows base-address
即使您在全局范围内启用了ASLR,Windows 也只会将其应用于明确表示支持它的应用程序。否则很容易使遗留应用程序意外崩溃,从而导致兼容性问题。所有可执行文件和支持的 DLL 都必须明确指出它们支持 ASLR。
通过指定the /DYNAMICBASE option(至少如果您使用微软的链接器)链接目标文件时,您会执行此操作来表明您支持 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 标头,强制其支持 ASLR,方法是运行 SDK 提供的 editbin 实用程序。与链接器一样,the /dynamicbase switch 将打开它。
或者,您可以通过编辑以下注册表项来全局强制 ASLR:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
当然,这些都没有真正改变代码,所以如果出现兼容性问题,应用程序就会崩溃。
【讨论】: