PE文件格式

简介: PE文件基本内容


 可执行文件的格式是操作系统本身执行机制的反映

PE是Portable Executable,意为可移植的可执行的文件

PE文件中的数据结构有32位和64位之分

image.gif 编辑

在黑白里温柔地爱彩色,在彩色里朝圣黑白。

                                                                                               ——汪曾祺

PE各部分数据

Code View调试信息 调试信息
COFF符号表
COFF行号
...... 块(Section)
.reloc
.edata
.data
.text
IMAGE_SECTION_HEADER 块表
IMAGE_SECTION_HEADER
IMAGE_SECTION_HEADER
IMAGE_SECTION_HEADER

数据目录表

PE文件头
IMAGE_OPTIONAL_HEADER32
IMAGE_FILE_HEADER
"PE",0,0
DOS stub DOS部首
DOS 'MS' HEADER

PE简介

image.gif编辑

PE是一个平面地址空间,所有代码和数据都合并在一起,组成一个很大的结构。

文件的内容被分割为不同的区块,又称区段,节

区块中包含代码或数据,这是一个二进制文件,我们可以用十六进制编辑器查看这个二进制文件

image.gif编辑

我们可以从地址,地址偏移量和各部分的作用来了解PE

基地址

PE文件文件载入内存后,内存中的版本称为模块(Module)

映射文件的起始地址称为模块句柄(hModule)

通过模块句柄可以访问内存中的其他数据结构,也称为基地址(ImageBase)

一个模块句柄在Windows CE下并不等于安装的起始地址

虚拟地址

PE文件被系统映射到内存中,每个程序都有自己的虚拟空间,这个虚拟空间的内存地址称为虚拟地址。(Vritual Address VA)

相对虚拟地址

相对虚拟地址(Relative Virtual Address RVA)

应为载入地址可能是进程空间的任意位置,访问PE文件中的全局变量就不能使用绝对地址,需要用与载入地址相关的相对虚拟地址

是相对于PE文件载入地址的偏移位置

目标地址-载入地址=相对虚拟地址

虚拟地址=基地址+相对虚拟地址

image.gif编辑

文件偏移地址

PE存储在磁盘中时

某个数据的位置相对于文件头的偏移量称为文件偏移地址(File Offset)

文件偏移地址是从PE文件的第一个字节开始计数,起始值为0

MS-DOS头部

每个PE文件都是以一个DOS程序开始的

程序在DOS中执行,DOS就能识别出这是一个有效的执行体

然后运行MZ header和DOS stub

DOS stub实际上是一个EXE,通常是汇编器和编译器自动生成的

MZ header和DOS stub合称DOS文件头

马克·茨柏克沃斯基(Mark Zbikowski,1956年3月21日-)出生于美国密西根州底特律,毕业于耶鲁大学与哈佛大学,是微软公司的元老之一。EXE执行档的档头“MZ”两字(16进制码为4D5A),即来自于马克·茨柏克沃斯基的姓名字首。

image.gif编辑

e_magic一个字的大小,16位,被设置为5A4Dh,h是十六进制的意思

这个值有一个#define,名为IMAGE_DOS_SIGNATURE

a=chr(0x5A)+chr(0x4D)
print(a)
#Output:  MZ

image.gif

在ASCLL表示法里是MZ,是MZ-DOS的创建者Mark Zbikowski

位、字节、字是计算机数据存储的单位。位是最小的存储单位,每一个位存储一个1位的二进制码,一个字节由8位组成。而字通常为16、32或64个位组成。

e_lfanew字段是真正的PE文件头的相对偏移RAV,位于文件的3Ch字节处,这个值是真正的PE文件头偏移量

PE文件头

DOS-stub之后是PE文件头,"PE Header"是PE相关结构的NT映像头

执行体在支持PE文件结构的操作系统中执行,PE装载器将从DOS头中的e_lfanew字段中找到PE Header的起始偏移量,再加上基址,得到PE文件头的指针

PNTHeader=ImageBase+dosHeader->e_lfanew

