PE的一部分基本概念总计

剖析普遍的dll:在QQ中的 zlib.dll 文件 (在QQ安装目录下的bin文件夹中):

365bet体育在线网投 1

数码目录表也是三个组织体数组——>每八个结构体里面著录的是各类表所对应的WranglerVA以及大小

(扩展:

  • 区段头表(它是1个组织体数组)是由两个IMAGE_SECTION_HEADEPAJERO那样的结构体组成,以多个全是0的结构体结尾;
  • 导入表也是多少个构造体数组(前边会重点讲),以多个全0成分结尾,导入表中的IMAGE_THUNK_DATA(文件并未加载的时候,OrignalFirstThunk与FirstThunk指向IMAGE_THUNK_DATA)也是一个结构体数组;
  • 重定位表:它也是2个布局体数组,以全0成分结尾
  • 财富表:它个中也包涵结构体数组(更为详细的能够查看有关文献)
    )

DOS 头

在我们分析PE 的前头,还有此外一个头要理解一下,DOS
头,不得不说,微软事儿照旧挺多的。

微软在成立PE 文件格式时,人们正在普遍接纳DOS
文件,所以微软为了考虑包容性的题材,所以在PE 头的最终面还添加了3个IMAGE_DOS_HEADERubicon 结构体,用来扩张已有个别DOS EXE。在WinNTFS.h
里能够观望他的人影。

365bet体育在线网投 2

DOS
头结构体的深浅是40字节,那里边有八个重大的成员,须求精通,3个是e_magic
又见魔数,三个是e_lfanew,它只是了NT 头的晃动。

对于PE 文件来说,那些e_magic,也正是DOS 签名都以MZ,轶事是二个叫 MarkZbikowski 的开发职员在微软布置了这种ODS 可执行文件,所以…

我们以Windows 下的notepad++
的可执行文件为例,在二进制编辑软件中打开,此类软件比较多,Heditor 打开:

365bet体育在线网投 3

开端的五个字节是4D5A,e_lfanew 为00000108 注意存款和储蓄顺序,小端。

您认为开头加上了DOS 头就形成了么,就足以跟着接PE 头了么。为了合营DOS
当然不是那样不难了,紧接着DOS 头,跟的是DOS 存根,DOS
stub。这一块便是为DOS 而准备的,对于PE 文件,即使没有它也足以健康运作。

365bet体育在线网投 4

旁边的ASCII 是读不懂的,因为他是机器码,是汇编,为了在DOS
下进行,对于notepad++ 来说,那里是进行了一句,this program cannot be run
in DOS mode 然后退出。逗小编= =,有新的人,能够在DOS
中开创贰个程序,做一些小动作。

例子:

365bet体育在线网投 5

扩展头

365bet体育在线网投 6

image.png

365bet体育在线网投 7

image.png

ELF

ELF 文件标准里把系统中使用ELF 格式的文书归类为各种:

  • 可重一向文件,Relocatable File
    ,那类文件包涵代码和多少,可用来连续成可执行文件或共享目的文件,静态链接库归为此类,对应于Linux
    中的.o ,Windows 的 .obj.
  • 可执行文件,Executable File
    ,那类文件包括了足以平素实施的次序,它的意味正是ELF
    可执行文书,他们一般从不扩展名。比如/bin/bash ,Windows 下的 .exe
  • 共享指标文件,Shared Object File
    ,那种文件包涵代码和数码,链接器能够运用那种文件跟此外可重平素文件的共享指标文件链接,发生新的对象文件。此外是动态链接器能够将多少个那种共享目的文件与可执行文件结合,作为进程影象来运维。对应于Linux
    中的 .so,Windows 中的 DLL
  • 主导转储文件,Core Dump
    File,当进度意外终止,系统能够将该进度地址空间的内容及结束时的一些消息转存到基本转储文件。
    对应 Linux 下的core dump。

ELF 文件的完整布局大体上是那般的:

