//@[comment("MVI_tracked")] typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD TypeOffset[1]; } IMAGE_BASE_RELOCATION; typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
来看一个dll
重定位在4000 看节表
在 .reloc 块中
c00+4000-4000=c00 物理foa地址
可以看到前2个双字后 高位都是3 就是需要调整
3036,3040等 一共86个
转换被调用时真实地址就是 入口地址+基地址+虚低12地址 00 0 例如 0 36
这个dll 在内存中的重定位位置就是
10000000+1000+036 后面的85个都是这样的公式套用