我需要在应用程序上运行调试器并分析其启动,但是主 DLL 每次都加载到不同的地址,这使我的工作变得更加困难。如何完全禁用 ASLR,或者至少强制将一个 DLL 加载到特定的、始终不变的地址?
如何在 Windows XP 中强制在特定地址加载 DLL
逆向工程
视窗
dll
2021-06-20 07:59:59
3个回答
我相信在 XP 上,如果您从 DLL 中删除重定位表(或者将数据目录中的重定位表 RVA 和大小清空),那么 Windows 加载程序将尝试在其首选基地址(可选中的 ImageBase)加载 DLL标头),因为它无法再重新定位。
只要首选基地址的内存可用,这应该可以工作。更高版本的 Windows 可能会阻止这种情况,具体取决于加载程序选项 AFAIK。
一个方便的编辑 PE 文件的工具是免费提供的CFF Explorer。
要实际强制DLL 在特定地址加载而不先对其进行结构更改,您需要首先分配所有剩余的可用内存,当然,还要确保目标位置尚未使用。要为任何给定文件禁用 ASLR,您必须在 COFF 标头的特征字段中设置 IMAGE_FILE_RELOCS_STRIPPED 标志。如果文件选择加入 ASLR,则不会删除重定位表。Windows 仍然会移动它,只是不会重新定位任何数据。据我所知,你不能全局关闭 ASLR。
其他海报所谈论的是使 DLL 始终加载到特定地址的一般方法。
对于您想要做的事情——确保绝对地址始终相关,vs 模块 + 偏移量——很容易做到。
如果您可以在 Windows XP 系统上加载二进制文件,则它完全不知道 ASLR。
或者,您可以完全禁用 ASLR,这将确保模块始终在其首选地址加载。此设置通过 控制HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
。
但是,如果首选地址不可用,Windows 会将其加载到其他地方。如果您遇到此问题,我建议您手动修改首选基地址。一个好的十六进制编辑器将允许您执行此操作。