我启用了aslr,当我玩一些名为突击立方体的游戏时,这个程序的基地址总是相同的(00400000)我通过GetModuleHandle(NULL)得到它也试图用windbg得到它,它也说00400000,我是想知道为什么它永远不会改变,因为对于其他程序它总是改变?
1 回答
即使您在全局范围内启用了ASLR,Windows 也只会将其应用于明确表示支持它的应用程序。否则很容易使遗留应用程序意外崩溃,从而导致兼容性问题。所有可执行文件和支持的 DLL 都必须明确指出它们支持 ASLR。
表明您支持 ASLR 是您在通过指定选项链接目标文件时所做的事情(/DYNAMICBASE
至少在您使用 Microsoft 的链接器时)。现代版本的链接器默认打开它,但是如果您的游戏是在默认支持动态地址重定位之前使用旧版本的工具集编译的(例如,VS 2008 和更早版本)或使用来自不同供应商的链接器,它很可能与 ASLR 支持无关。
这在相关的 MSDN 文章中有所提及(已添加重点):
当系统启动时,ASLR 将可执行映像移动到随机位置,从而使漏洞利用代码更难以可预测的方式运行。对于支持 ASLR 的组件,它加载的所有组件也必须支持 ASLR。例如,如果 A.exe 使用 B.dll 和 C.dll,则这三个都必须支持 ASLR。默认情况下,Windows Vista 及更高版本将随机化系统 DLL 和 EXE,但 ISV 创建的 DLL 和 EXE 必须使用
/DYNAMICBASE
链接器选项选择支持 ASLR。
另请参阅:默认情况下,Vista ASLR 未对映像基地址启用
请注意,您可以通过运行SDK 提供的实用程序来修改现有二进制文件的 PE 标头,强制其支持 ASLR 。editbin
与链接器一样,开关/dynamicbase
会将其打开。
或者,您可以通过编辑以下注册表项来全局强制 ASLR:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
当然,这些都没有真正改变代码,所以如果出现兼容性问题,应用程序就会崩溃。