第16章:基址重定位和ASLR(Address Space Layout Randomization)
PE重定向
向进程的虚拟内存加载PE文件时,文件会被加载到PE头的ImageBase所指向的地址处时.存在地址被占用的风险.
EXE文件会优先被加载到内存,所以不用担心重定位问题.
在Windows Vista之后的版本引入了ASLR安全机制,运行程序exe都会被加载到不同的地址.
此处应注意(在win 7企业版中):每次运行程序代码的地址,PE在内存中的地址,堆栈地址都会改变:
但是在我的win 10系统中,第一次和后面几次的重新加载过程中,程序代码的地址,PE文件的起始地址并没有发生变化,只有堆栈地址发生了变化.
但删除程序,将新程序拖入Win10重新运行,发现他们所有的地址又都不一样了.
使用HexEditor查看程序:
可以看到,多了一个reloc节区.编译时由编译器生成.PE文件加载到内存中,该节区呗用做重定位的参考.可以被删除.
在OptionalHeader中,从首地址(10/20b)加46H即到DllCharacteristics,此变量中包含:
只需要将8140改为8100即可:
再次调试,即可成功: