PE中FOAToRVA和RVAToFOA

本文介绍了在PE文件中进行FOA(File Offset Address)与RVA(Relative Virtual Address)之间的相互转换方法。通过具体算法实现了如何根据不同区域定位并计算地址偏移,对于理解PE文件结构及内存映射具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FOAToRVA

//pFileBuffer是传进PE文件的起始指针、dwRva是传进要修改的FOA的值
DWORD  FOAToRVA(LPVOID pFileBuffer,DWORD dwRva)  //LPVOID相当于VOID* 
{  
    int i;
    /*判该FOA是位于Section中还是位于HEADERS中(如果RVA是小于第一个区块的PointerToRawData,
    那么它在文件中的偏移和在内存镜像中的偏移是一样的,都是应该小于SizeOfHeaders*/
    if(dwRva<pSectionHeader->PointerToRawData)
    {
        return dwRva;
    }
    /*判断FOA在那个区块里*/
    for(i=0;i<pFileHeader->NumberOfSections;i++)
    {
    if((dwRva>=pSectionHeader->PointerToRawData)&&
    (dwRva<(pSectionHeader->PointerToRawData+pSectionHeader->SizeOfRawData)))
        {
        //区块里FOA转RVA公式
            dwRva=pSectionHeader->VirtualAddress+dwRva-pSectionHeader->PointerToRawData;
       // pSectionHeader是全局变量,还原初值,以便其他函数的调用  
            pSectionHeader=(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader+pFileHeader->SizeOfOptionalHeader);
            return dwRva;
        }
        pSectionHeader++;
    }
}

RVAToFOA

//pFileBuffer是传进PE文件的起始指针、dwRva是传进要修改的RVA的值
DWORD  RVAToFOA(LPVOID pFileBuffer,DWORD dwRva)  
{  

    int i;
    //判该RVA是位于Section中还是位于HEADERS中(RVA是小于第一个区块的VirtualAddress的那么它在文件中的偏移和在内存镜像中的偏移是一样的,都是应该小于SizeOfHeaders)
    if(dwRva<pSectionHeader->VirtualAddress){
        return dwRva;
    }
    /*判断RVA在那个区块里*/

for(i=0;i<pFileHeader->NumberOfSections;i++)
{
        if((dwRva>=pSectionHeader->VirtualAddress)&&
        (dwRva<(pSectionHeader->VirtualAddress+pSectionHeader->SizeOfRawData)))
        {
        //区块里RVA转FOA公式
            dwRva=pSectionHeader->PointerToRawData+dwRva-pSectionHeader->VirtualAddress;
        // pSectionHeader是全局变量,还原初值,以便其他函数的调用   
            pSectionHeader=(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader+pFileHeader->SizeOfOptionalHeader);
            return dwRva;
        }
        pSectionHeader++;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值