看了下看雪的一篇文章,加深下对重定位的理解,其实这是一个程序
https://bbs.pediy.com/thread-76638.htm
这个程序需要用户输入的是加载基址,还有文件的路径
开始首先通过MZ头,还有e_lfanew偏移是否是PE\x00\x00 来判断这是否是一个PE文件
1 | BOOL VerifyPE( PVOID pFile ) |
重定位
计算镜像基址与真正加载基址的差值
1 | pDosHeader = (PIMAGE_DOS_HEADER)pFile; |
获取重定位表RVA,并计算出File Offset
1 | // Get reloc table RVA |
之后根据重定位表循环计算真正的地址,具体如下
1、一次获取一条记录,获取其RVA,算出File Offset
2、通过与pRelocAddr相加得到储存原始地址的地方(即要修正的地址)
3、将这个要修正的地址减去之前算出来的基址的差别即可
4、最后将结果写回文件即可
1 | pRelocAddr = pRelocBlock->VirtualAddress + (*pType & 0x0fff); |