PE文件结构详解(三)

0x01 前言

  上一篇讲到了数据目录表的结构和怎找到到数据目录表(DataDirectory[16]),这篇我们我来讲讲数据目录表后面的另一个结构——区块表。

0x01 区块

  区块就是PE载入器将PE文件载入后,将PE文件分割成若干块,每块包含不同的信息,由读写数据块.data,代码块.code,只读数据块.rdata等等,一般至少得有读写数据块和代码块。区块的的划分信息保存在一张名为区块表(IMAGE_SECTION_HEADER)的结构中。区块表紧邻着PE文件头IMAGE_NT_HEAER。它的结构如下:

typedef struct _IMAGE_SECTION_HEADER 

{

        BYTE Name[IMAGE_SIZEOF_SHORT_NAME];     // 节表名称,“.text” 

        //IMAGE_SIZEOF_SHORT_NAME=8

        union
         {

                DWORD PhysicalAddress;        // 物理地址

                DWORD VirtualSize;                // 真实长度,这两个值是一个联合结构,可以使用其中的任何一个,一

                                                              // 般是取后一个

        } Misc;

        DWORD VirtualAddress;              // 节区的 RVA 地址

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

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

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

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

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

        WORD NumberOfLinenumbers;    // 行号表中行号的数目

        DWORD Characteristics;              // 节属性如可读,可写,可执行等} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; 

大小位40字节。由于它紧邻PE文件头,而PE文件头的中的Data[16]中的最后一个保留双字开头为100h+F0h=1F0h故区块表的开始位为1F0h+8h=1f8h,共占四十个字节,如下图:

 

由上图我们可读出很多重要信息,前八个字节可以知道这是个.code块,后面四个字节为00001000h这个是VirtualSize字段即Vsize,再后面四个字节是00001000h这个是VirtualAddressRAV字段,这个字段很有用,后面将会讲到。再后面是00000200h,标识的是SizeOfRawData字段,这个字段也很有用。再后面的几个字段就不再介绍了,其实用的也不多,用到了可以再进行分析。上图可知Code区段后面就是DATA区段了,分析方法和CODE字段一样,这里就不再做介绍了。

  对于上述的分析其实我们也可以通过工具来完成,我们今天来使用另一个强大的工具PEID,这个工具对于脱壳来说很有用。我们打开PEID.exe。直接把文件拖到PEID窗口即可,点击EP段:边上的按钮即可查看刚刚分析的内容。如下图:

 

显然我们的分析是正确的。注意这里写的V偏移即为RAVV大小即为VsizeR大小即为SizeOfRawData,至于R偏移后面会介绍。

posted @ 2018-10-19 16:48  2f28  阅读(3879)  评论(0编辑  收藏  举报