ELF Header
.text
.data
.bss
… other section
Section header table
String Tables, Symbol Tables,..
  • ELF
    文件头放在最前端,它蕴涵了全方位文件的着力属性,如文件版本,目的机器型号,程序入口等等。
  • .text
    为代码段,也是反汇编处理的一部分,他们是以机器码的款式储存,没有反汇编的长河基本不会有人读懂这个二进制代码的。
  • .data
    数据段,保存的这些早已初始化了的全局静态变量一部分静态变量
  • .bss
    段,存放的是未起始化的全局变量有的静态变量,这些很简单精通,因为在未早先化的状态下,我们单独用八个段来保存,能够不在一从头就分配空间,而是在结尾总是成可执行文件的时候,再在.bss
    段分配空间。
  • 其余段,还有一部分可选的段,比如.rodata 表示那里存款和储蓄只读数据, .debug
    表示调节和测试消息等等,具体境遇能够查六柱预测关文书档案。
  • 自定义段,这一块是为了落到实处用户独特效果而留存的段,方便增添,比如大家运用全局变量只怕函数以前增加
    **attribute(section(‘name’))** 就足以吧变量恐怕函数放到以name
    作为段名的段中。
  • 段表,Section Header Table ,是3个首要的片段,它描述了ELF
    文件包涵的保有段的音信,比如各样段的段名,段长度,在文件中的偏移,读写权限和部分段的别样品质。

365bet体育在线网投 8

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

文件头

365bet体育在线网投 9

image.png

  • 文件头大小0x十五个字节(由图可知:它是Nt头的第四个成分)

  • 扩展头的轻重缓急就在里头

  • 节的多寡也在里面

  • 文件头里面保存了PE文件的局地质量(那里只列举了一部分):
    1.是否是dll(0x0210),exe(0x010F)
    2.是还是不是可举行

RVA to RAW

精晓PE
最要紧的1个片段正是明白文件从磁盘到内部存款和储蓄器地址的炫耀进程,做逆向的人口,唯有熟悉地领悟才能跟踪到程序的调用进程和职位,才能分析和摸索漏洞。

对于文本和内部存款和储蓄器的炫耀关系,其实相当粗略,他们经过一个简短的公式总括而来:

365bet体育在线网投 10

换算公式是那样的:

RAW -PointToRawData = RVA – VirtualAddress

探寻进程正是先找到CRUISERVA
所在的段,然后依照公式总计出文件偏移。因为我们因此逆向工具,可以在内存中查找到所在的奥迪Q3VA,进而我们就能够计算出在文书中所在的地点,那样,就足以手动进行修改。

看回我们刚刚载入的nodepad++ ,个中的V Addr, 实际上正是VirtualAddress,R
offset 正是PointerToRawData。

365bet体育在线网投 11

假定大家的CR-VVA 地址是4000,那么合算办法正是,查看区段,发未来.text
中,四千-1000+400 = 4400,那便是RAW
00004400,而其实,因为我们的ImageBase
是00500000,所以,我们在反编译时候内存中的地点是00405000.

接下去,使大家的PE头中的大旨内容,IAT 和 EAT,也便是 Import address
table, export address table.

重定位表是八个数组,那些数组的轻重记载在 _IMAGE_OPTIONAL_HEADER 的

VirtualAddress 为 0x一千,SizeOfBlock 为 0x64。第二个条文为
0x338C,高四人为 0x3,offset为 0x38C,即偏移地址为 0x138C (由 0x一千 +
0x38C得来)应用于此地址上全方位三拾陆人。打开C32Asm反汇编查看:

365bet体育在线网投 12

字符串表

干什么会有字符串表呢?其实那几个也是在频频升高改良中找到的化解办法,在ELF
文件中,会用到很多的字符串,段名,变量名等等,可是字符串其本身又长度不定点,假若采纳一定结构来表示,就会拉动空间上的麻烦。所以,构造贰个字符串表,将应用的字符串统一放在那里,然后通过偏移量来引用字符串,岂不美哉。

急需利用的时候,只需求给1个偏移量,然后就到字符串该职位找字符串,碰着\0
就停止。

字符串在ELF 文件中,也是以段的款式保留的,常见的段名 .strtab, .shstrtab
七个字符串分别为字符串表和段表字符串,前者用来保存普通的字符串,后者保存段名。

在大家利用readelf -h 的时候,大家看到最后叁个分子,section header string
table index ,实际上她指的就是字符串表的下标,bash
对应的字符串表下标为27,在接纳objdump
的时候,实际上忽略了字符串表,大家使用readelf
,就能够看到第②5位即字符串表:

