源代码如下:

[PE格式分析] 4.IMAGE_FILE_HEADER,imagefileheader

源代码如下:

typedef struct _IMAGE_FILE_HEADER {
+04h    WORD          Machine;              // 运行平台
+06h    WORD          NumberOfSections;     // 文件的区块数目
+08h    DWORD         TimeDateStamp;        // 文件创建日期和时间
+0Ch    DWORD         PointerToSymbolTable; // 指向符号表(主要用于调试)
+10h    DWORD         NumberOfSymbols;      // 符号表中符号个数(同上)
+14h    WORD          SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 结构大小
+16h    WORD          Characteristics;      // 文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

Machine字段

常用的有:

宏定义 平台及相关意义 数值
IMAGE_FILE_MACHINE_I386 x86、Intel 386 0x014c
IMAGE_FILE_MACHINE_IA64 Intel Itanium、Intel 64 0x0200
IMAGE_FILE_MACHINE_AMD64 x64、AMD64 (K8) 0x8664

能够取值如下,摘取自源代码:

#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
#define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2
#define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP
#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
#define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5
#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB             0x01c2  // ARM Thumb/Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_AM33              0x01d3
#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
#define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon
#define IMAGE_FILE_MACHINE_CEF               0x0CEF
#define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE               0xC0EE

实例图片:

此外一个例子:

NumberOfSections
    pe文件中区块的多寡。紧跟在本结构的前面的。
TimeDateStamp
   
文件日期时间戳,指那么些pe文件生成的光阴,它的值是从1969年1四月31日16:00:00的话的秒数.
PointerToSymbolTable
    Coff调试符号表的偏移地址。
NumberOfSymbols
    Coff符号表中符号的个数. 那一个域和前个域在release版本的程序里是0。
SizeOfOptionalHeader
   
IMAGE_OPTIONAL_HEADER32结构的尺寸(即多少字节).大家随后就要涉及这些结构了.事实上,pe文件的多数根本的域都在IMAGE_OPTIONAL_HEADER结构里。(对于32位PE文件,那一个值一般是00E0h;对于64位PE32+文件,这些值一般是00F0h
)。
Characteristics
   
这一个域描述pe文件的片段性质音讯,比如是不是可举行,是不是是一个动态连接库等.具体定义如下:

#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // 重定位信息被移除,文件必须加载先前的基地址
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // 文件可执行
#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // 行号被移除
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // 符号被移除
#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // 程序能处理大于2G的地址
#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32位机器
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // .dbg文件的调试信息被移除
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // 如果在移动介质中,拷到交换文件中运行
#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // 如果在网络中,拷到交换文件中运行
#define IMAGE_FILE_SYSTEM                    0x1000  // 系统文件
#define IMAGE_FILE_DLL                       0x2000  // 文件是一个dll
#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // 文件只能运行在单处理器上
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.

]
4.IMAGE_FILE_HEADER,imagefileheader 源代码如下: typedef struct
_IMAGE_FILE_HEADER { +04h WORD Machine; // 运行平台 +06h WORD
NumberOfSections; // 文件…

源代码如下:

PE文件结构详解,pe结构详解

  1、定位标准PE头

  DOS
Stub长度不固定,所以DOS头不是一个稳定大小的数据结构。DOS头放在PE的先导地方,通过DOS头去稳定前面标准PE头的地点就是经过字段e_lfanew。

  e_lfanew字段的值是一个绝对偏移量,绝对定位时索要加上DOS
MZ头的基地址。

  也就是PE头的断然位置是:

  PE_start = DOS MZ 基地址+IMAGE_【澳门金沙国际】PE格式分析,PE文件结构详解。DOS_HEADER.e_lfanew

  2、PE文件结构

  在32位系统下,最首要的部分是PE头和PE数据区。

  32位系统下的PE文件被划分为:DOS MZ头、DOS Stub、PE头、节表和节内容。

  节表是PE中所有节的目录,每个目录的字节码就是节内容,节内容依照目录里的指针指向的地点,分别将节的字节码在文书空间中排列起来,组成一个整机的PE文件,PE文件

头等于DOS头加PE头。

  3、PE文件底部解析 

  DOS MZ头IMAGE_DOS_HEADER:

  其中最要害的积极分子是e_magic成员和e_lfanew成员。

  DOS MZ头上边的是DOS Stub。整个DOS
Stub是一个字节块,其内容随着链接时使用的链接器分化而各异,PE中并从未与之相应的相干社团。

  PE头标识Signature:

  在DOS Stub后的是PE
头标识Signature,PE尾部音信中有一个四字节的标识,该标识放在指针IMAGE_DOS_HEADER.elfanew指向的岗位。其内容定位,对应于ASCII码

  的字符串“PE\0\0”。

  标准PE头IMAGE_FILE_HEADER:

  标准的PE头IMAGE_FILE_HEADER在PE底部标识后边,即位于elfanew值+4的任务。从此地点上马的20个字节为数据结构标准PE头IMAGE_FILE_HEADER的内容。(该结

构在微软官方文档中被叫作标准通用对象文件格式)

  该片段记录了PE文件的全局属性,包涵PE文件运行的平台,PE文件类型(EXE
Or DLL?),文件中留存的节的总额等音信。

  该有的用途:判断文件类型,得到PE文件中节的总量,当成节区音信举行遍历操作时的轮回次数。

    扩展PE头IMAGE_OPTIONAL_HEADER32

 存储文件举行时的输入地址、文件被操作系统装入内存之后的默许基地址,节在磁盘和内存中的对其单位等信息。   

  PE头IAMGE_NT_HEADER:

  该有的是广义上的PE头,在标准PE文件中其尺寸为456字节

  IMAGE_NT_HEADER是上述三有的的总和,及Signature、IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER。

  该协会的详实定义如下:

  数据目录项IMAGE_DATA_DIRECTORY

  IMAGE_OPTIONAL_HEADER结构的尾声一个字段DataDirectory字段定义了PE文件中现身所有差异连串的数量的目录音讯。

  如导入表、导出表、资源和重定位表等。在内存中,这一个数量被操作系统以页为单位社团起来,并赋以差其余拜会属性。在文书中,这个数据也一样被协会起来,根据不相同品类

个别寄存在文书的指定位置。

  该社团就是用来叙述分化体系的数量在文书(和内存)中的地点及大小。

  该多少目录中定义的数据类型平素是种,PE中用数据目录项IMAGE_DATA_DIRECTORY的数据结构定义每种数据结构。

  结构定义如下:

  总得数据目录总共由16个相同的IMAGE_DATA_DIRECTORY结构延续排列在一块构成。

  节表项IMAGE_SECTION_HEADER:

  节表位于IMAGE_NT_HEADER之后,由两个节表项(IMAGE_SECTION_HEADER)组成,每个节表项记录了PE中与某个特定的节关于的音讯,如节的习性,节的尺寸,在

文本和内存中开场地方等。

  节表中的节的数据由字段IMAGE_FILE_HEADER中的NumberOfSection成员定义。

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

  4、PE头IMAGE_NT_HEADER的字段

  1.IMAGE_NT_HEADER.Signature

  +0000h,双字。PE文件标识,被定义为00004550h。

  假诺改变内部任何一个字节,操作系统就会无法把该文件识别为不易的PE文件。由于文件的DOS尾部分从没被毁损,程序仍然可以在DOS环境下运行。

  2.IMAGE_NT_HEADER.FileHeader:

  +0004h,结构。该协会指向IMAGE_FILE_HEADER。

  3.IMAGE_NT_HEADER.OptionalHeader:

  +0018h,结构。那几个指向IMAGE_OPTIONAL_HEADER32。它是操作系统影像文件所有独有的尾部信息。

  5、标准PE头IMAGE_FILE_HEADER的字段

  4.IMAGE_FILE_HEADER.Machine:

  +0004h,单字。指定给PE文件运行的阳台。

  5.IMAGE_FILE_HEADER.NumberOfSections:

  +0006h,单字。文件中留存的节的总额。

  在XP系统中,可以有0个节,不过数值不可能小于1,也不可能当先96,若是将该值设为0,操作系统在装载时会提醒不是立见成效的Win32程序。

  若是想在PE中追加或删除节,必须改变此处的值。

  这么些值不可能比实际内存中设有的节多,也不可能少,否则在装载的时候回出现错误。

  6.IMAGE_FILE_HEADER.TimeDateStamp:

  +0008h,双字。编译器成立此文件的年华戳。低32位存储的值是自1970年十二月1日00:00从头到创设时间截至的总秒数。

  那些值可以任由修改,对程序的运行没有影响。

  7.IMAGE_FILE_HEADER.PointerToSymbolTable:

  +000Ch,双字。COFF符号表的公文偏移。

  如果不设有COFF符号表,此值为0.对于映像文件,那个值为0。

  8.IMAGE_FILE_HEADER.NumberOfSymbols:

  +0010h,双字。符号表中元素的多寡。

  因为字符串表紧跟符号表,所以可以根据这几个值定位字符串表。

  在影像文件中,那些值为0,首要用来调试。

  9.IAMGE_FILE_HEADER.SizeOfOptionalHeader:

  +0014h,单字。指定结构IMAGE_OPTIONAL_HEADER32的长度。

  默认景况下,这么些值是00e0h,倘使是64位的PE文件,该社团默许大小为00F0h。

  10.IMAGE_FILE_HEADER.Characteristics:

  +0016h,单字。文件属性标志字段,它的不等数额位定义了差距的文件属性。那是一个很主要的字段,不一样的概念将震慑系统对文件的载入方式。

  对于普通的可实施PE文件来说,这么些字段的值一般是010fh,对于DLL文件来说,这么些字段的值是210ch。

  第1位为1时,注脚此映像文件是合法的,能够运作。即使未安装此标志,评释出现链接器错误。

  第10位为1时,如若此印象文件在可活动存储介质上,加载器将完全加载它并把它复制到内存调换文件中。

  第11位为1时,如若此印象文件在网络上,那么加载器也将完全加载它并把它复制到内存互换文件中。

  当第13位为1时,注脚此印象文件为动态链接库。那样的文件总被认为是可执行文件。

  可执行文件的标志位被装置为010fh,即第0、1、2、3、8位分别被安装为1,标识该文件为可执行文件,不含重一向新闻,不含符号新闻和表现音信,文件只在32位平台运

  行。

  6、扩展PE头IAMGE_OPTIONAL_HEADER32的字段

  11.IMAGE_OPTIONAL_HEADER32.Magic:

  +0018h,单字。魔术字,表达文件的类型,如若为010BH,则代表该公文为PE32;

  要是为0107h,则表示为ROM印象;假若为020BH,则象征文件为PE32+,即64位下的PE文件。

  12.IMAGE_OPTIONGAL_HEADER32.MajorLinkerVersion

  13.IMAGE_OPTIONAL_HEADER32.MinorLinkerVersion:

  +001ah,单字。那七个字段都是字节型,指定链接的本子号,对推行没有其余影响。

  14.IAMGE_OPTIONAL_HEADER32.SizeOfCode:

   
+001ch,双字。所有代码节的总和(以字节总结),该大小是基于文件对齐后的轻重,而非内存对齐后的轻重。

  15.IMAGE_OPTIONAL_HEADER32.SizeOfInitializedData:

   +0020h,双字。所有包括已经先河化的数码的节的总大小。

  16.IMAGE_OPTIONAL_HEADER32.SizeOfUninitializedData:

  +0024h,双字。所有包罗未起始化数据的节的总大小。

  数据未被初阶化,在文书中不占用空间,但被加载到内存之后,PE加载程序会为这么些数据分配适当大小的虚拟地址空间  

  17.IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint:

  +0028h,双字。该字段值是一个RVA,记录了启动代码距离该PE加载后的原初地方有稍许个字节。

  若是一个可执行文件中附加了一段自己的代码,并想让那段代码首先被实施,一般要修改那里的值,使其针对性自己代码的岗位。

  对于一般程序映像,它就是开行地址。

  对于设备驱动文件来说,它是初步化函数的地址。入口点对于DLL是可选的,若是不设有入口点,这一个字段值必须设置为0。

  18.IMAGE_OPTIONAL_HEADER32.BaseOfCode:

  +002Ch,双字。代码节的先河RVA,表示影象被加载进内存时代码节的起来相对于印象基地址的晃动地址。一般景观下,代码节紧跟在PE底部前边,节的名称日常为

  “.text”。

  19.IMAGE_OPTIONAL_HEADER32.BaseOfData:

  +0030h,双字。数据节的初步RVA,表示影像被加载进内存时数据节的发端相对于印象的基地址的撼动地址。一般景况下,数据节位于文件末尾,节的名目寻常为“.data”。

  20.IMAGE_OPTIONAL_HEADER32.ImageBase:

  +0034h,双字。该字段提出了PE映像的事先装入地址。就是在AddressOfEntryPoint中的程序被加载到内存之后的RVA。

  链接器在暴发可执行文件时,是对应以此地址生成机器码。

  借使操作系统也是比照这么些地方加载机器码到内存中,那么指令中有的是定点音讯就不要求修改了,那样运行速度会快一些。

  对于EXE文件,每个文件使用的都是单独的虚拟地址孔家。所以,装入的地址平时不会被其余模块占据。EXE文件总能按照这么些地点装入,那就表示装入后的EXE文件不须求

  举行重定位了。

  在链接的时候,可以动用参数“.base”来指定优先装入的地址,即便不指定,链接器默认装入EXE的地点是0X00400000。相对于DLL文件,
默许优先装入的地方是

0X1000000。集成用到多少个DLL文件,装入地址可能会暴发争论,PE加载器会调整之中的值。

  能够协调定义这些值,不过取值无法压倒边界,取得值必须在进度空间中,该值必须是64K的平头倍。

  21.IMAGE_OPTIONAL_HEADER32.SectionAlignment:

  +0038h,双字。内存中节的对齐粒度。该字段指定了节被装入内存后的对齐单位。

  SectionAlignment的值必须超出等于FileAlignment的值。

  22.IMAGE_OPTIONAL_HEADER32.FileAlignment:

  +003ch,双字。文件中节的对齐粒度。文件中节对齐是为了加强公文从磁盘加载的功用。

  Windows
XP用来公司硬盘的有着文件系统都是基于簇(分配单元)的,每个簇包罗多少个大体扇区。扇区是磁盘物理存取的细卡片机位。簇越大,磁盘存储音讯的容量就越大,但

  存取所消费的风浪越长。

  平常情状下,Windows会选用使用152字节的簇大小来格式化分区,最大可直达4KB。

  23.IMAGE_OPTIONAL_HEADER32.MajorOperatingSystemVersion:

  24.IMAGE_OPTIONAL_HEADER32.MinorOperatingSystemVersion:

  +0040h。上述多少个字段都为单字,共计为双字。标识操作系统的版本号,分主版本号和次版本号。

  25.IMAGE_OPTIONAL_HEADER32.MajorImageVersion:

  26.IMAGE_OPTIONAL_HEADER32.MinorImageVersion:

  +0044h,双字。本PE文件映像的版本号。

  27.IMAGE_OPTIONAL_HEADER32.MajorSubsystemVersion  

  28.IMAGE_OPTIONAL_HEADER32.MinorSubsystemVersion

  +0048h,双字。运行所急需的子系统的版本号。

  29.IMAGE_OPTIONAL_HEADER32.Win32VersionValue:

  +004ch,双字。子系统版本的值,暂时保留未用,必须设置为0。

  30.IMAGE_OPTIONAL_HEADER32.SizeOfImage:

  +0050h,双字。内存中整个PE文件的照射尺寸。

  必须有限支撑它的值是SectionAlignment的整数倍。

  31.IMAGE_OPTIONAL_HEADER32.SizeOfHeaders:

  +0054h,双字。所有头+节表根据对齐粒度对齐后的尺寸。

  32.IMAGE_OPTIONAL_HEADER32.Checksum

  +0058h,双字。检验和,一大半PE文件中,那个值为0,然而在局地基石格局的驱动程序和系统DLL中,该值必须是不易的。

  33.IMAGE_OPTIONAL_HEADER32.Subsystem

  +005ch,单字。指定使用界面的子系统。取值如下:

  34.IMAGE_OPTIONAL_HEADER32.DllCharateristics

  +005eh,单字。DLL文件属性。是一个评释,不是针对性DLL文件的,而是针对所有的PE文件。

  35.IMAGE_OPTIONAL_HEADER32.SizeOfStackReserve:

  +0060h,双字。伊始化时保留栈的深浅。该字段表示为早先线程的栈二保留的虚拟内存数量。该字段默许值为0x100000(1MB)。

  36.IMAGE_OPTIONAL_HEADER32.SizeOfStackCommit:

  +0064h,双字。开始化时实际交付的栈的大大小小。

  保障起先线程的栈实际占用的内存空间的深浅,它是被系统提交的。

  37.IMAGE_OPTIONAL_HEADER32.SizeOfHeapReserve:

  +0068h,双字。初步化保留的堆的轻重缓急。用来保存发轫进程堆使用的虚拟内存,堆的句柄可以通过GetProcessHeap函数得到。每一个进度至
少会有一个默许的历程堆,该堆在

  启动进度的时候被成立,在经过的生命周期中永远不会被去除。默认值为1MB。

  38.IMAGE_OPTIONAL_HEADER32.SizeOfHeapCommit:

   +006ch,双字。开端化时还提到提交的堆大小。在过程开端化时设定的堆所占用的内存空间,默认值为1页。

  39.IMAGE_OPTIONAL_HEADER32.LoaderFlags:

  +0070h,双字。加载标志。

    40.IMAGE_OPTIONAL_HEADER32.NumberOfRvaAndSzie:

        +0074h,双字。定义数据目录结构的多寡,一般为00000010h,即16个。

        该字段由SizeOfOptionalHeaders决定,实际利用中可取2~16.

    41.IMAGE_OPTIONAL_HEADER32.DataDirectory:

        +0078h,结构。

      
 由16个IMAGE_DATA_DIRECTORY结构线性排列而成。定义PE文件中16中差异品种的数据所在的职位和分寸。

  7、数据目录项IMAGE_DATA_DIRECTORY的字段

    42.IMAGE_DATA_DIRECTORY.VirtualAddress:

      
 +0000h,双字。该字段记录了特定数据类型的开始RVA。针对分裂的数据结构,该字段包括的数据含义不一样。

    43.IMAGE_DATA_DIRECTORY.isize:

        +0004h,双字。该字段记录了特定类型的数据块的长短。

  8、节表项IMAGE_澳门金沙国际,SECTION_HEADER

    44.IAMGE_SECTION_HEADER.Name1

      
 +0000h,8字节。平常是以“\0“结尾的ASCII码字符串”来标识节的称呼。内容可自动定义。

    45.IMAGE_SECTION_HEADER.Misc:

        +0008h,双字。

    46.IMAGE_SECTION_HEADER.VirtualAddress

        +000ch,双字。节区的RVA地址。

    47.IMAGE_SECTION_HEADER.SizeOfRawData

        +0010h,双字。节在文书对齐后的尺寸。

    48.IMAGE_SECTION_HEADER.PointerToRawData:

        +0014h,双字。节区发轫数据在文件中的偏移。

    49.IMAGE_SECTION_HEADER.PointerToRelocations:

        +0018h,双字。在“obj”文件中应用,指向重定位表的指针。

    50.IMAGE_SECTION_HEADER.PointerToLinenumbers

        +001ch,双字。行号表的职位。

    51.IMAGE_SECTION_HEADER.NumberOfRelocations

        +0020h,单字。重定位表的个数。(在OBJ文件中选用)

    52.IMAGE_SECTION_HEADER.NumberOfLinenumbers

        +0022h,单字。行号表中行号的多少。

    53.IMAGE_SECTION_HEADER.Characteristics:

        +0024h,双字。节的特性。

      
 该字段属于节的性质标志字段,其中分化的数额位表示了差别的习性。具体定义如下:
    
   

1、定位标准PE头 DOS
Stub长度不定点,所以DOS头不是一个固定大小的数据结构。DOS头放在PE的苗头地点,通过DO…

typedef struct _IMAGE_FILE_HEADER {
+04h    WORD          Machine;              // 运行平台
+06h    WORD          NumberOfSections;     // 文件的区块数目
+08h    DWORD         TimeDateStamp;        // 文件创建日期和时间
+0Ch    DWORD         PointerToSymbolTable; // 指向符号表(主要用于调试)
+10h    DWORD         NumberOfSymbols;      // 符号表中符号个数(同上)
+14h    WORD          SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 结构大小
+16h    WORD          Characteristics;      // 文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
typedef struct _IMAGE_FILE_HEADER {
+04h    WORD          Machine;              // 运行平台
+06h    WORD          NumberOfSections;     // 文件的区块数目
+08h    DWORD         TimeDateStamp;        // 文件创建日期和时间
+0Ch    DWORD         PointerToSymbolTable; // 指向符号表(主要用于调试)
+10h    DWORD         NumberOfSymbols;      // 符号表中符号个数(同上)
+14h    WORD          SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 结构大小
+16h    WORD          Characteristics;      // 文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

Machine字段

Machine字段

常用的有:

常用的有:

宏定义 平台及相关意义 数值
IMAGE_FILE_MACHINE_I386 x86、Intel 386 0x014c
IMAGE_FILE_MACHINE_IA64 Intel Itanium、Intel 64 0x0200
IMAGE_FILE_MACHINE_AMD64 x64、AMD64 (K8) 0x8664
宏定义 平台及相关意义 数值
IMAGE_FILE_MACHINE_I386 x86、Intel 386 0x014c
IMAGE_FILE_MACHINE_IA64 Intel Itanium、Intel 64 0x0200
IMAGE_FILE_MACHINE_AMD64 x64、AMD64 (K8) 0x8664

可以取值如下,摘取自源代码:

可以取值如下,摘取自源代码:

#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
#define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2
#define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP
#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
#define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5
#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB             0x01c2  // ARM Thumb/Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_AM33              0x01d3
#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
#define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon
#define IMAGE_FILE_MACHINE_CEF               0x0CEF
#define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE               0xC0EE
#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
#define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2
#define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP
#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
#define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5
#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB             0x01c2  // ARM Thumb/Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_AM33              0x01d3
#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
#define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon
#define IMAGE_FILE_MACHINE_CEF               0x0CEF
#define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE               0xC0EE

实例图片:

实例图片:

澳门金沙国际 1

澳门金沙国际 2

其它一个事例:

除此以外一个例证:

澳门金沙国际 3

澳门金沙国际 4

NumberOfSections
    pe文件中区块的多少。紧跟在本结构的末端的。
TimeDateStamp
   
文件日期时间戳,指那么些pe文件生成的日子,它的值是从1969年1六月31日16:00:00来说的秒数.
PointerToSymbolTable
    Coff调试符号表的晃动地址。
NumberOfSymbols
    Coff符号表中符号的个数. 这么些域和前个域在release版本的次序里是0。
SizeOfOptionalHeader
   
IMAGE_OPTIONAL_HEADER32结构的轻重(即多少字节).大家跟着就要涉及那几个协会了.事实上,pe文件的绝半数以上重中之重的域都在IMAGE_OPTIONAL_HEADER结构里。(对于32位PE文件,那几个值一般是00E0h;对于64位PE32+文件,那么些值一般是00F0h
)。
Characteristics
   
那些域描述pe文件的一对属性信息,比如是或不是可实施,是或不是是一个动态连接库等.具体定义如下:

NumberOfSections
    pe文件中区块的数据。紧跟在本结构的背后的。
TimeDateStamp
   
文件日期时间戳,指那个pe文件生成的时辰,它的值是从1969年1九月31日16:00:00的话的秒数.
PointerToSymbolTable
    Coff调试符号表的偏移地址。
NumberOfSymbols
    Coff符号表中符号的个数. 这些域和前个域在release版本的次序里是0。
SizeOfOptionalHeader
   
IMAGE_OPTIONAL_HEADER32结构的分寸(即多少字节).大家随后就要涉及那些社团了.事实上,pe文件的绝半数以上首要的域都在IMAGE_OPTIONAL_HEADER结构里。(对于32位PE文件,这一个值一般是00E0h;对于64位PE32+文件,这几个值一般是00F0h
)。
Characteristics
   
这些域描述pe文件的片段性质新闻,比如是或不是可实施,是或不是是一个动态连接库等.具体定义如下:

#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // 重定位信息被移除,文件必须加载先前的基地址
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // 文件可执行
#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // 行号被移除
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // 符号被移除
#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // 程序能处理大于2G的地址
#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32位机器
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // .dbg文件的调试信息被移除
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // 如果在移动介质中,拷到交换文件中运行
#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // 如果在网络中,拷到交换文件中运行
#define IMAGE_FILE_SYSTEM                    0x1000  // 系统文件
#define IMAGE_FILE_DLL                       0x2000  // 文件是一个dll
#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // 文件只能运行在单处理器上
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // 重定位信息被移除,文件必须加载先前的基地址
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // 文件可执行
#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // 行号被移除
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // 符号被移除
#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // 程序能处理大于2G的地址
#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32位机器
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // .dbg文件的调试信息被移除
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // 如果在移动介质中,拷到交换文件中运行
#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // 如果在网络中,拷到交换文件中运行
#define IMAGE_FILE_SYSTEM                    0x1000  // 系统文件
#define IMAGE_FILE_DLL                       0x2000  // 文件是一个dll
#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // 文件只能运行在单处理器上
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.

相关文章