首页 > 其他 > 详细

7. 重定位表

时间:2020-11-03 21:22:50      阅读:38      评论:0      收藏:0      [点我收藏+]

一种重定位方法:

g_dwVar dd ?

 

call @F

@@:

pop ebx

sub ebx, offset @B  ;运行时的eip减去编译时的eip,算出偏移

mov eax, [ebx + offset g_dwVar]

 

 

/DLL/FIXED:NO选项都会产生重定位表,一般会多出一个.reloc的节

 

typedef struct _IMAGE_BASE_RELOCATION {

    DWORD   VirtualAddress; //重定位块的RVA

    DWORD   SizeOfBlock;    //包括本结构和所有要修正的页内偏移数组的大小

//  WORD    TypeOffset[1];  //紧接着是所有要修正的页内偏移,长度WORD,由于只需要12bit就能表示,高4bit32位下一般为3064位下一般为A0IMAGE_REL_BASED_HIGHLOWIMAGE_REL_BASED_DIR64IMAGE_REL_BASED_ABSOLUTE

} IMAGE_BASE_RELOCATION;

 

 

下图中是dll文件的重定位表,VirtualAddress1000hSizeOfBlock10TypeOffset数组分别为3003300830640000,高4位表示IMAGE_REL_BASED_HIGHLOW,最后一个0000用来4字节对齐。

实际要重定位的地址分别是100010031000100810001064。可以看出只有分页地址为1000h的地方要修。

 技术分享图片

 

 

 

再去看看100010031000100810001064里是什么,前两个是字符串地址,最后一个是IAT中的一个项,确实需要修。可以发现命中在重定位表中的数据,调试器会加上下划线。

 技术分享图片

 

7. 重定位表

原文:https://www.cnblogs.com/Nutshelln/p/13922600.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!