PE结构学习笔记(四)

Chinese:

这个篇幅将通过一个具体实例来从16进制文本中找到区块表

1、首先用一个16进制编辑器(UltraEdit, WinHex etc..)打开一个可执行文件(exe)

2、在00000200h找到PE Header,+04h的偏移地址是File Header,+14h的地址记录了IMAGE_OPTIONAL_HEADER32结构的大小

3、+18h是OptionalHeader,OptionalHeader的地址加上SizeOfOptionalHeader即为区块表的地址:00000218h + E0h = 000002F8h

4、区块表结构如下:

typedef struct IMAGE_SECTION_HEADER

{

BYTE Name[IMAGE_SIZEOF_SHORT_NAME];  //节表名称,如".text", IMAGE_SIZEOF_SHORT_NAME=4

union

{

DWORD PhysicalAddress;  //物理地址

DWORD VirtualSize;  //真实长度

} Misc;

DWORD VirtualAddress;  //节区的RVA地址

DWORD SizeOfRawData;  //在文件中对齐后的尺寸

DWORD PointerToRawData;  //在文件中的偏移量

DWORD PointerToRelocations;  //在obj文件中使用,重定位的偏移

DWORD PointerToLinenumbers;  //行号表的偏移(供调试使用地)

WORD NumberOfRelocations;  //在ojb文件中使用,重定位项数目

WORD NumberOfLinenumbers;  //行号表中行号的属木

DWORD Characteristics;  //节属性 如可读、可写、可执行等

} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

可以算出每个区块表的结构占40个字节,专成16进制就是28h,也就是说第二个区块表的地址是0x000002F8h + 28h = 0x00000320h

5、同理可以算出第三个、第四个、第五个。。。

原文地址:https://www.cnblogs.com/maplewan/p/3231343.html