PE文件格式--IMAGE_SECTION_HEADER
来源:互联网 发布:c 11多线程编程 编辑:程序博客网 时间:2024/06/05 07:51
转自【看雪】
我们常说的RVA,很容易让我们理解成这是相对于节的RVA,其实不然。
要理解RVA的概念,首先还必须理解Section Header结构(由Section Header构成节表)。
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
注意其中的VirtualAddress和PointerToRawData,这两个都是节的起始地址。不同之处在于:
VirtualAddress用在内存中指明该节的起始地址,而PointerToRawData用在文件中指明该
节的起始地址。
由于文件的对齐值和内存的对齐值不一样,所以,如果以直接用RVA(即iRVA)去定位的话,那么,可能是错误的。
这个RVA我把它分成三种情况,在不同情况下计算得出的RVA各给个名字:
为了方便理解,使用例子数据来说明。
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // .text
union {
DWORD PhysicalAddress;
DWORD VirtualSize; // 00069f9b
} Misc;
DWORD VirtualAddress; // 00000540
DWORD SizeOfRawData; // 00069fc0
DWORD PointerToRawData; // 00000540
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics; // 68000020
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
整理成和LordPE的形式如下:
名称Name VOffset VSize ROffset RSize 标志
.text 0000540 00069f9b 00000540 00069fc0 68000020
虚拟地址VA = 00049586,ImageBase = 00040000
1、该RVA是以ImageBase为参考的,即是通过RVA=VA - ImageBase = 00049586-00040000=9586 我们称其为iRVA(我们常说为RVA)
2、该RVA是以VOffset(如.text节的起始地址)为参考的,即是通过RVA=VA - VOffset,我们称其为mRVA(内存节偏移)
3、真正的文件偏为fRVA
我们很清楚的知道,唯有它们以节的起始地址为参考的相对偏移才是固定的。我们就根据这个来计算。
我们以VA=00049586为例子,为了得到它的文件偏移,我们需要经过以下的步骤:
先把VA转换成iRVA,即iRVA = VA - ImageBase = 00049586-00040000=9586
把iRVA转换成mRVA,即mRVA = iRVA - VOffset = 9586-540=9046
得到了mRVA后,就很容易得到fRVA了,fRVA = mRVA+ROffset = 9046+540=9586
所以,VA=00049586的文件偏移为fRVA=9586
上面由于ROffset和VOffset值一样,所以,你别以为直接计算就行了。
最后总结:
1、虚拟地址转文件偏地址fRVA
fRVA = mRVA + ROffset
由于mRVA = iRVA - VOffset
再由于iRVA = 虚拟地址 - ImageBase
所以,mRVA = (虚拟地址 - ImageBase) - VOffset
所以,fRVA = (虚拟地址 - ImageBase) - VOffset + ROffset
最终得到:
fRVA = (虚拟地址 - ImageBase) - VOffset + ROffset
一个简单的代入法!
2、RVA转文件偏移地址fRVA
同上
- PE文件格式--IMAGE_SECTION_HEADER
- PE文件区块表IMAGE_SECTION_HEADER
- PE文件,节头有感IMAGE_SECTION_HEADER
- PE文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- pe文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- PE文件格式
- 通货膨胀
- 文件读取的一点知识
- 首次配置服务器端apache,iptables,hotst,mysql
- 配置Dotnetnuke使用AD用户认证
- Nachos 3.4入门的两个问题
- PE文件格式--IMAGE_SECTION_HEADER
- access 详细时间解析
- GDT详解
- explicit构造函数
- [转]客户端HTTP请求的Header信息
- VS2008编译器下ACE的配置
- 孤儿进程和僵尸进程
- window SVN上自动更新项目内容
- ArcGIS 空间校正(spatial adjustment)使用方法心得