Address Space Load Randomization以及如何禁用

从Vista开始,Windows引入了一个新特性,叫Address Space Load Randomization(ASLR)。简单点说,就是将EXE/DLL的载入基址随机化。ASLR已经是一个非常普遍的特性,在几乎所有的现在操作系统中都引入了(如Linux、Windows Vista/7、iOS5)。但是ASLR对程序员来说可不是个好东西,明显增大了调试程序的难度。最近我在对Adobe Flash Player做逆向工程,发现我用ida启动调试的时候,经常会出现一个对话框,说"Rebasing program to xxxxx“。

别听它说什么”Just a moment”,实际上要等很久很久才好。因为基址改变后,所有的地址都得重新计算,整个程序需要被重新分析一遍。

用SysinternalsSuite中的Process Explorer(procxp.exe)可以查看一个进程是否启用了ASLR:

通过修改PE文件的头部,可以禁用掉ASLR。强烈建议在对任何EXE/DLL做逆向工程前,先禁用掉它的ASLR选项,然后再往IDA/OllyDbg里面拖。下面用visual studio中自带的工具来查看并修改PE头:

首先打开"Visual Studio 命令提示”,然后输入

D:> dumpbin /headers flashplayer_11_sa_debug_32bit.exe

就可以查看到这个PE文件的头部信息。输出很长,在OPTIONAL HEADER VALUES中有一项是”DLL characteristics“,如

8140 DLL characteristics
Dynamic base
NX compatible
Terminal Server Aware

如果它的值是8140,就说明打开了"Dynamic base”。用VC的链接器禁用掉它即可。

D:> link /edit /dynamicbase:NO flashplayer_11_sa_debug_32bit.exe

再 试一试吧!

此博客中的热门博文

在windows下使用llvm+clang

少写代码,多读别人写的代码

tensorflow distributed runtime初窥