PE文件-节头表
PE文件的NT头后面紧接着是节头表,节头表中的条目数由文件头中的NumberOfSections字段给出,节头表中的条目是从1开始编号的。
// // 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节是可读属性和包含初始化数据属性。