首页
社区
课程
招聘
外壳编写重定位处理的一个疑问
发表于: 2009-4-10 09:07 9965

外壳编写重定位处理的一个疑问

2009-4-10 09:07
9965
一个疑问:
书上给的代码 是这样的
//取出ItemOffset,加上本段重定位起始地址 ,减去nTemp,得到的值准备放到新重定位表结构中
nNewItemOffset = ((pBaseReloc->TypeOffset[nIndex] & 0x0fff) + pBaseReloc->VirtualAddress) - nTemp;
if(nNewItemOffset > 0xff)//如果是本段重定位数据第一项
{
*(BYTE *)(pData) = 3;
pData += sizeof(BYTE);
*(DWORD *)pData = (DWORD)(nNewItemOffset);
pData += sizeof(DWORD);                                       
}
else
{
*(BYTE *)(pData) =(BYTE)(nNewItemOffset);
pData += sizeof(BYTE);                                       
}
nTemp += nNewItemOffset;       
上面得代码我有个疑问,他的格式是先保存类型3,然后保存第一项的值,然后后面每次用个字节去保证差值(后一项减前一项)。而且程序认定差值不会超过0xff,因为注释说的也是保存第一项。我想问所有的程序里的这个偏移都不会超过0XFF吗,碰巧我调试的时候碰到了。这样程序就会再保存类型和前一项的数据。虽然这样不算错,作者的本意就是这样,还是我理解错了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我也有同样的疑问,如果程序中两个offset的差值大于ff则就会再创建一个新的重定位数据结构,这样的话怎样保证重定位表的大小和原来一样呢?
memset((PCHAR)RVAToPtr(pRelocDir->VirtualAddress),0,nRelocSize);
memcpy((PCHAR)RVAToPtr(pRelocDir>VirtualAddress),pRelocBufferMap,nRelocSize);
这个函数是将新的重定位结构复制到内存中的PE镜像中,如果新旧两个重定位表的结构大小不一样,
复制是按原来的结构大小复制的,会不会出错?
2013-2-22 22:33
0
游客
登录 | 注册 方可回帖
返回
//