您的位置:首页 > 其它

PE文件格式--IMAGE_SECTION_HEADER

2011-03-26 10:10 267 查看
转自【看雪】

我们常说的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

同上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: