PE 文件基址及其随机化
1 PE 文件基址
PE (Portable Executable) 文件是 Windows 操作系统中可执行文件和动态链接库 (DLL) 的标准格式。在操作系统加载 PE 文件时,它会将文件映射到进程的虚拟地址空间中。PE 文件的基址 (Base Address) 是指操作系统尝试将该文件加载到内存中的首选地址。一般来说,在 Windows 系统中,x86 架构的 EXE 文件默认基址是 0x00400000,而 x64 架构的 EXE 文件默认基址是 0x140000000。
2 ASLR
ASLR (Address Space Layout Randomization) 是一种安全技术,用于随机化进程的内存地址布局,以防止攻击者利用已知的内存地址进行攻击。通过随机化基址,ASLR 使得攻击者难以预测关键数据结构和代码的位置,从而增加了攻击的难度。详见 Wikipedia。
然而,对于逆向分析和调试来说,这一机制导致每次重启调试器时,PE 文件的基址都会发生变化。而一些反编译工具会采用默认基址进行分析,导致对比分析出现不便。
3 关闭 ASLR
3.1 原理
PE 文件格式中,有一个标志位 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,用于指示操作系统是否启用 ASLR。如果该标志位被置零,操作系统将不会随机化该 PE 文件的基址,而是使用其默认基址进行加载。
该标志位位于 PE 文件的可选头 (Optional Header) 中的 DllCharacteristics 字段。这个字段是一个 16 位的位掩码,每一位代表不同的特性。可以通过将该 ushort 值与 0x0040 进行按位与操作来检查该标志位是否被设置。
3.2 方法
3.2.1 方法一:修改 PE 文件标志位
使用任何 PE 编辑工具或十六进制编辑器,打开目标 PE 文件,找到并修改 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 标志位。
3.2.1.1 使用 010 Editor
- 打开 010 Editor,加载目标 PE 文件。
- 运行
EXE.bt模板,定位到Optional Header部分,找到DllCharacteristics字段下的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE位。
- 将其改为
0,保存。
3.2.2 方法二:修改调试器设置
在 x64dbg 调试器中,选择 选项 -> 引擎,勾选 禁用 ASLR 选项。