PE文件-节头表

PE文件的NT头后面紧接着是节头表,节头表中的条目数由文件头中的NumberOfSections字段给出,节头表中的条目是从1开始编号的。

%title插图%num
//
// Section header format.
//

#define IMAGE_SIZEOF_SHORT_NAME              8

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;

NumberOfSections是4,在PE文件-FileHeader解剖一文中已经得出了。我们逐个看看。

第1个节头

Name[IMAGE_SIZEOF_SHORT_NAME]。Name即节名称,IMAGE_SIZEOF_SHORT_NAME是8,Name[8],是一个容量位8个字节的数组

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8)) -l 8 test.exe
000001e0: 2e74 6578 7400 0000                      .text...
root@entry0:~#

第一个节名称是.text节

Misc。这是一个联合体,其中有2个字段,分别是PhysicalAddress和VirtualSize,由于联合体的特殊性,看着2个字段分别都是DWORD类型,实际上占4个字节,联合体任何时候只能有一个生效。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8)) -l 4 test.exe
000001e8: 66a9 0000                                f...
root@entry0:~#

Misc是0xa966,一般取VirtualSize这个字段,即VirtualSize是0xa966

看微软官方文档只取了VirtualSize字段来解释。说该字段指的是程序加载到内存中时该节的总大小。 如果此值大于SizeOfRawData,则将该节区填充零。 该字段仅对可执行映像有效,并且对于目标文件应设置为零。

我这里VirtualSize是0x1000,说明.text节加载到内存中时分配的空间是0x1000个字节。

VirtualAddress。该节虚拟地址,对应的节区在内存中的首地址。

For executable images, the address of the first byte of the section relative to the image base when the section is loaded into memory. For object files, this field is the address of the first byte before relocation is applied; for simplicity, compilers should set this to zero. Otherwise, it is an arbitrary value that is subtracted from offsets during relocation.

对于可执行映像,是将节区加载到内存时该节相对于映像库的第一个字节的地址。 对于目标文件,此字段是应用重定位之前的第一个字节的地址; 为简单起见,编译器应将此设置为零。 否则,它是在重定位期间从偏移量中减去的任意值。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4)) -l 4 test.exe
000001ec: 0010 0000                                ....
root@entry0:~#

VirtualAddress是0x1000,第一个节区是.text节,说明.text节在内存中的偏移量是0x1000

SizeOfRawData。节数据大小,必须是OptionalHeader中的FileAlignment的倍数。

The size of the section (for object files) or the size of the initialized data on disk (for image files). For executable images, this must be a multiple of FileAlignment from the optional header. If this is less than VirtualSize, the remainder of the section is zero-filled. Because the SizeOfRawData field is rounded but the VirtualSize field is not, it is possible for SizeOfRawData to be greater than VirtualSize as well. When a section contains only uninitialized data, this field should be zero.

节的大小(对于目标文件)或磁盘上初始化的数据的大小(对于映像文件)。 对于可执行映像,它必须是可选标头中FileAlignment的倍数。 如果小于VirtualSize,则该节的其余部分为零。 由于SizeOfRawData字段是四舍五入的,而VirtualSize字段不是四舍五入的,因此SizeOfRawData也可能大于VirtualSize。 当节仅包含未初始化的数据时,此字段应为零。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4)) -l 4 test.exe
000001f0: 00b0 0000                                ....
root@entry0:~#

SizeOfRawData是0xb000,.text节的数据大小是0xb000,大于VirtualSize大小

PointerToRawData。指向该节的首页地址的指针。

The file pointer to the first page of the section within the COFF file. For executable images, this must be a multiple of FileAlignment from the optional header. For object files, the value should be aligned on a 4-byte boundary for best performance. When a section contains only uninitialized data, this field should be zero.