两个版本的IMAGE_DOS_SIGNATURE结构

    • PE32(32位版本)
    • PE32+(64位版本)

    Signature

    一个有效的PE文件里,Signtrue字段被设置为0x00004550,ASCLL码是“PE\0\0”

    “PE\0\0”是PE文件头的开始,MS-DOS头部的e_lfanew指向的就是“PE\0\0”

    IMAGE_FILE_HEADER结构

    包含PE的一些基本信息,有一个域指明了IMAGE_OPTIONAL_HEADER

    这个结构也可以在COFF格式的OBJ文件的开始处找到,称其为“COFF File Header”

    machine字段:PE文件可以在多种机器上使用,不同平台上指令的机器码不同

    机器类型标志

    机器 标志
    MIPS R3000 162h
    MIPS R4000 166h
    Intel i386 14Ch
    Alpha AXP 184h
    Power PC 1F0h

    TimeOfsection字段:区块数目

    TimeDataStamp字段:表示文件的创建时间,自1970年1月1日用格林威治时间GMT计算的秒数

    计算机元年

    1970-01-01对于开发者来说都是不陌生的,有些系统对于时间的处理如果不够好的话,就可能把时间显示成1970-01-01,所以经常有用户看到1970-01-01这个时间。

    1969年8月,贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会,开始着手创造一个全新的革命性的操作系统,他使用B编译语言在老旧的PDP-7机器上开发出了Unix的一个版本。

    随后,汤普逊和同事丹尼斯里奇改进了B语言,开发出了C语言,重写了Unix,新版于1971年发布。

    在Unix被发明出来之后,需要在Unix上表示时间,就需要想办法定义一个能表示一份数据在某个特定时间之前已经存在的、完整的、可验证的数据来表示时间。

    于是,Unix时间戳被定义出来,即通过当前时间和一个"纪元时间"进行对比,其间相差的秒数作为时间戳。

    为了让Unix时间戳表示时间这种方式用的尽可能久,最初就把Unix诞生的时间1971-1-1定义成"纪元时间"。

    后来为了方便记忆和使用,于是就把纪元时间从1971-01-01调整到1970-01-01了。

    image.gif 编辑

    PointerToSymbolTable字段:COFF符号表的文件偏移位置

    NumberOfSymbols字段:如果有COFF表,代表其中符号的数目,可以使用这个字段找到COFF的结束处

    Characteristic字段:文件属性,有选择地通过几个值的运算得到,定义于winnt.h中的IMAGE_FILE_xxx值

    IMAGE_OPTIONAL_HEADER结构

    IMAGE_FILE_HEADER不足以定义PE文件属性,因此可选映像头中定义了更多的数据,完全不必考虑两个结构的区别在哪里

    区块

    在PE文件头于原始数据之间存在一个区块表,区块表中包含每个块在映像中的信息,分别指向不同的区块实体。

    PE.exe中共有3个块的描述,分别是.text,.rdata,.data,每个块对应一个IMAGE_SECTION_HEADER结构

    未完待续

    image.gif编辑

    Seeyounext illusion.

    相关文章
    |
    Linux Windows
    PE格式:实现ELF结构解析工具
    ELF文件格式,是一个开放的可执行文件和链接文件格式,其主要工作在Linux系统上,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件,ELF文件格式类似于PE格式,但比起PE结构来ELF结构显得更加的简单,Linux文件结构相比于Windows结构来说简单一些.
    249 0
    |
    存储 编译器 开发者
    PE格式:分析IatHook并实现
    Ring 3层的 IAT HOOK 和 EAT HOOK 其原理是通过替换IAT表中函数的原始地址从而实现Hook的,与普通的 InlineHook 不太一样 IAT Hook 需要充分理解PE文件的结构才能完成 Hook,接下来将具体分析 IAT Hook 的实现原理,并编写一个DLL注入文件,实现 IAT Hook 。
    270 0
    PE格式:分析IatHook并实现
    |
    存储 安全 编译器
    PE格式:手写PE结构解析工具
    PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等,在PE文件中我们最需要关注,PE结构,导入表,导出表,重定位表,下面将具体介绍PE的关键结构,并使用C语言编程获取到这些结构数据.
    712 0
    PE格式:手写PE结构解析工具
    |
    编译器
    PE格式:实现PE文件特征码识别
    PE文件就是我们常说的EXE可执行文件,针对文件特征的识别可以清晰的知道该程序是使用何种编程语言实现的,前提是要有特征库,PE特征识别有多种形式,第一种是静态识别,此方法就是只针对磁盘中文件的特征码字段进行检测来判断编译器版本,此种方式优点是快,缺点是识别不准确,第二种则是动态识别,当程序被装入内存解码后在尝试对其进行识别,此方法最为准确,我们经常使用的PEID查壳工具是基于静态检测的方法。
    324 0
    PE格式:实现PE文件特征码识别
    |
    Windows
    |
    存储 安全 程序员
    [re入门]PE文件小知识(上)
    [re入门]PE文件小知识
    350 0
    [re入门]PE文件小知识(上)
    |
    安全
    [re入门]PE文件小知识(下)
    [re入门]PE文件小知识
    117 0
    [re入门]PE文件小知识(下)
    |
    存储 Windows
    [re入门]PE文件小知识(中)
    [re入门]PE文件小知识
    177 0
    [re入门]PE文件小知识(中)
    |
    C++ Windows
    [re入门]PE文件结构(上)
    [re入门]PE文件结构
    180 0
    [re入门]PE文件结构(上)
    |
    安全 程序员 C++
    [re入门]PE文件结构(下)
    [re入门]PE文件结构
    216 0
    [re入门]PE文件结构(下)