zoukankan      html  css  js  c++  java
  • Windows Pe 第三章 PE头文件(中)

        这一章的上半部分大体介绍了下PE文件头,下半部分是详细介绍里面的内容,这一章一定要多读几遍,好好记记基础概念和知识,方便之后的学习。

    简单回忆一下:


    3.4  PE文件头部解析

    3.4.1 DOS MZ IMAGE_DOS_HEADER

     

     

     

          DOS MZ头的下面是DOSS Stub。整个DOSS Stub是一个字节块,其内容随着链接时使用的连接器不同而不同,PE中没有与之对应的相关结构。

    3.4.2 PE头标识Signature

        紧跟在DOS Stub后面的是PE头标识Signature。与大部分分支文件格式的头部结构一样,PE头部信息中有一个四字节的标识,该标识位于指针IMAGE_DOS_HEANDER.e_lfanew指向的位置。其内容固定,对应于ASCII码的字符串”PE”

    3.4.3  标准PEIMAGE_FILE_HANDER

        标准PEIMAGE_FILE_HEADER紧跟在PE头标识后,即位于IMAGE_DOS_HEADERe_lfanew+4的位置。由此位置开始的20个字节为数据结构标准PEIMAGE_FILE_HEANDER的内容。该结构在微软的官方文档中被称为标准通用对象文件格式(Common Object File Format,COFF)头,它记录了PE文件的全局属性,该PE文件运行的平台、PE文件类型(是EXE还是DLL文件)、文件中存在的节的总数,其详细定义如下:

     


     

     

        该结构常用于判断PE文件是EXE还是DLL类型,不但可以通过该结构得到PE文件中节的数量,还可以当成对接信息进行遍历操作时的循环次数。

    3.4.4  扩展PEIMAGE_OPTIONAL_HEADER32

        尽管从名字上看好像该部分数据是可选的,但在PE文件结构中,它却有着比标准PE头更多的内容。详细定义如下:

     

     

     

         文件执行时的入口地址、文件被操作系统装入内存后的默认基地址,以及节在磁盘和内存中的对齐单位等信息均可以在此结构中找到。对于该结构中的某些数值的随意改动可能造成对PE文件的加载或运行失败。

    3.4.5 PEIMAGE_NT_HEADERS

        这个结构是广义上的PE头,在标准的PE文件中器大小为456个字节。它是3.4.2节、3.4.3节和3.3.4节中提到的三个数据结构的组合,即

    IMAGE_NT_HEADERS=4个字节的PE标识  +   IMAGE_FILE_HEADER +IMAGE_OPTIONAL_HEADER32

     

    该结构定义如下(汇编)

    IMAGE_NT_HEADERS STRUCT

      Signature DWORD ?   ;0000h                       -PE文件标识,”PE”

      FileHeader IMAGE_FILE_HEADER <> ;0004h             -PE标准头

      OptionalHeader IMAGE_OPTIONAL_HEADER32<>;0018h  -PE扩展头

    IMAGE_NT_HEADERS ENDS

    3.4.6  数据目录项IMAGE_DATA_DIRECTORY

        IMAGE_OPTIONAL_HEADER32(扩展PE)结构的最后一个字段位DataDirectory

        该字段定义了PE文件中出现的所有不同类型的目录信息。如前所述,应用程序中的数据被按照用途分成很多种类,如导入表、导出表、资源、重定位表等。在内存中,这些数据被操作系统以页位单位组织起来,并赋以不同的访问属性;在文件中,这些数据也同样被组织起来,按照不同的类别分别放在文件的指定位置。该结构就是用来描述这些不同类别的数据在文件(和内存)中的位置及大小的,因为这个字段比较重要。

        从Windows NT 3.1 操作系统开始到现在,该数据目录中定义的数据类型一直是16种。PE中使用了一种称作“数据目录项IMAGE_DATA_DIRECTORY”的数据结构来定义每种数据。该结构只有两个字段,结构具体定义如下:

    IMAGE_DATA_DIRECTORY STRUCT

      VirtualAddress DWORD ? ;000h - 数据其实RVA

      isize DWORD ?         ;004h - 数据块的长度

    IMAGE_DATA_DIRECTORY ENDS

        两个字段依次为VirtualAddress isize。如图3-11所示,总的数据目录一共由16个相同的IMAGE_DATA_DIRECTORY结构连续排列在一起组成。

     

        这16个元组的没组每一项均代表PE中的某一个类型的数据,各数据类型详见表3-1 

     

     

          如果想在PE文件中寻找特定类型的数据,就需要从该结构开始。比如,要想查看PE中都调用了哪些动态间接库的函数,则需要从数据目录表的第2个元素的IMAGE_DATA_DIRECTORY结构获取导入表在文件中的起始位置和大小,然后再根据VirtualAddress_1地址指向的位置找到导入表相关的字节码。这种信息组织方式正式本章开始的“头部+身体”的数据组织方式。

      下面是这16个数据目录项依次展开后的新结构:

            

            

    3.4.7  节表项IMAGE_SECTION_HEADER

        PEIMAGE_NT_HEADERS后面紧跟着节表。它由许多节表项(IMAGE_SECTION_HEADER)组成,每个节表项纪录了PE中与某个特定节有关的信息,如节的属性、节的大小、在文件和内存中的起始位置等。节表中节的数量有字段IMAGE_FILE_HEADER.NumberOfSections来定义。

    节表项的数据结构详细定义如下:

     


         节表后面就是节的内容。截至节表,PE文件头设计的所有数据结构已经全部介绍完毕。接下来,集中对以上所有数据结构中每个字段进行详细介绍。

  • 相关阅读:
    并发之CAS无锁技术
    dubbo-admin打包和zookper安装
    读书笔记<深入理解JVM>01 关于OutOfMemoryError 堆空间的溢出
    关于mybatis和spring复合pom的异常
    ElasticSearch入门一
    Niginx +Tomcat 集群搭建
    使用自定义线程池优化EchoServer
    使用线程池优化Echo模型
    获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
    java中double和float精度丢失问题
  • 原文地址:https://www.cnblogs.com/csnd/p/12062241.html
Copyright © 2011-2022 走看看