如何将导出表的rva转成foa

发布网友

我来回答

1个回答

热心网友

/将RVA转换为FOA(可由lpFoa传出FOA、可由lpSection传出节序号,不在节中节序号为-1)
    BOOL RvaToFoa(DWORD dwRva, LPDWORD lpFoa = NULL, LPWORD lpSection = NULL) const;
 
    //将FOA转换为RVA(可由lpRva传出RVA、可由lpSection传出节序号,不在节中节序号为-1)
    BOOL FoaToRva(DWORD dwFoa, LPDWORD lpRva = NULL, LPWORD lpSection = NULL) const;
 
 
BOOL CPeFile::RvaToFoa(DWORD dwRva, LPDWORD lpFoa, LPWORD lpSection) const
{
    assert(IsAttch());
    WORD nSection = m_lpNtHeader->FileHeader.NumberOfSections;
    DWORD dwAlignment = m_lpNtHeader->OptionalHeader.SectionAlignment;
    for (size_t i = 0; i < (size_t)nSection; ++i)
    {
        DWORD dwBegin = m_lpSectionHeader[i].VirtualAddress;
        if (i == 0U && dwRva < dwBegin)
        {
            if (lpFoa)
                *lpFoa = dwRva;
            if (lpSection)
                *lpSection = (WORD)-1;
            return TRUE;
        }
        DWORD dwBlockCount = m_lpSectionHeader[i].SizeOfRawData / dwAlignment;
        dwBlockCount += m_lpSectionHeader[i].SizeOfRawData % dwAlignment ? 1 : 0;
        if (dwRva >= dwBegin && dwRva < dwBegin + dwBlockCount * dwAlignment)
        {
            if (lpFoa)
                *lpFoa = m_lpSectionHeader[i].PointerToRawData + dwRva - dwBegin;
            if (lpSection)
                *lpSection = (WORD)i;
            return TRUE;
        }
    }
 
    return FALSE;
}
 
BOOL CPeFile::FoaToRva(DWORD dwFoa, LPDWORD lpRva, LPWORD lpSection) const
{
    assert(IsAttch());
    WORD nSection = m_lpNtHeader->FileHeader.NumberOfSections;
    for (size_t i = 0; i < (size_t)nSection; ++i)
    {
        DWORD dwBegin = m_lpSectionHeader[i].PointerToRawData;
        if (i == 0U && dwFoa < dwBegin)
        {
            if (lpRva)
                *lpRva = dwFoa;
            if (lpSection)
                *lpSection = (WORD)-1;
            return TRUE;
        }
        if (dwFoa >= dwBegin && dwFoa < dwBegin + m_lpSectionHeader[i].SizeOfRawData)
        {
            if (lpRva)
                *lpRva = m_lpSectionHeader[i].VirtualAddress + (dwFoa - m_lpSectionHeader[i].PointerToRawData);
            if (lpSection)
                *lpSection = (WORD)i;
            return TRUE;
        }
    }
    return FALSE;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com