2011年10月09日 星期日 16:24
让我想想,这集应该谈什么来着?哦,对了,上次说的重定位数据了,嗯。说到数据的重定位,我们就不得不谈谈系统究竟为什么要对数据进行麻烦的重定位?既然在IMAGE_OPTION_HEADER中有一项ImageBase,指定了程序欲加载的位置,那么程序中用到的地址引用就都可以 以映射基址进行定位,但要知道程序(通常是DLL)有时并不总会按照你预想的位置进行加载,举一个简单的例子来说,当一个DLL欲加载到10 00 00 00地址时,此位置恰巧已经有一个ImageBase指定为10 00 00 00的DLL已经在先前的调用中加载进来,这时第二个DLL就不能在此位置上加载了,其所有的以ImageBase为地址基准数据引用和跳转指令都会因此要求进行重定位。这就是为什么在保护模式下DLL通常要重定位的原因了。 我们可以用如下代码生成一个DLL,如图1。 用PEID打开它,我们会发现一个名为.reloc的节(如图2),
好了今天就说这么多,老规矩下集预告:资源数据的加载和读取。 |