指向文件中该节首页的文件指针。 对于可执行映像,它必须是可选标头中FileAlignment的倍数。 对于目标文件,该值应在4字节边界上对齐以获得最佳性能。 当节仅包含未初始化的数据时,此字段应为零。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4)) -l 4 test.exe
000001f4: 0010 0000                                ....
root@entry0:~#

PointerToRawData是0x1000,说明.text节的首页指针是0x1000

PointerToRelocations。该节的重定位条目的指针。

The file pointer to the beginning of relocation entries for the section. This is set to zero for executable images or if there are no relocations.

指向该节的重定位条目开头的文件指针。 对于可执行映像或没有重定位,此值设置为零。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4)) -l 4 test.exe
000001f8: 0000 0000                                ....
root@entry0:~#

PointerToRelocations也是0,说明.text节的重定位条目指针为0

PointerToLinenumbers。该节的行号条目的指针。

The file pointer to the beginning of line-number entries for the section. This is set to zero if there are no COFF line numbers. This value should be zero for an image because COFF debugging information is deprecated.

指向该节行号条目开头的文件指针。 如果没有COFF行号,则将其设置为零。 对于可执行映像文件此值应为零,因为不建议使用COFF调试信息。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4)) -l 4 test.exe
000001fc: 0000 0000                                ....
root@entry0:~#

PointerToLinenumbers是0,说明.text节行号条目指针是0

NumberOfRelocations。该节的重定位条目数量。

The number of relocation entries for the section. This is set to zero for executable images.

该节的重定位条目数。 对于可执行映像,它设置为零。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4)) -l 2 test.exe
00000200: 0000                                     ..
root@entry0:~#

NumberOfRelocations是0x20,.text节的重定位条目数量是0

NumberOfLinenumbers。该节的行号条目数量。

The number of line-number entries for the section. This value should be zero for an image because COFF debugging information is deprecated.

该节的行号条目数。 对于可执行映像,此值应为零,因为不建议使用COFF调试信息。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2)) -l 2 test.exe
00000202: 0000                                     ..
root@entry0:~#

NumberOfLinenumbers是0x6000,.text节的行号条目数量也是0

Characteristics。该节的特征标志。

The flags that describe the characteristics of the section. For more information, see Section Flags.

