如何关闭 ASLR

缘起

写文章的时候经常需要截图,有时候截完图程序就关了,但是发现还有另外一个地方需要截图说明。再次启动程序的时候,模块加载位置变了,与原来的截图的内容不匹配了,又要重新截图。为了解决这个问题特意查了一下如何禁用地址空间随机化。有两种方法:一种是全局禁用,一种是针对某个程序禁用。这里做个记录,方便后续查询。

禁用方法

设置 -> 更新和安全 -> windows 安全中心 -> 应用和浏览器控制 -> Exploit Protection,点击 Exploit Protection 设置 按钮进入设置界面。

说明: 也可以直接按 windows 键,然后输入 windows 安全中心 进入 windows 安全中心

全局禁用

系统设置 页下,关闭 高熵 ASLR随机化内存分配(自下而上 ASLR),确保 强制影像随机化(强制性 ASLR) 是关闭的(默认是关闭的)。修改后重启生效

disable-aslr-system

使用 Procmon 观察可以发现,对应的注册表项是:

1
2
3
4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel]
"MitigationOptions"=hex:00,02,22,00,00,00,00,00,00,00,00,00,00,00,00,00
"MitigationAuditOptions"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"EAFModules"=""

针对某个程序禁用

程序设置 页下,可以添加或修改指定程序的设置。既可以按程序名称进行设置,也可以按照全路径进行设置。

勾选 强制映像随机化(强制性 ASLR)随机化内存分配(自下而上 ASLR) 选项下的 替代系统设置,并且确保下方的开关是关闭的(默认是关闭的)。重启应用程序后生效。如下图:

disable-aslr-per-exe

使用 Procmon 观察可以发现,最终设置的是 Image File Execution Options 注册表项。

按照程序名称进行配置的注册表项如下:

1
2
3
4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\LoadDlls.exe]
"MitigationOptions"=hex:00,02,22,00,00,00,00,00,00,00,00,00,00,00,00,00
"MitigationAuditOptions"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"EAFModules"=""

按照完整路径进行配置的注册表项如下:

1
2
3
4
5
6
7
8
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\LoadDlls1.exe]
"UseFilter"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\LoadDlls1.exe\{aec33db5-c793-77a9-0b18-88d2ce11206b}]
"FilterFullPath"="D:\\MyBlogStuff\\LoadDlls\\x64\\Debug\\LoadDlls1.exe"
"MitigationOptions"=hex:00,02,22,00,00,00,00,00,00,00,00,00,00,00,00,00
"MitigationAuditOptions"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"EAFModules"=""

修改 PE 文件

除了修改系统设置外,还可以通过禁用 PE 文件头中的标志位来禁用 ASLR。有两种方式:

  1. 如果有程序源码,可以修改 vs 中的工程设置来设置生成的 PE 文件头的标志位。

    右键 -> 属性 -> 链接器 -> 高级 -> 随机地址 选择 否 (/DYNAMICBASE:NO),如下图:disable-aslr-in-vs-project

    这样编译生成的 PE 文件就不会包含重定位标志。

    说明: 如果 固定基址 设置的值是 是 (/FIXED),那么 PE 文件的 IMAGE_FILE_HEADER.Characteristics 的第 0 位(IMAGE_FILE_RELOCS_STRIPPED 位)的值是 0,并且生成的 PE 文件中不存在重定位信息(Relocation info stripped)。重定位模块可能会失败。

  1. 如果程序已经生成,可以通过修改 PE 文件头来禁用 ASLR

    可以修改 PE 文件中 IMAGE_OPTIONAL_HEADER32.DllCharacteristics 中的第 6 位(从 0 开始),也即 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 位的值,如果置 1 表示可以在加载时被重定位。

    disable-aslr-by-NtHeaders-OptionalHeader-DllCharacteristics

参考资料

《Windows PE 权威指南》

https://learn.microsoft.com/zh-cn/cpp/build/reference/dynamicbase-use-address-space-layout-randomization?view=msvc-170

https://blog.csdn.net/meanong/article/details/80018392

https://www.52pojie.cn/thread-1099755-1-1.html

https://blog.nsfocus.net/dynamorio-9/

BianChengNan wechat
扫描左侧二维码关注公众号,扫描右侧二维码加我个人微信:)
  • 本文作者: BianChengNan
  • 本文链接: https://bianchengnan.github.io/articles/how-to-disable-ASLR/
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 作者寄语: 文章的结束只是思考的开始,您宝贵的意见和建议将是我继续前行的动力,点击右侧分享按钮即可携友同行!
0%