【home88一必发】PE格式分析,pe结构详解

by admin on 2019年2月28日

源代码如下:

[【home88一必发】PE格式分析,pe结构详解。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文件生成的小运,它的值是从一九六六年5月二二十八日16:00:00来说的秒数.
PointerToSymbolTable
    Coff调节和测试符号表的舞狮地址。
NumberOfSymbols
    Coff符号表中符号的个数. 那一个域和前个域在release版本的次序里是0。
SizeOfOptionalHeader
   
IMAGE_OPTIONAL_HEADELAND32结构的尺寸(即多少字节).我们随后就要涉及这么些布局了.事实上,pe文件的超过5/10最首要的域都在IMAGE_OPTIONAL_HEADELacrosse结构里。(对于三十人PE文件,那么些值一般是00E0h;对于陆九个人PE32+文件,这一个值一般是00F0h
)。
Characteristics
   
那些域描述pe文件的一对属性新闻,比如是还是不是可实施,是或不是是1个动态连接库等.具体定义如下:

#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_HEADEEnclave,imagefileheader 源代码如下: typedef struct
_IMAGE_FILE_HEADE帕杰罗 { +04h WO中华VD Machine; // 运营平台 +06h WOENCORED
NumberOfSections; // 文件…

源代码如下:

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

  一 、定位标准PE头

  DOS
Stub长度不固定,所以DOS头不是一个恒定大小的数据结构。DOS头放在PE的发轫地点,通过DOS头去稳定前边标准PE头的岗位便是通过字段e_lfanew。

  e_lfanew字段的值是二个对峙偏移量,相对定位时索要添加DOS
MZ头的集散地址。

  也正是PE头的绝对化地方是:

  PE_start = DOS MZ 基地址+IMAGE_DOS_HEADER.e_lfanew

  二 、PE文件结构

  在叁9位系统下,最着重的一些是PE头和PE数据区。

  叁10位系统下的PE文件被剪切为:DOS MZ头、DOS Stub、PE头、节表和节内容。

  节表是PE中全数节的目录,各类目录的字节码正是节内容,节内容依照目录里的指针指向的地点,分别将节的字节码在文书空间中排列起来,组成三个整机的PE文件,PE文件

头等于DOS头加PE头。

  ③ 、PE文件尾部解析 

  DOS MZ头IMAGE_DOS_HEADER:

  个中最重庆大学的积极分子是e_magic成员和e_lfanew成员。

  DOS MZ头上边包车型客车是DOS Stub。整个DOS
Stub是贰个字节块,其内容随着链接时采取的链接器不一样而各异,PE中并不曾与之对应的连锁协会。

  PE头标识Signature:

  在DOS Stub后的是PE
头标识Signature,PE底部音信中有3个四字节的标识,该标识放在指针IMAGE_DOS_HEADE昂Cora.elfanew指向的职位。其内容稳定,对应于ASCII码

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

  标准PE头IMAGE_FILE_HEADER:

  标准的PE头IMAGE_FILE_HEADEPRADO在PE尾部标识前边,即位于elfanew值+4的岗位。从此地点上马的贰十一个字节为数据结构标准PE头IMAGE_FILE_HEADER的内容。(该结

构在微软官方文书档案中被称为标准通用对象文件格式)

  该部分记录了PE文件的全局属性,包罗PE文件运行的平台,PE文件类型(EXE
Or DLL?),文件中存在的节的总数等消息。

  该有的用途:判断文件类型,获得PE文件中节的总量,当成节区消息举办遍历操作时的循环次数。

    扩展PE头IMAGE_OPTIONAL_HEADER32

【home88一必发】PE格式分析,pe结构详解。 存款和储蓄文件实施时的输入地址、文件被操作系统装入内部存款和储蓄器之后的默许集散地址,节在磁盘和内部存款和储蓄器中的对其单位等消息。   

  PE头IAMGE_NT_HEADER:

  该部分是广义上的PE头,在行业内部PE文件中其尺寸为456字节

  IMAGE_NT_HEADE宝马7系是上述三部分的总和,及Signature、IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER。

  该协会的详实定义如下:

  数据目录项IMAGE_DATA_DIRECTORY

  IMAGE_OPTIONAL_HEADEMurano结构的末段二个字段DataDirectory字段定义了PE文件中出现全部区别门类的多少的目录信息。

  如导入表、导出表、财富和重定位表等。在内存中,那几个多少被操作系统以页为单位社团起来,并赋以不一致的拜访属性。在文件中,那些数量也一如既往被协会起来,根据分化档次

个别存放在文件的钦定地方。

  该组织正是用来讲述不一样档次的数据在文件(和内部存款和储蓄器)中的地方及大小。

  该数量目录中定义的数据类型平素是种,PE中用多少目录项IMAGE_DATA_DIRECTOCR-VY的数据结构定义每一个数据结构。

  结构定义如下:

  总得数据目录总共由20个一样的IMAGE_DATA_DIRECTO奥迪Q5Y结构三番五次排列在一齐构成。

  节表项IMAGE_SECTION_HEADER:

  节表位于IMAGE_NT_HEADE奥迪Q3之后,由几个节表项(IMAGE_SECTION_HEADE福特Explorer)组成,每一个节表项记录了PE中与有个别特定的节关于的新闻,如节的性格,节的大大小小,在

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

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

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

home88一必发,  4、PE头IMAGE_NT_HEADER的字段

  1.IMAGE_NT_HEADER.Signature

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

  假设改动内部任何1个字节,操作系统就会不可能把该公文识别为正确的PE文件。由于文件的DOS底部分从没被磨损,程序还能够在DOS环境下运维。

  2.IMAGE_NT_HEADER.FileHeader:

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

  3.IMAGE_NT_HEADER.OptionalHeader:

  +0018h,结构。这么些指向IMAGE_OPTIONAL_HEADERubicon32。它是操作系统印象文件全部独有的头顶新闻。

  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,双字。编译器创立此文件的年月戳。低三十八位存款和储蓄的值是自1967年七月11日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,如若是六拾1位的PE文件,该组织私下认可大小为00F0h。

  10.IMAGE_FILE_HEADER.Characteristics:

  +0016h,单字。文件属性标志字段,它的两样数量位定义了差异的文件属性。这是四个很重庆大学的字段,差其他定义将影响系统对文件的载入方式。

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

  第③位为1时,注脚此影像文件是法定的,能够运营。假如未安装此标志,注脚现身链接器错误。

  第七人为1时,就算此印象文件在可活动存款和储蓄介质上,加载器将完全加载它并把它复制到内存沟通文件中。

  第壹一人为1时,若是此影象文件在互连网上,那么加载器也将完全加载它并把它复制到内部存款和储蓄器交流文件中。

  当第壹几个人为1时,注解此影像文件为动态链接库。那样的公文化总同盟被认为是可执行文件。

  可执行文件的注解位被安装为010fh,即第0、① 、② 、叁 、7个人分别棉被服装置为1,标识该文件为可执行文件,不含重一向音讯,不含符号消息和表现消息,文件只在三十三个人平台运

  行。

  6、扩展PE头IAMGE_OPTIONAL_HEADER32的字段

  11.IMAGE_OPTIONAL_HEADER32.Magic:

  +0018h,单字。魔术字,表达文件的类型,假设为010BH,则表示该文件为PE32;

  假诺为0107h,则意味为ROM印象;假若为020BH,则表示文件为PE32+,即6二个人下的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,双字。该字段值是3个QashqaiVA,记录了开发银行代码距离该PE加载后的胚胎地方有微微个字节。

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

  对于一般程序影象,它正是开发银行地址。

  对于设备驱动文件来说,它是初始化函数的地方。入口点对于DLL是可选的,假设不设有入口点,那个字段值必须安装为0。

  18.IMAGE_OPTIONAL_HEADER32.BaseOfCode:

  +002Ch,双字。代码节的开端中华VVA,表示影像被加载进内部存款和储蓄器时期码节的最先相对于印象基地址的舞狮地址。一般景况下,代码节紧跟在PE尾部前边,节的名目日常为

  “.text”。

  19.IMAGE_OPTIONAL_HEADER32.BaseOfData:

  +0030h,双字。数据节的初阶HighlanderVA,表示影像被加载进内部存款和储蓄器时数据节的开端相对于影象的基地址的晃动地址。一般情状下,数据节位于文件末尾,节的称呼平常为“.data”。

  20.IMAGE_OPTIONAL_HEADER32.ImageBase:

  +0034h,双字。该字段建议了PE影像的先期装入地址。正是在AddressOfEntryPoint中的程序被加载到内存之后的福睿斯VA。

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

  借使操作系统也是依据那些地址加运载飞机器码到内存中,那么指令中许多定点新闻就不要求修改了,那样运营速度会快一些。

  对于EXE文件,每一种文件使用的都以独立的虚拟地址孔家。所以,装入的地址平日不会被其余模块占据。EXE文件总能根据这些地点装入,那就表示装入后的EXE文件不要求

  进行重定位了。

  在链接的时候,能够应用参数“.base”来钦命优先装入的地址,假如不点名,链接器默许装入EXE的地点是0X00五千00。相对于DLL文件,
暗许优先装入的地址是

0X一千000。集成用到三个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,双字。开端化时保留栈的大大小小。该字段表示为开始线程的栈二保留的虚拟内部存款和储蓄器数量。该字段默许值为0x一千00(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,即十五个。

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

    41.IMAGE_OPTIONAL_HEADER32.DataDirectory:

        +0078h,结构。

      
 由16个IMAGE_DATA_DIRECTOTiguanY结构线性排列而成。定义PE文件中16中不相同种类的数量所在的岗位和尺寸。

  柒 、数据目录项IMAGE_DATA_DIRECTORY的字段

    42.IMAGE_DATA_DIRECTORY.VirtualAddress:

      
 +0000h,双字。该字段记录了一定数据类型的初阶中华VVA。针对差其他数据结构,该字段包含的数码含义分歧。

    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,双字。节的性质。

      
 该字段属于节的属性标志字段,在那之中区其余数量位表示了不一致的质量。具体定义如下:
    
   

① 、定位标准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

实例图片:

实例图片:

home88一必发 1

home88一必发 2

除此以外一个例证:

其余三个例子:

home88一必发 3

home88一必发 4

NumberOfSections
    pe文件中区块的数码。紧跟在本结构的末端的。
TimeDateStamp
   
文件日期时间戳,指那些pe文件生成的时刻,它的值是从1968年三月二十三日16:00:00的话的秒数.
PointerToSymbolTable
    Coff调节和测试符号表的舞狮地址。
NumberOfSymbols
    Coff符号表中符号的个数. 这些域和前个域在release版本的顺序里是0。
SizeOfOptionalHeader
   
IMAGE_OPTIONAL_HEADESportage32结构的尺寸(即多少字节).大家跟着就要涉及那几个布局了.事实上,pe文件的大部重中之重的域都在IMAGE_OPTIONAL_HEADEPAJERO结构里。(对于33人PE文件,那个值一般是00E0h;对于六10位PE32+文件,那一个值一般是00F0h
)。
Characteristics
   
这么些域描述pe文件的一部分天性音信,比如是还是不是可实施,是或不是是一个动态连接库等.具体定义如下:

NumberOfSections
    pe文件中区块的数量。紧跟在本结构的前面包车型客车。
TimeDateStamp
   
文件日期时间戳,指这几个pe文件生成的时光,它的值是从一九七〇年11月二十一日16:00:00的话的秒数.
PointerToSymbolTable
    Coff调节和测试符号表的舞狮地址。
NumberOfSymbols
    Coff符号表中符号的个数. 那些域和前个域在release版本的先后里是0。
SizeOfOptionalHeader
   
IMAGE_OPTIONAL_HEADEPRADO32结构的深浅(即多少字节).大家跟着就要涉及这些协会了.事实上,pe文件的绝半数以上最首要的域都在IMAGE_OPTIONAL_HEADE途乐结构里。(对于31个人PE文件,那一个值一般是00E0h;对于六十一位PE32+文件,这些值一般是00F0h
)。
Characteristics
   
这么些域描述pe文件的一对质量消息,比如是或不是可实施,是还是不是是1个动态连接库等.具体定义如下:

#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.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图