表1.1.5 1.3 节表节表是一个结构数组,每个结构包含一个节的信息。我们通过NumberOfSections值来了解该数组中到底有几个成员。在实际操作中,如果有一个节表的内容全为0,则表示节已经结束,为了证明这一点,我们可以增加NumberOfSections的值,Windows仍然可以正常执行文件。因为Windows读取NumberOfSections的值然后检查节表里的每个结构,如果找到一个全0结构就结束搜索,否则一直处理完NumberOfSections指定数目的结构。但是这个结构却是不能省略的,可能的原因是PE格式说明中没有指定节表必须以全0结构结束,因此仍然需要NumberOfSections。此结构共有10个域,各个域说明如表1.1.6:域说明 Name8位ANSI节名(非UNICODE内码)。
Misc包含一个结构,但是好像没用,主要针对EXE与OBJ的。 VirtualAddress本节的RVA,此值非常重要 SizeOfRawData经过文件对齐处理后节尺寸,PE装载器提取本域的值了解需映射入内存的节的字节数。 PointerToRawData节基于文件的偏移量,PE装载器通过它找到节数据在文件中的位置。 PointerToRelocations重定位的偏移,一般不用。 PointerToLinenumbers行号表的偏移,一般不用。 NumberOfRelocations重定位项数目,一般不用。 NumberOfLinenumbers行号表的数目,一般不用。 Characteristics包含标记以指示节属性,比如节是否含有可执行代码,是否可写等。详细信息察看附加表1.1.6.1 表1.1.6 常量名值 IMAGE_SCN_CNT_CODE { 包含代码 }$00000020 IMAGE_SCN_CNT_INITIALIZED_DATA { 含初始数据 }$00000040 IMAGE_SCN_CNT_UNINITIALIZED_DATA { 含未初始数据 }$00000080 IMAGE_SCN_LNK_INFO { 含文字说明或其他信息 }$00000200 IMAGE_SCN_LNK_REMOVE { 此块不被放入最终EXE文件中 }$00000800 ………… IMAGE_SCN_LNK_NRELOC_OVFL { 含扩展重定位信息 }$01000000 IMAGE_SCN_MEM_DISCARDABLE { 可丢弃 }$02000000 IMAGE_SCN_MEM_NOT_CACHED { 不可隐藏 }$04000000 IMAGE_SCN_MEM_NOT_PAGED { 不可分 }$08000000 IMAGE_SCN_MEM_SHARED { 可共享 }$10000000 IMAGE_SCN_MEM_EXECUTE { 可执行 }$20000000 IMAGE_SCN_MEM_READ { 可读 }$40000000 IMAGE_SCN_MEM_WRITE { 可写 }$80000000 附加表1.1.6.1 (Characteristics对照表) 1.4 节文件的主要部分就是这部分了,它占了文件的绝大部分大小,也是程序中的重点,不同的节存储了不同的数据。在下面我将介绍一些比较常见的节的作用,这些节的内容我就不作具体分析了,因为如果把内容都列出来,那分析的结果比原文件还大,都不知道看什么了。排列顺序根据重要度及遇到的频繁度,并不是在程序中的顺序,因为每个程序包含的节数量和名字都可能不同。
1.4.1 “.text” “.text”是在编译或汇编结束时产生的一种块。它的内容全是指令代码。如果使用的是Borland C++的编译器,则此节可能名为“CODE”。
1.4.2 “.data” 如同“.text”是默认的代码块一样,“.data”是初始化的数据块。这些数据包括编译时被初始化的globle和static变量,也包括字符串。连接器将OBJs及LIBs文件的“.data”结合成一个大的“.data”。 1.4.3 “.idata” “.idata”包含其他外来DLL的函数及数据信息。该块功能于NE文件的模块引用表类似,关键的差异在于PE文件中的每一个输入函数都明确的列于该块中,要在NE格式中找到相同的信息,必须从各个段的重定位数据中查找。 1.4.4 “.edata” “.edata”是该PE文件输出函数和
数据的列表,以供其他模块引用。它与NE文件中的入口表、驻留名表及非驻留名表综合功能相似。PE格式文件没有必要输出一个函数,所以通常只是在DLL文件中才可以见到“.edata”块。 1.4.5 “.rsrc” “.rsrc”包含模块的全部资源。如图标、菜单、位图等等。由于此节的复杂性和重要性,我将在1.5节重点讨论,PEDUMP文件分析器程序就是根据此节分析资源部分的。
1.4.6 “.reloc” “.reloc”保存基地址重定位表。当装载程序不能按连结器所指定的地址装载文件时,需要对指令或已初始化的变量进行调整,基地址重定位表包含了调整所需的数据。如果装载程序能够正常装载文件,则“.reloc”中的重定位参数将被忽略。
1.4.7 “.tls” TLS的意思是“thread local storage”(线程局部存储器),它与Win32的TlsAlloc系列功能有关。
1.4.8 “.rdata” “.rdata”块通常是在“.data”或“.bss”中间,但程序中很少用到该块中的数据。至少有两种情况下要用到“.rdata”,一是在Microsoft的连结器产生的EXE文件中,用于存放调试