北京pk赛车官网下载PE布局深入分析,PE的意气风发部分基本概念总括

源代码如下:

北京pk赛车官网下载 1

typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

image.png

重定位表是贰个数组,这么些数组的高低记载在 _IMAGE_OPTIONAL_HEADER 的

Dos头:
  • Dos头的前四个字节恒为4D5A(只是当作剖断PE文件的率先个标记,并不可能经过它就会判别是还是不是是PE文件卡塔尔(قطر‎

  • Dos头的最后七个字节是指向NT头的偏移量
    唯有前七个字节和前边八个字节关系到PE文件是或不是健康运维

  • NT头:

![](https://upload-images.jianshu.io/upload_images/5676193-1017ee68ff187eb6.png)

image.png
  • 前方三个字节恒为0x4550,用于剖断是还是不是为PE文件的第一个标识

  • Nt头前边正是各样区段音信

.DataDirect‌​ory[IMAGE_DIRECTORY_E‌​NTRY_BASERELOC].Size 成员中

文件头

北京pk赛车官网下载 2

image.png

  • 文件头大小0x十多少个字节(由图可以见到:它是Nt头的第二个因素卡塔尔(قطر‎

  • 扩张头的分寸就在里头

  • 节的多寡也在里面

  • 文件头里面保存了PE文件的风姿罗曼蒂克部分特性(这里只列举了生机勃勃部分卡塔尔(قطر‎:
    1.是否是dll(0x0210),exe(0x010F)
    2.是否可进行

布局图如下,图片中 0 和 000 都意味16进制数,转变来二进制是  0000 和 0000
0000 0000:

扩展头

北京pk赛车官网下载 3

image.png

北京pk赛车官网下载 4

image.png

北京pk赛车官网下载 5

扩展头精解:
typedef struct _IMAGE_OPTIONAL_HEADER {
    //
    // Standard fields.
    //

    WORD    Magic;                          //表示这是一个什么类型的PE文件,32位一般是0x010B,64位的文件一般是0x020B
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;                  //所有代码区段(节)的总大小(基于文件对齐后的大小)
    DWORD   SizeOfInitializedData;            //已经初始化的数据的总大小
    DWORD   SizeOfUninitializedData;        //未初始化的数据的大小
    DWORD   AddressOfEntryPoint;            //程序开始执行的相对虚拟地址,即OEP,这是一个RVA,要想得到VA,则必须要加上ImageBase(下面有介绍!!!!!)
    DWORD   BaseOfCode;              //起始代码的相对虚拟地址(RVA),就是.text段的RVA
    DWORD   BaseOfData;              //  其实数据的相对虚拟地址(RVA),就是.data段的RVA

    //
    // NT additional fields.
    //

    DWORD   ImageBase;                //默认加载地址(如果没有这个基址会发生重定位)
    DWORD   SectionAlignment;          //块对齐数,一般是0x1000
    DWORD   FileAlignment;                    //文件对齐数,一般是0x200
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;                      //把文件加载进内存,所需要的内存大小,是进行了内存对齐之后的大小
    DWORD   SizeOfHeaders;                //所有头部大小(这是按照文件对齐后的大小),也是文件主体相对文件起始的偏移,是所有头+节表的大小
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;                    //文件(包括exe和dll文件)特征标志(见下面一张图)
    DWORD   SizeOfStackReserve;                   //表示进程中栈可以增长到的最大值,一般1M
    DWORD   SizeOfStackCommit;                    //进程中栈的初始值,据说也是栈每次分配增长的值,一般4KB
    DWORD   SizeOfHeapReserve;                      //表示进程中堆可以增长到的最大值,一般1M
    DWORD   SizeOfHeapCommit;                        //进程堆的初始值
    DWORD   LoaderFlags;
    DWORD   NumberOfRvaAndSizes;      //数据目录的个数,也就是下面那个数组中元素的个数
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表,比较重要!
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

北京pk赛车官网下载 6

image.png

举一反三头里面比较关键的在上边已经做出注释

种种成分的大小都记载在 SizeOfBlock 中,那些因素是由 二个
_IMAGE_BASE_RELOCATION 布局体和三个TypeOffset 数组组成的。TypeOffset
数组的各样成分占2个字节,此中,高4位是偏移类型(type),低拾贰个人代表供给重一直之处(Offset),即,它与
VirtualAddress 相加正是指向 PE 印象中要求修正的特别代码的奥迪RSQ e-tronVA。

再小结一波:

ImageBase(影像基址,装载基址,它是二个VA值State of Qatar:若无加载到这些地方则会重从来(就是PE文件加载进内部存款和储蓄器之后,就一定于精晓了Dos头的职位,然后就能够精通别的之处了State of Qatar,正是PE装入内部存款和储蓄器的集散地址,默许情形下,EXE文件在内部存储器中的集散地址是0X0040
0000,DLL文件为0x0100 0000,由编译器决定!
次第入口点(OEP卡塔尔
影象大小(SizeOfImage卡塔尔(قطر‎————>把文件加载进内部存款和储蓄器,所急需的内部存款和储蓄器大小(注意是开展了块对齐之后卡塔尔(قطر‎
代码大小(SizeOfCode卡塔尔——>全部区段的总大小
代码基址(BaseOfCode卡塔尔国早先代码的 RAV4VA—->.text的福特ExplorerVA
数码基址(BaseOfData卡塔尔发轫数据的奥迪Q3VA—–>.data的Disco VolanteVA
头大小(SizeOfHeaders卡塔尔国————>全数底部大小,就是文件宗旨相对文件早先的偏移
内部存款和储蓄器对齐(SectionAlignment卡塔尔———–>为0x1000(4KB卡塔尔国
文本对齐(FileAlignment卡塔尔国—————->200h(0x200卡塔尔(قطر‎
DLL标识(DllCharacteristics卡塔尔(قطر‎——–>提示Dll特征的申明

偏移类型的含义如下:

PE尾部包罗了Dos头,平素到节表的停止地方,.text区段初阶从前
  • 数码目录表
![](https://upload-images.jianshu.io/upload_images/5676193-cfbc56c21cd7568f.png)

image.png

Constant

Value

Description

IMAGE_REL_BASED_ABSOLUTE

  0

The base relocation is skipped. This type can be used to pad a block.

IMAGE_REL_BASED_HIGH

  1

The base relocation adds the high 16 bits of the difference to the 16bit field at offset. The 16-bit field represents the high value of a 32-bit word.

IMAGE_REL_BASED_LOW

  2

The base relocation adds the low 16 bits of the difference to the 16-bit field at offset. The 16-bit field represents the low half of a 32-bit word.

IMAGE_REL_BASED_HIGHLOW

  3

The base relocation applies all 32 bits of the difference to the 32-bit field at offset.

IMAGE_REL_BASED_HIGHADJ

  4

The base relocation adds the high 16 bits of the difference to the 16-bit field at offset. The 16-bit field represents the high value of a 32-bit word. The low 16 bits of the 32-bit value are stored in the 16-bit word that follows this base relocation. This means that this base relocation occupies two slots.

IMAGE_REL_BASED_MIPS_JMPADDR

  5

The relocation interpretation is dependent on the machine type.

When the machine type is MIPS, the base relocation applies to a MIPS jump instruction.

IMAGE_REL_BASED_ARM_MOV32

  5

This relocation is meaningfull only when the machine type is ARM or Thumb. The base relocation applies the 32-bit address of a symbol across a consecutive MOVW/MOVT instruction pair.

IMAGE_REL_BASED_RISCV_HIGH20

  5

This relocation is only meaningful when the machine type is RISC-V. The base relocation applies to the high 20 bits of a 32-bit absolute address.

 

  6

Reserved, must be zero.

IMAGE_REL_BASED_THUMB_MOV32

  7

This relocation is meaningful only when the machine type is Thumb. The base relocation applies the 32-bit address of a symbol to a consecutive MOVW/MOVT instruction pair.

IMAGE_REL_BASED_RISCV_LOW12I

  7

This relocation is only meaningful when the machine type is RISC-V. The base relocation applies to the low 12 bits of a 32-bit absolute address formed in RISC-V I-type instruction format.

IMAGE_REL_BASED_RISCV_LOW12S

  8

This relocation is only meaningful when the machine type is RISC-V. The base relocation applies to the low 12 bits of a 32-bit absolute address formed in RISC-V S-type instruction format.

IMAGE_REL_BASED_MIPS_JMPADDR16

  9

The relocation is only meaningful when the machine type is MIPS. The base relocation applies to a MIPS16 jump instruction.

IMAGE_REL_BASED_DIR64

10

The base relocation applies the difference to the 64-bit field at offset.

数据目录表也是贰个结构体数组——>每一个布局体里面著录的是每种表所对应的KoleosVA以致大小

(扩展:

  • 区段头表(它是四个构造体数组卡塔尔国是由多少个IMAGE_SECTION_HEADE冠道那样的构造体组成,以一个全部都以0的构造体结尾;
  • 导入表也是二个构造体数组(前面会首要讲State of Qatar,以三个全0成分结尾,导入表中的IMAGE_THUNK_DATA(文件未有加载的时候,OrignalFirstThunk与FirstThunk指向IMAGE_THUNK_DATAState of Qatar也是一个布局体数组;
  • 重定位表:它也是多少个协会体数组,以全0成分结尾
  • 能源表:它里面也包括结构体数组(更为详细的能够查阅有关文献卡塔尔国
    )

此外汉语翻译:

PE中有协会体数组的构造的下结论:

数录节入重!

  • 节表(区段头表卡塔尔国

北京pk赛车官网下载 7

image.png

.text 段:代码段
.data段:数据段
.bss段:表示未伊始化的数据,比方Static变量
.rdata 段:表示只读的数码,比方字符串
……
.relcoc段:存储重一直音讯的区段
各变量存放于哪个区:
常量 ——————>.rdata区
静态变量————->.bss区
全局变量————–>.data 区
节表里面包车型地铁几个关键数据:
VirtualAddress:这么些区段的相对设想地址
SizeofRawData:那么些区段在磁盘中的大小,进行了文本对齐
PointerToRawData:区段的文书偏移,便是那几个区段在磁盘文件中的起头地方
三个至关心器重要的公式:
offset(转卡塔尔(قطر‎=福特ExplorerVA(必要转移的奥迪Q3VAState of Qatar-EvoqueVA(所在区段的奇骏VA卡塔尔国+offset(就是PointerToRawDataState of Qatar

常量 描述
IMAGE_REL_BASED_ABSOLUTE       0x0 使块按照32位对齐,位置为0。
IMAGE_REL_BASED_HIGH 0x1 高16位必须应用于偏移量所指高字16位。
IMAGE_REL_BASED_LOW 0x2 低16位必须应用于偏移量所指低字16位。
IMAGE_REL_BASED_HIGHLOW 0x3 全部32位应用于所有32位。
IMAGE_REL_BASED_HIGHADJ 0x4 需要32位,高16位位于偏移量,低16位位于下一个偏移量数组元素,组合为一个带符号数,加上32位的一个数,然后加上8000然后把高16位保存在偏移量的16位域内。

例子:

解析分布的dll:在QQ中的 zlib.dll 文件 (在QQ安装目录下的bin文件夹中):

先是找到重定位表,这里运用工具:

北京pk赛车官网下载 8

找到数据:

北京pk赛车官网下载 9

VirtualAddress 为 0x1000,SizeOfBlock 为 0x64。第一个条约为
0x338C,高叁位为 0x3,offset为 0x38C,即偏移地址为 0x138C (由 0x1000 +
0x38C得来)应用于此地址上海市总体33个人。展开C32Asm反汇编查看:

北京pk赛车官网下载 10

发表评论

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