缘起
写文章的时候经常需要截图,有时候截完图程序就关了,但是发现还有另外一个地方需要截图说明。再次启动程序的时候,模块加载位置变了,与原来的截图的内容不匹配了,又要重新截图。为了解决这个问题特意查了一下如何禁用地址空间随机化。有两种方法:一种是全局禁用,一种是针对某个程序禁用。这里做个记录,方便后续查询。
禁用方法
设置 -> 更新和安全 -> windows 安全中心 -> 应用和浏览器控制 -> Exploit Protection,点击 Exploit Protection 设置 按钮进入设置界面。
说明: 也可以直接按
windows键,然后输入windows 安全中心进入windows 安全中心
全局禁用
在 系统设置 页下,关闭 高熵 ASLR 和 随机化内存分配(自下而上 ASLR),确保 强制影像随机化(强制性 ASLR) 是关闭的(默认是关闭的)。修改后重启生效。

使用 Procmon 观察可以发现,对应的注册表项是:
1 | [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel] |
针对某个程序禁用
在 程序设置 页下,可以添加或修改指定程序的设置。既可以按程序名称进行设置,也可以按照全路径进行设置。
勾选 强制映像随机化(强制性 ASLR) 和 随机化内存分配(自下而上 ASLR) 选项下的 替代系统设置,并且确保下方的开关是关闭的(默认是关闭的)。重启应用程序后生效。如下图:

使用 Procmon 观察可以发现,最终设置的是 Image File Execution Options 注册表项。
按照程序名称进行配置的注册表项如下:
1 | [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\LoadDlls.exe] |
按照完整路径进行配置的注册表项如下:
1 | [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\LoadDlls1.exe] |
修改 PE 文件
除了修改系统设置外,还可以通过禁用 PE 文件头中的标志位来禁用 ASLR。有两种方式:
如果有程序源码,可以修改
vs中的工程设置来设置生成的PE文件头的标志位。右键->属性->链接器->高级->随机地址选择否 (/DYNAMICBASE:NO),如下图:
这样编译生成的
PE文件就不会包含重定位标志。说明: 如果
固定基址设置的值是是 (/FIXED),那么PE文件的IMAGE_FILE_HEADER.Characteristics的第0位(IMAGE_FILE_RELOCS_STRIPPED位)的值是0,并且生成的PE文件中不存在重定位信息(Relocation info stripped)。重定位模块可能会失败。
如果程序已经生成,可以通过修改
PE文件头来禁用ASLR可以修改
PE文件中IMAGE_OPTIONAL_HEADER32.DllCharacteristics中的第6位(从0开始),也即IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE位的值,如果置1表示可以在加载时被重定位。
参考资料
《Windows PE 权威指南》
https://blog.csdn.net/meanong/article/details/80018392