前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >理解别人写的简单的重定位程序

理解别人写的简单的重定位程序

作者头像
用户1423082
发布于 2024-12-31 10:36:50
发布于 2024-12-31 10:36:50
6200
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

看了下看雪的一篇文章,加深下对重定位的理解,其实这是一个程序

https://bbs.pediy.com/thread-76638.htm

这个程序需要用户输入的是加载基址,还有文件的路径

开始首先通过MZ头,还有e_lfanew偏移是否是PE\x00\x00 来判断这是否是一个PE文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BOOL VerifyPE( PVOID pFile ) 
{ 
    PIMAGE_DOS_HEADER pDosHeader; 
    PIMAGE_NT_HEADERS pNtHeader; 
 
    pDosHeader = (PIMAGE_DOS_HEADER)pFile; 
    if ( pDosHeader->e_magic != 0x5A4D )   // compare with 'MZ' 
        return FALSE; 
 
    pNtHeader = (PIMAGE_NT_HEADERS)((PCHAR)pFile + pDosHeader->e_lfanew);   // e_lfanew + 0x3c  
    if ( pNtHeader->Signature != 0x00004550 ) // compare with 'PE\0\0' 
        return FALSE; 
 
    return TRUE; 
}

重定位

计算镜像基址与真正加载基址的差值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pDosHeader = (PIMAGE_DOS_HEADER)pFile;  
pNtHeader = (PIMAGE_NT_HEADERS)((PCHAR)pFile + pDosHeader->e_lfanew);   // e_lfanew + 0x3c   

dwImageBase = pNtHeader->OptionalHeader.ImageBase;  
dwDiffer = dwImageBase - BaseAddr;  // pay attention to the order

获取重定位表RVA,并计算出File Offset

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // Get reloc table RVA  
PIMAGE_DATA_DIRECTORY pRelocTable = (PIMAGE_DATA_DIRECTORY)pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;   

// Get reloc table File Offset  
pRelocBlock = (PIMAGE_RELOCATION)( (PCHAR)pFile + RvaToFileOff( pFile, (DWORD)pRelocTable ) ); // the pRelocTable is file offset?

之后根据重定位表循环计算真正的地址,具体如下

1、一次获取一条记录,获取其RVA,算出File Offset 2、通过与pRelocAddr相加得到储存原始地址的地方(即要修正的地址) 3、将这个要修正的地址减去之前算出来的基址的差别即可 4、最后将结果写回文件即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pRelocAddr = pRelocBlock->VirtualAddress + (*pType & 0x0fff);     
// pRelocAddr += dwImageBase;  

// Get reloc address's File Offset  
pRelocAddr = RvaToFileOff( pFile, pRelocAddr );  

//  DWORD test = pRelocAddr;  

// Go to the Buffer offset  
pRelocAddr += (DWORD)pFile;  

// Get the reloc address  
dwRelocAddr = *(PDWORD)pRelocAddr;  

// Calculate the new address  
dwRelocAddr -= dwDiffer;  

// Copy to the file  
*(PDWORD)pRelocAddr = dwRelocAddr;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 重定位
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档