首页
社区
课程
招聘
[求助]关于重定向表的问题
发表于: 2019-6-24 21:48 2991

[求助]关于重定向表的问题

2019-6-24 21:48
2991
最近在学习重定向表,为了练习修复重定向表,我把ImageBase加了0x1000;但是在修复的时候出了各种问题,看的视频里说是修改指向修复的地址;
我说一下我试过的方法:直接修改过 IMAGE_BASE_RELOCATION的 VirtualAddress;也转FOA+0x1000,然后在转RVA过。也修改过 VirtualAddress+低12位指向的内容,修改过  RVAToOffset(VirtualAddress+低12位) + 0x1000,然后转成RVA,在减去 VirtualAddress,最后获得的值赋给低12位。这些方式都试过,都不行。求大佬指点这修复怎么修啊。蒙蔽中。。。
最后问一下,我怎么把之前发的帖子删掉啊,以前的问题解决了,想把以前的贴子删掉。还有就是怎么回复回帖的人啊。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 15
活跃值: (3546)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
bool RelocImageBuffer(PVOID pImage,DWORD dwNewImageBase)
{
       if (!pImage)
       {
               printf("模块地址为空\n");
               Sleep(2000);
               return false;
       }
       
       //目标  根据重定位表 找到需要修改的地址  然后判断  如果新的模块基址大于原来的ImageBase
       PVOID pOptionHeader=0;
       GetPEOptionHeader(pImage,&pOptionHeader);

       //得到原来的ImageBase
    DWORD dwOldImageBase=((PIMAGE_OPTIONAL_HEADER)pOptionHeader)->ImageBase;

       //修改ImageBase
       ((PIMAGE_OPTIONAL_HEADER)pOptionHeader)->ImageBase=dwNewImageBase;
       //判断是否有重定位表
       if (!((PIMAGE_OPTIONAL_HEADER)pOptionHeader)->DataDirectory[5].VirtualAddress)
       {
               printf("没有重定位表");
               Sleep(5000);
               ExitThread(-1);
               return false;
       }
   //获取重定位页的位置
    PVOID pRelocPage=((PIMAGE_OPTIONAL_HEADER)pOptionHeader)->DataDirectory[5].VirtualAddress+(PCHAR)pImage;
       

       PRELOC_INFO pRelocInfo=(PRELOC_INFO)pRelocPage;
       while (pRelocInfo->VirtualAddress &&pRelocInfo->Size)
       {
          //找到需要修改的地址
               DWORD dwIndex=0;
               while (dwIndex<(pRelocInfo->Size-8)/2)
               { 
                       PVOID dwModifyAddr=(PCHAR)pRelocInfo+8+dwIndex*2;
                       //如果最高位为3 则修改
                       PRELOCCOLUM pRelocColum=(PRELOCCOLUM)dwModifyAddr; 

                       if (pRelocColum->Flag==3)
                       {
                               //要修改的地址=imagebase+页+具体项
                               dwModifyAddr=(PCHAR)pImage+pRelocInfo->VirtualAddress+pRelocColum->Address;
                               *(DWORD*)dwModifyAddr+=dwNewImageBase-dwOldImageBase;
                       }
                       
                       dwIndex++;
               }
               //下一页=上一页的RVA+size
               PCHAR pRelocAddr=(PCHAR)pRelocInfo;
               pRelocAddr+=pRelocInfo->Size;
               pRelocInfo=(PRELOC_INFO)pRelocAddr;
      
       }
       
       return true;
}
这是我以前写的。你自己对照下。
2019-6-24 22:48
0
游客
登录 | 注册 方可回帖
返回
//