节表和节——RVA和文件偏移的转换
RVA和文件偏移的转换的转换算法
(1)循环扫描节表并得到每个节在内存中的起始RVA(根据VirtualAddress字段),并根据节的大小(SizeOfRawData字段)算出节的结束RVA,最后比较判断目标RVA是否落在某个节之内。
(2)如果目标RVA处于某个节之内,那么用目标RVA减去节的起始RVA,这样就得到了目标RVA相对于节起始地址的偏移量RVA'。
(3)在节表中获取节在文件中所处的偏移(PointerToRawData字段),将这个偏移值加上上一步得到的RVA'值,这才是数据在文件中的真正偏移位置。
RAW CInfector ::RVA2RAW( RVA rva)
{
int i;
for (i = 0; i < m_pPEHeader->FileHeader.NumberOfSections ; i++)
{
if (rva < m_pSectionStart[i].VirtualAddress + m_pSectionStart[i].Misc.VirtualSize &&
rva >= m_pSectionStart[i].VirtualAddress)
{
break ;
}
}
return (m_pSectionStart[i].PointerToRawData + rva - m_pSectionStart[i].VirtualAddress);
}
PointerToRawData(节在文件中所处的偏移)是节在文件中的起始位置
rva - m_pSectionStart[i].VirtualAddress 总的地址---起始地址 是一段长度