>

那么只需要将这个入口地址指向附加的代码就可

- 编辑:澳门博发娱乐官网 -

那么只需要将这个入口地址指向附加的代码就可

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;

[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文件生成的时辰,它的值是从1968年3月二八日16:00:00来讲的秒数.
PointerToSymbolTable
    Coff调节和测验符号表的摇荡地址。
NumberOfSymbols
    Coff符号表中符号的个数. 那几个域和前个域在release版本的次第里是0。
SizeOfOptionalHeader
    IMAGE_OPTIONAL_HEADEHaval32结构的高低(即多少字节).大家跟着将在提到那一个布局了.事实上,pe文件的大部分关键的域都在IMAGE_OPTIONAL_HEADE帕杰罗结构里。(对于31人PE文件,这一个值一般是00E0h;对于陆十三人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_HEADE悍马H2,imagefileheader 源代码如下: typedef struct _IMAGE_FILE_HEADELacrosse { +04h WO普拉多D Machine; // 运转平台 +06h WO奔驰G级D NumberOfSections; // 文件...

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

  1、定位标准PE头

  DOS Stub长度不固定,所以DOS头不是八个稳固大小的数据结构。DOS头放在PE的初叶地点,通过DOS头去稳定前边标准PE头的位置就是经过字段e_lfanew。

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

  也便是PE头的绝对地点是:

  PE_start = DOS MZ 基地址+IMAGE_DOS_HEADER.e_lfanew

  2、PE文件结构

  在30个人系统下,最根本的一部分是PE头和PE数据区。

  叁16位系统下的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_HEADEPAJERO.elfanew指向的职位。其内容定位,对应于ASCII码

  的字符串“PE”。

  标准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

 存款和储蓄文件实践时的入口地址、文件被操作系统装入内部存款和储蓄器之后的私下认可集散地址,节在磁盘和内部存储器中的对其单位等消息。   

  PE头IAMGE_NT_HEADER:

  该有的是广义上的PE头,在规范PE文件中其大小为456字节

  IMAGE_NT_HEADE奥德赛是上述三部分的总和,及Signature、IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER。

  该协会的详尽定义如下:

  数据目录项IMAGE_DATA_DIRECTORY

  IMAGE_OPTIONAL_HEADEHighlander结构的最后贰个字段DataDirectory字段定义了PE文件中出现全体差异类其余数码的目录音信。

  如导入表、导出表、能源和重定位表等。在内存中,那几个多少被操作系统以页为单位集体起来,并赋以不一样的访谈属性。在文件中,这几个数量也一律被集体起来,根据差别类型

分别贮存在文件的钦赐地方。

  该组织正是用来说述区别类型的数额在文件(和内部存款和储蓄器)中的地方及大小。

  该数额目录中定义的数据类型向来是种,PE中用数码目录项IMAGE_DATA_DIRECTO奥迪Q5Y的数据结构定义每个数据结构。

  结构定义如下:

  总得数据目录总共由14个一律的IMAGE_DATA_DIRECTO宝马7系Y结构接二连三排列在一块构成。

  节表项IMAGE_SECTION_HEADER:

  节表位于IMAGE_NT_HEADEEnclave之后,由多少个节表项(IMAGE_SECTION_HEADE奥迪Q3)组成,每一个节表项记录了PE中与有个别特定的节关于的音讯,如节的特性,节的轻重缓急,在

文件和内部存款和储蓄器中开场地点等。

  节表中的节的多少由字段IMAGE_FILE_HEADELacrosse中的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_HEADE福特Explorer32。它是操作系统印象文件全体独有的尾部消息。

  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个人存款和储蓄的值是自一九六五年3月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,倘若是六11个人的PE文件,该协会私下认可大小为00F0h。

  10.IMAGE_FILE_HEADER.Characteristics:

  +0016h,单字。文件属性标识字段,它的比不上数量位定义了不一致的文件属性。那是三个很珍视的字段,不相同的概念将影响系统对文件的载入格局。

  对于一般的可进行PE文件来讲,那个字段的值一般是010fh,对于DLL文件来讲,这些字段的值是210ch。

  第一位为1时,表明此印象文件是法定的,能够运转。若是未安装此标识,注脚现身链接器错误。

  第十一个人为1时,假如此影像文件在可活动存款和储蓄介质上,加载器将完全加载它并把它复制到内部存款和储蓄器调换文件中。

  第十一个人为1时,假诺此影像文件在网络上,那么加载器也将完全加载它并把它复制到内部存款和储蓄器交流文件中。

  当第18位为1时,评释此印象文件为动态链接库。那样的文书总被以为是可推行文件。

  可试行文件的注脚位棉被服装置为010fh,即第0、1、2、3、8位分别被设置为1,标志该公文为可实践文件,不含重一直新闻,不含符号音信和作为消息,文件只在38个人平台运

  行。

  6、扩展PE头IAMGE_OPTIONAL_HEADER32的字段

  11.IMAGE_OPTIONAL_HEADER32.Magic:

  +0018h,单字。魔术字,表明文件的品类,假诺为010BH,则象征该文件为PE32;

  假如为0107h,则意味为ROM影像;就算为020BH,则表示文件为PE32+,即六12位下的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,双字。该字段值是贰个KoleosVA,记录了运转代码距离该PE加载后的最初地点有稍许个字节。

  若是四个可施行文件中附加了一段本人的代码,并想让这段代码首先被推行,一般要修改这里的值,使其针对性本身代码的岗位。

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

  对于设备驱动文件来讲,它是开始化函数的地方。入口点对于DLL是可选的,要是不设有入口点,这么些字段值必得设置为0。

  18.IMAGE_OPTIONAL_HEADER32.BaseOfCode:

  +002Ch,双字。代码节的初步奥德赛VA,表示印象被加载进内部存储器时期码节的上马相对于影象集散地址的摇拽地址。一般意况下,代码节紧跟在PE底部前边,节的名号日常为

  “.text”。

  19.IMAGE_OPTIONAL_HEADER32.BaseOfData:

  +0030h,双字。数据节的起先PRADOVA,表示影象被加载进内部存款和储蓄器时数据节的起来相对于影像的营地址的撼动地址。一般景色下,数据节位于文件末尾,节的称号日常为“.data”。

  20.IMAGE_OPTIONAL_HEADER32.ImageBase:

  +0034h,双字。该字段建议了PE影象的预先装入地址。正是在AddressOfEntryPoint中的程序被加载到内部存款和储蓄器之后的奥迪Q5VA。

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

  假如操作系统也是遵守这几个地点加运载飞机器码到内部存储器中,那么指令中比非常多稳住消息就不供给修改了,那样运营速度会快一些。

  对于EXE文件,每一个文件使用的都以独立的虚拟地址孔家。所以,装入的地点平时不会被别的模块攻克。EXE文件总能根据这一个地点装入,那就表示装入后的EXE文件无需

  实行重定位了。

  在链接的时候,能够接纳参数“.base”来钦点优先装入的地址,假使不点名,链接器暗中认可装入EXE的地方是0X00500000。相对于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,即15个。

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

    41.IMAGE_OPTIONAL_HEADER32.DataDirectory:

        +0078h,结构。

        由16个IMAGE_DATA_DIRECTOOdysseyY结构线性排列而成。定义PE文件中16中分裂类其他数目所在的职位和尺寸。

  7、数据目录项IMAGE_DATA_DIRECTORY的字段

    42.IMAGE_DATA_DIRECTORY.VirtualAddress:

        +0000h,双字。该字段记录了特定数据类型的开首SportageVA。针对不一致的数据结构,该字段包括的数目含义不一样。

    43.IMAGE_DATA_DIRECTORY.isize:

        +0004h,双字。该字段记录了一定项指标数据块的尺寸。

  8、节表项IMAGE_SECTION_HEADER

    44.IAMGE_SECTION_HEADER.Name1

        +0000h,8字节。平常是以““结尾的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...

[PE结构分析] 5.IMAGE_OPTIONAL_HEADER,imageoptionalheader

协会体源代码如下:

typedef struct _IMAGE_OPTIONAL_HEADER 
{
    //
    // Standard fields.  
    //
+18h    WORD    Magic;                   // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
+1Ah    BYTE    MajorLinkerVersion;      // 链接程序的主版本号
+1Bh    BYTE    MinorLinkerVersion;      // 链接程序的次版本号
+1Ch    DWORD   SizeOfCode;              // 所有含代码的节的总大小
+20h    DWORD   SizeOfInitializedData;   // 所有含已初始化数据的节的总大小
+24h    DWORD   SizeOfUninitializedData; // 所有含未初始化数据的节的大小
+28h    DWORD   AddressOfEntryPoint;     // 程序执行入口RVA ***(必须了解)***
+2Ch    DWORD   BaseOfCode;              // 代码的区块的起始RVA
+30h    DWORD   BaseOfData;              // 数据的区块的起始RVA
    //
    // NT additional fields.    以下是属于NT结构增加的领域。
    //
+34h    DWORD   ImageBase;               // 程序的首选装载地址 ***(必须了解)***
+38h    DWORD   SectionAlignment;        // 内存中的区块的对齐大小 ***(必须了解)***
+3Ch    DWORD   FileAlignment;           // 文件中的区块的对齐大小 ***(必须了解)***
+40h    WORD    MajorOperatingSystemVersion;  // 要求操作系统最低版本号的主版本号
+42h    WORD    MinorOperatingSystemVersion;  // 要求操作系统最低版本号的副版本号
+44h    WORD    MajorImageVersion;       // 可运行于操作系统的主版本号
+46h    WORD    MinorImageVersion;       // 可运行于操作系统的次版本号
+48h    WORD    MajorSubsystemVersion;   // 要求最低子系统版本的主版本号
+4Ah    WORD    MinorSubsystemVersion;   // 要求最低子系统版本的次版本号
+4Ch    DWORD   Win32VersionValue;       // 莫须有字段,不被病毒利用的话一般为0
+50h    DWORD   SizeOfImage;             // 映像装入内存后的总尺寸
+54h    DWORD   SizeOfHeaders;           // 所有头 + 区块表的尺寸大小
+58h    DWORD   CheckSum;                // 映像的校检和
+5Ch    WORD    Subsystem;               // 可执行文件期望的子系统 ***(必须了解)***
+5Eh    WORD    DllCharacteristics;      // DllMain()函数何时被调用,默认为 0
+60h    DWORD   SizeOfStackReserve;      // 初始化时的栈大小
+64h    DWORD   SizeOfStackCommit;       // 初始化时实际提交的栈大小
+68h    DWORD   SizeOfHeapReserve;       // 初始化时保留的堆大小
+6Ch    DWORD   SizeOfHeapCommit;        // 初始化时实际提交的堆大小
+70h    DWORD   LoaderFlags;             // 与调试有关,默认为 0 
+74h    DWORD   NumberOfRvaAndSizes;     // 下边数据目录的项数,这个字段自Windows NT 发布以来一直是16
+78h    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];   
// 数据目录表 ***(必须了解,重点)*** winNT发布到win10,IMAGE_NUMBEROF_DIRECTORY_ENTRIES一直都是16
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

AddressOfEntryPoint  ***(必需精晓)***

次第最早举行的地方,那是二个大切诺基VA(相对虚构地址)。对于exe文件,这里是开发银行代码;对于dll文件,这里是libMain()的地方。借使在四个可施行文件上附加了一段代码并想让这段代码首先被执行,那么只必要将以此进口地址指向附加的代码就可以了。在脱壳时首先件事正是找入口点,指的正是其一值。

ImageBase  ***(必得掌握)***

PE文件的先行装入地址。也便是说,当文件被推行时,如若恐怕的话(当前地方未有被运用),Windows优先将文件装入到由ImageBase字段钦点的地点中。

对于EXE文件来讲,由于每种文件一连利用独立的虚构地址空间,优先装入地址不只怕被**模块攻陷,所以EXE总是能够依据这几个地址装入

那也意味着EXE文件不再要求重定位新闻。

对此DLL文件来说,由于七个DLL文件全体选取宿主EXE文件的地点空间,不可能担保优先装入地址未有被**的DLL使用,所以DLL文件中必得包蕴重平素音信以免万一。

所以,在后面介绍的 IMAGE_FILE_HEADE君越 结构的 Characteristics 字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_ST奥迪Q5IPPED 位总是为0,而EXE文件的那一个标识位三番两次为1。

若无一些名的话,dll文件默以为0x10000000;exe文件默以为0x00陆仟00,可是在Windows CE平台上是0x000壹仟0。此值必需是64K bytes的翻番!

SectionAlignment ***(必须询问)***

内部存储器中区块的对齐单位。区块总是对齐到这几个值的整几倍。此字段必需大于或等于 FileAlignment ,暗中认可值是系统页面包车型地铁大大小小。三二十人cpu平常值为 0x一千(十六进制),即4096,即4KB。六十人cpu日常为 8kB
FileAlignment ***(必得询问)*****

pe文件中区块的对齐单位,以bytes(字节)为单位。此值必须是2的次方倍,然而必须在512和64K间隔之间(闭区间[521, 64*1024=65536]),假使SectionAlignment小于系统页面包车型大巴轻重缓急,那么SectionAlignment的轻重缓急就和FileAlignment一样。pe文件中默许值为 521 字节(0.5KB) 即 0x200(十六进制)。

Subsystem ***(必得理解)***

pe文件的顾客分界面使用的子系统类型。定义如下:

#define IMAGE_SUBSYSTEM_UNKNOWN              0   // 未知子系统
#define IMAGE_SUBSYSTEM_NATIVE               1   // 不需要子系统(如驱动程序)
#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Windows GUI 子系统
#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Windows 控制台子系统
#define IMAGE_SUBSYSTEM_OS2_CUI              5   // OS/2 控制台子系统
#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // Posix 控制台子系统
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // 镜像是原生 Win9x 驱动程序
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Windows CE 图形界面

譬喻,Visual Studio 二〇一四中编写翻译程序时得以在图形分界面设置链接选项:

更加的多请查看:

微软官方文书档案:

DataDirectory ***(必得通晓,主要)***

以此字段可以说是最要害的字段之一,它由十六个一律的IMAGE_DATA_DIRECTO纳瓦拉Y结构重组。其布局如下:

typedef struct _IMAGE_DATA_DIRECTORY {

   DWORD   VirtualAddress; // 相对虚拟地址 

   DWORD   Size;           // 数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

也正是概念了某块的职位和大小。

虽说PE文件中的数据是依照装入内部存款和储蓄器后的页属性归类而被放在差异的节中的,可是这一个地处各种节中的数据依照用途能够被分成导出表、导入表、财富、重定位表等数据块,那十六个IMAGE_DATA_DIRECTOOdysseyY结构正是用来定义多样不一样用途的数据块的(如下表所示)。IMAGE_DATA_DIRECTOQX56Y结构的定义相当粗略,它仅仅提议了某种数据块的地方和长度。

#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // 导出表
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // 导入表
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // 资源表
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // 异常表(具体资料不详)
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // 安全表(具体资料不详)
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // 重定位表
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // 调试表
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage) 版权信息
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // 版权信息
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP (具体资料不详)
#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory (线程位置存储,具体资料不详)
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory (不详)
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers(不详)
#define IMAGE_DIRECTORY_ENTRY_IAT            12   // 导入函数地址表
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors(不详)
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor(不详)

] 5.IMAGE_OPTIONAL_HEADEMurano,imageoptionalheader 结构体源代码如下: typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // +18h WORD Magic; // 标志...

Machine字段

实例图片:

NumberOfSections
    pe文件中区块的多少。紧跟在本结构的末尾的。
TimeDateStamp
    文件日期时间戳,指那么些pe文件生成的时光,它的值是从一九六九年1月二十八日16:00:00来讲的秒数.
PointerToSymbolTable
    Coff调节和测量检验符号表的摆荡地址。
NumberOfSymbols
    Coff符号表中符号的个数. 那么些域和前个域在release版本的前后相继里是0。
SizeOfOptionalHeader
    IMAGE_OPTIONAL_HEADE福特Explorer32结构的大大小小(即多少字节).大家随后就要涉及那几个布局了.事实上,pe文件的好些个根本的域都在IMAGE_OPTIONAL_HEADEENCORE结构里。(对于三十三人PE文件,那个值一般是00E0h;对于陆12个人PE32+文件,那么些值一般是00F0h )。
Characteristics
    那些域描述pe文件的局地质量音讯,举个例子是不是可实行,是还是不是是一个动态连接库等.具体定义如下:

本文由胜博发-操作发布,转载请注明来源:那么只需要将这个入口地址指向附加的代码就可