微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

认识PE文件格式-区块表

前篇文章讲了讲DOS头和PE头的具体结构、组成,以及结构中所需要注意的关键字段,今天这章谈谈区块表(Section Table),还有简单的地址换算。
上一章说了,一个exe文件被加载到内存后的大致结构:DOS头->PE头->区块表->各区块->末尾信息。区块表紧跟在PE头之后,也就是说,IMAGE_NT_HEADERS后的数据就是具体的区块表信息。

区块表是一个数组,数组中每个元素的类型为IMAGE_SECTION_HEADER,结构如下:

typedef struct {
    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME]; //区块名
    union {
            DWORD   PhysicalAddress;
            DWORD   VirtualSize;
    } Misc;
    DWORD   VirtualAddress;   //该区块被加载到内存中的基址的RVA
    DWORD   SizeOfRawData;        
    DWORD   PointerToRawData;
    DWORD   PointerToRelocations;
    DWORD   PointerToLinenumbers;
    WORD    NumberOfRelocations;
    WORD    NumberOfLinenumbers;
    DWORD   characteristics;  //该区块属性(可读/可写/可执行等)
} IMAGE_SECTION_HEADER;
在区块表数组中,一个IMAGE_SECTION_HEADER类型的元素,便对应一个区块。一个普通的exe文件,通常有2个区块:代码段(.code)和数据段(.data),所以,区块表数组中至少有2个元素。

下面,谈谈地址变换。
当PE文件未被装入内存时,它存放在硬盘上,此时,该PE文件中的某个数据相对于文件头的偏移量叫做文件偏移地址(File Offset),该数据在物理硬盘上的地址叫文件地址。当PE文件被装入内存时,上述相同的数据相对于映像基址的偏移量叫做相对虚拟地址(RVA),该数据在内存中的地址叫做虚拟地址(VA)。
下面,我截取了《加密与解密》中的一张图来说明硬盘上的 File Offset与内存中的RVA之间相关转化的过程


.text段在内存中的地址空间为401000h - 402000h,以.text中VA(虚拟地址)为401100h处的数据为例:

.text头在硬盘上的文件偏移地址为400h,.text头在内存中的RVA=401000-400000=1000h,此时,.text对应一个差值k=1000h-400h=C00h,k表示.text中的数据从RVA转到文件偏移地址所需要的一个变化。转向VA为401100h的数据,该数据在硬盘上的文件偏移地址可以这样计算:File Offset = VA - ImageBase - k = 401100h - 400000h - C00h = 500h。

同理,知道某数据在硬盘上的文件偏移地址,想得到其在内存中的VA,则 VA = File Offset + ImageBase + k。网上也有各种地址转换工具,但原理都一样。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