本文共 983 字,大约阅读时间需要 3 分钟。
节表和节——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 总的地址---起始地址 是一段长度
转载地址:http://apumf.baihongyu.com/