【问题标题】:(Windows) Base Address of a some program never changes(Windows) 某​​些程序的基地址永远不会改变
【发布时间】:2016-01-14 08:30:32
【问题描述】:

我启用了 aslr,当我玩一些名为突击立方体的游戏时,这个程序的基地址总是相同的 (00400000) 我通过 GetModuleHandle(NULL) 得到它也试图用 windbg 得到它,它也说 00400000我想知道为什么它从来没有改变,因为对于其他程序它总是改变?

【问题讨论】:

    标签: windows base-address


    【解决方案1】:

    即使您在全局范围内启用了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
    

    当然,这些都没有真正改变代码,所以如果出现兼容性问题,应用程序就会崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多