描述该节特征的标志。 有关更多信息,请参见节标志

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2)) -l 4 test.exe
00000204: 2000 0060                                 ..`
root@entry0:~#

Characteristics是0x60000020,.text节的特征标志是0x60000020

//
// Section characteristics.
//
//      IMAGE_SCN_TYPE_REG                   0x00000000  // Reserved.
//      IMAGE_SCN_TYPE_DSECT                 0x00000001  // Reserved.
//      IMAGE_SCN_TYPE_NOLOAD                0x00000002  // Reserved.
//      IMAGE_SCN_TYPE_GROUP                 0x00000004  // Reserved.
#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
//      IMAGE_SCN_TYPE_COPY                  0x00000010  // Reserved.

#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.

#define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
#define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
//      IMAGE_SCN_TYPE_OVER                  0x00000400  // Reserved.
#define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
#define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
//                                           0x00002000  // Reserved.
//      IMAGE_SCN_MEM_PROTECTED - Obsolete   0x00004000
#define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000  // Reset speculative exceptions handling bits in the TLB entries for this section.
#define IMAGE_SCN_GPREL                      0x00008000  // Section content can be accessed relative to GP
#define IMAGE_SCN_MEM_FARDATA                0x00008000
//      IMAGE_SCN_MEM_SYSHEAP  - Obsolete    0x00010000
#define IMAGE_SCN_MEM_PURGEABLE              0x00020000
#define IMAGE_SCN_MEM_16BIT                  0x00020000
#define IMAGE_SCN_MEM_LOCKED                 0x00040000
#define IMAGE_SCN_MEM_PRELOAD                0x00080000

#define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
#define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
#define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
#define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
#define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
#define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
#define IMAGE_SCN_ALIGN_128BYTES             0x00800000  //
#define IMAGE_SCN_ALIGN_256BYTES             0x00900000  //
#define IMAGE_SCN_ALIGN_512BYTES             0x00A00000  //
#define IMAGE_SCN_ALIGN_1024BYTES            0x00B00000  //
#define IMAGE_SCN_ALIGN_2048BYTES            0x00C00000  //
#define IMAGE_SCN_ALIGN_4096BYTES            0x00D00000  //
#define IMAGE_SCN_ALIGN_8192BYTES            0x00E00000  //
// Unused                                    0x00F00000
#define IMAGE_SCN_ALIGN_MASK                 0x00F00000

#define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  // Section contains extended relocations.
#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.

.text节的特征标志是0x60000020,是如上的倒数第2个属性、倒数第三个属性和顺数(不含注释行)第2个属性组成,总结就是该节,即.text节可读、可执行和拥有可执行代码。

第2个节头

Name。节名称

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4)) -l 8 test.exe
00000208: 2e72 6461 7461 0000                      .rdata..
root@entry0:~#

第二个节头是.rdata节

VirtualSize。该节大小

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8)) -l 4 test.exe
00000210: e60f 0000                                ....
root@entry0:~#

.rdata节的大小是0xfe6,载入内存后占用0xfe6个字节

VirtualAddress。该节虚拟地址,对应的节区在内存中的首地址。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4)) -l 4 test.exe
00000214: 00c0 0000                                ....
root@entry0:~#

.rdata节的在内存中的首地址是0xc000

SizeOfRawData。节数据大小,必须是OptionalHeader中的FileAlignment的倍数。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4)) -l 4 test.exe
00000218: 0010 0000                                ....
root@entry0:~#

.rdata节的SizeOfRawData是0x1000

PointerToRawData。指向该节的首页地址的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4)) -l 4 test.exe
0000021c: 00c0 0000                                ....
root@entry0:~#

.rdata节的首页地址的指针是0xc000

PointerToRelocations。该节的重定位条目的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4)) -l 4 test.exe
00000220: 0000 0000                                ....
root@entry0:~#

.rdata节的重定位条目的指针是0

PointerToLinenumbers。该节的行号条目的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4)) -l 4 test.exe
00000224: 0000 0000                                ....
root@entry0:~#

.rdata节的行号条目的指针是0

NumberOfRelocations。该节的重定位条目数量。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4)) -l 2 test.exe
00000228: 0000                                     ..
root@entry0:~#

.rdata节的重定位条目数量是0

NumberOfLinenumbers。该节的行号条目数量。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2)) -l 2 test.exe
0000022a: 0000                                     ..
root@entry0:~#

.rdata节的行号条目数量也是0

Characteristics。该节的特征标志,也就是属性。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2)) -l 4 test.exe
0000022c: 4000 0040                                @..@
root@entry0:~#

0x40000000是IMAGE_SCN_MEM_READ,0x40是IMAGE_SCN_CNT_INITIALIZED_DATA,0x40000000+0x40=0x40000040,说明.rdata节是可读属性和包含初始化数据属性。

第3个节头

Name。该节名称

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4)) -l 8 test.exe
00000230: 2e64 6174 6100 0000                      .data...
root@entry0:~#

第三个节头是.data节

VirtualSize。该节大小

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8)) -l 4 test.exe
00000238: 5c70 0000                                \p..
root@entry0:~#

.data节的大小是0x705c,载入内存后占用0x705c个字节

VirtualAddress。该节虚拟地址,对应的节区在内存中的首地址。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4)) -l 4 test.exe
0000023c: 00d0 0000                                ....
root@entry0:~#

.data节的虚拟地址是0xd000,.data节在内存中的地址是0xd000。

SizeOfRawData。节数据大小,必须是OptionalHeader中的FileAlignment的倍数。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4)) -l 4 test.exe
00000240: 0040 0000                                .@..
root@entry0:~#

.data节的数据大小是0x4000,小于VirtualSize大小,小于的部分都是被0填充。

PointerToRawData。指向该节的首页地址的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4)) -l 4 test.exe
00000244: 00d0 0000                                ....
root@entry0:~#

.data节的首页地址的指针是0xd000。

PointerToRelocations。该节的重定位条目的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4)) -l 4 test.exe
00000248: 0000 0000                                ....
root@entry0:~#

.data节的重定位条目的指针也是0。

PointerToLinenumbers。该节的行号条目的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4)) -l 4 test.exe
0000024c: 0000 0000                                ....
root@entry0:~#

.data节的行号条目的指针是0。

NumberOfRelocations。该节的重定位条目数量。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4)) -l 2 test.exe
00000250: 0000                                     ..
root@entry0:~#

.data节的重定位条目数量是0。

NumberOfLinenumbers。该节的行号条目数量。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2)) -l 2 test.exe
00000252: 0000                                     ..
root@entry0:~#

.data节的行号条目数量也是0。

Characteristics。该节的特征标志,也就是属性。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2)) -l 4 test.exe
00000254: 4000 00c0                                @...
root@entry0:~#

0xc0000040=0x80000000+0x40000000+0x40,0x80000000是可读属性、0x40000000是可写属性和0x40是包含未初始化数据的属性,说明.data节的属性是可读可写和包含未初始化数据的属性。

第4个节头

Name。该节名称

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4)) -l 8 test.exe
00000258: 2e72 7372 6300 0000                      .rsrc...
root@entry0:~#

第4个节头是.rsrc节头

VirtualSize。该节大小

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8)) -l 4 test.exe 
00000260: c807 0000                                ....
root@entry0:~#

.rsrc节的大小是0x7c8,载入内存后占0x7c8个字节

VirtualAddress。该节虚拟地址,对应的节区在内存中的首地址。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4)) -l 4 test.exe
00000264: 0050 0100                                .P..
root@entry0:~#

.rsrc节的虚拟地址是0x15000,.rsrc节在内存中的地址是0x15000

SizeOfRawData。节数据大小,必须是OptionalHeader中的FileAlignment的倍数。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4)) -l 4 test.exe
00000268: 0010 0000                                ....
root@entry0:~#

.rsrc节的数据大小是0x1000,大于VirtualSize的大小

PointerToRawData。指向该节的首页地址的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4)) -l 4 test.exe
0000026c: 0010 0100                                ....
root@entry0:~#

.rsrc节的首页地址的指针是0x11000

PointerToRelocations。该节的重定位条目的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4)) -l 4 test.exe
00000270: 0000 0000                                ....
root@entry0:~#

.rsrc节的重定位条目的指针是0

PointerToLinenumbers。该节的行号条目的指针。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4)) -l 4 test.exe
00000274: 0000 0000                                ....
root@entry0:~#

.rsrc节的行号条目的指针也是0

NumberOfRelocations。该节的重定位条目数量。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4)) -l 2 test.exe
00000278: 0000                                     ..
root@entry0:~#

.rsrc节的重定位条目数量是0

NumberOfLinenumbers。该节的行号条目数量。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2)) -l 2 test.exe
0000027a: 0000                                     ..
root@entry0:~#

.rsrc节的行号条目数量也是0

Characteristics。该节的特征标志,也就是属性。

root@entry0:~# xxd -s $((0xe8+4+2+2+4+4+4+2+2+2+1+1+4+4+4+4+4+4+4+4+4+2+2+2+2+2+2+4+4+4+4+2+2+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2+4+8+4+4+4+4+4+4+2+2)) -l 4 test.exe
0000027c: 4000 0040                                @..@
root@entry0:~#

0x40000040=0x40000000+0x40,0x40000000是IMAGE_SCN_MEM_READ,0x40是IMAGE_SCN_CNT_INITIALIZED_DATA,说明.rsrc节是可读属性和包含初始化数据属性。

发表回复