基址重定位表
PE重定位
PE重定位就是本来我要加载到内存中的位置被别人占了,所以我只能加载到其他地方,这一过程发生的一系列处理行为就是PE重定位。
PE重定位时执行的操作
使硬编码在程序中的内存地址随着当前加载地址变化而变化的处理过程就是PE重定位。
硬编码地址以ImageBase(01000000)为基准。生成构建notepad.exe文件时,由于无法预测程序被实际加载到哪个地址,所以记录硬编码地址时,以ImageBase为基准。但在运行的瞬间,经过PE重定位后,这些地址全部以加载地址为基准变换,使得最后程序得以正常进行。
上图中所有硬编码的地址都要根据加载地址的不同而变化。
PE重定位操作的原理
在应用程序中查找硬编码的地址位置
读取值后,减去ImageBase(VA->RVA)
加上实际加载地址(RVA->VA)
基址重定位表
TypeOffset的低12位是真正的位移,该位移值基于Virtual Address的偏移。所以程序中使用硬编码地址的偏移使用下面等式换算。
VirtualAddress(1000) + Offset(420) = 1420(RVA)
notepad.exe被加载到AF0000地址处。故RVA 1420
即为VA AF1420
,该地址处存储着IAT地址(VA,AF10C4指其调用函数地址的存放地址)。并且该值经过PE重定位而发生了变化。使用相同的原理,AF142D、AF1436地址的内容也都是硬编码到程序中的地址值,该偏移可以在重定位表中求得。
TypeOffset项中指向位移的低12位拥有的最大地址值为1000.为了表示更大的地址,要添加1个与其对应的块,由于这些块以数组形式罗列,故称为重定位表
从可执行文件中删除.reloc节区
这个按照书上面操作之后显示不出来了,估计是版本更新之类的问题。
010Editor这个工具挺好用的
但是好像没没找到那种批量修改/填充的,就比如我想把某个地方全部填充为0,我还得一个一个的改。