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



我启用了aslr,当我玩一个名为attack cube的游戏时,这个程序的基地址总是相同的(00400000)。我通过执行GetModuleHandle(NULL)获得它。我还试图用windbg获得它,它还说00400000。我想知道为什么它永远不会改变,因为其他程序总是会改变?

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

通过指定/DYNAMICBASE选项(至少在使用Microsoft的链接器时)链接对象文件时,可以指示您支持ASLR。默认情况下,现代版本的链接器会打开它,但如果您的游戏是在默认支持动态地址重新定位之前使用旧版本的工具集编译的(,例如、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提供的editbin实用程序,可以修改现有二进制文件的PE标头,强制其支持ASLR。与链接器一样,/dynamicbase开关将打开它

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

HKLMSYSTEMCurrentControlSetControlSession ManagerMemory ManagementMoveImages

当然,这两种方法实际上都不会更改代码,所以如果存在兼容性问题,应用程序就会崩溃。

最新更新