365bet体育在线网投 13


上面大家回想一下,那一个ELF 构造的精巧之处,当三个ELF
文件到来的时候,系统本来的找到他的开首,得到文件头,首先看魔数,识别基本音信,看是还是不是不错的,恐怕是可识其他文件,然后加载他的主干音讯,包蕴CPU
平台,版本号,段表的职务在哪,还是能够获得字符串表在哪,以及一切程序的入口地址。这一层层初步化音信获得后来,程序可以透过字符串表定位,找到段名的字符串,通过段表的始发地方,确认各种段的职位,段名,长度等等新闻,进而到达入口地址,准备举办。

本来,那只是早期始的始末,其后还要考虑链接,Import,Export
等等情节,留待以往完善。

偏移类型的意义如下:

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.

PE中有社团体数组的构造的下结论:

数录节入重!

  • 节表(区段头表)

365bet体育在线网投 14

image.png

.text 段:代码段
.data段:数据段
.bss段:表示未早先化的数量,比如Static变量
.rdata 段:表示只读的数码,比如字符串
……
.relcoc段:存储重一向音讯的区段
各变量存放于哪个区:
365bet体育在线网投,常量 ——————>.rdata区
静态变量————->.bss区
全局变量————–>.data 区
节表里面包车型地铁多少个首要数据:
VirtualAddress:那些区段的相对虚拟地址
SizeofRawData:这么些区段在磁盘中的大小,实行了文本对齐
PointerToRawData:区段的文件偏移,便是那几个区段在磁盘文件中的起先地方
叁个第三的公式:
offset(转)=汉兰达VA(供给更换的瑞鹰VA)-瑞鹰VA(所在区段的奥德赛VA)+offset(正是PointerToRawData)

ELF Header

ELF 文件消息的查看利器在Linux 下是是objdump, readelf,
相关命令较多,可查。上面大家从ELF 文件头说起。

文本头包涵的情节很多,大家在Ubuntu 系统下利用 readelf 命令来查看ELF
文件头:

365bet体育在线网投 15

我们以bash 这几个可执行文件为例,大家可以见到ELF 文件头定义了ELF
魔数,文件机器字节长度,数据存款和储蓄情势,版本,运营平台,ABI版本,ELF
重定位类型,硬件平台,硬件平台版本,入口地址,程序头入口和长短,段表的岗位和长短,段的多寡。

ELF 文件头的组织和连锁常数一般定义在了 /usr/include/elf.h
中,大家得以进来查看一下:

365bet体育在线网投 16

除了第一个,其余都以各类对应的,第四个是三个相应了Magic number, Class,
Data, Version, OS/ABI, ABI version.

并发在最开端的ELF Magic number, 16字节是用来标识ELF
文件的阳台属性,比如字长,字节序,ELF
文件版本。在加载的时候,首先会确认魔数的科学,不科学的话就拒绝加载。

另2个根本的东西是段表(Section Header Table)
,保存了各式种种段的为主质量,比如段名,段长度,文件中的偏移,读写权限,段的其它属性。而段表本人在ELF
文件中的地方是在ELF 头文件 e_shoff 决定的。

大家得以行使 objdump -h 的命令来查看ELF 文件中富含怎么样段,以bash
那个可进行为例,其实不外乎大家后面说的什么样基本结构,他带有众多其余的构造:

365bet体育在线网投 17

一致的,我们运用readelf -S 的命令也得以进行查看。

上边大家来看一下布局,照旧到elf.h 中去查看,他的结构体名字叫
Elf32_Shdr,64位对应Elf64_Shdr,结构如下:

365bet体育在线网投 18

以上结构中,分别对应于:

  • 段名
  • 段类型
  • 段标志位
  • 段虚拟地址
  • 段偏移
  • 段长度
  • 段链接
  • 段对齐
  • 项,一些分寸固定的项,如符号表等。

那几个品种,在运用readelf -S 指令时一一对应。

此外还有3个首要的表,叫重定位表,一般段名叫.rel.text,
在上头没有出现,链接器在处理指标文件时,要求对指标文件中的有个别地方举行重平素,正是代码段和数据段中那个对相对地址引用的岗位,那么些时候就需求利用重定位表了。

发表评论

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