PE文件头解析大全

合集下载

PE文件格式详解

PE文件格式详解

PE文件格式详解

(一)基础知识

什么是PE文件格式:

我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32位Window系统中的可执行文件EXE以及动态连接库文件DLL的组织形式。为什么我们双击一个EXE文件之后它就会被Window运行,而我们双击一个DOC文件就会被Word打开并显示其中的内容;这说明文件中肯定除了存在那些文件的主体内容(比如EXE文件中的代码,数据等,DOC 文件中的文件内容等)之外还存在其他一些重要的信息。这些信息是给文件的使用者看的,比如说EXE文件的使用者就是Window,而DOC文件的使用者就是Word。Window可以根据这些信息知道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令中的地址等等。那么PE文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,针对不同的编译器和连接器通常会提供不同的选项让我们在编译和联结生成PE文件的时候对其中的那些Window需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window中默认的信息。例如:WindowNT默认的程序加载基址是0x40000;你可以在用VC连接生成EXE文件的时候使用选项更改这个地址值。在不同的操作系统中可执行文件的格式是不同的,比如在Linux上就有一种流行的ELF格式;当然它是由在Linux上的编译器和连接器生成的,所以编译器、连接器是针对不同的CPU架构和不同的操作系统而涉及出来的。在嵌入式领域中我们经常提到交叉编译器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交叉编译器在跑Linux的X86机器上编译出能在Arm上运行的程序。

RTP报文头部分析

RTP报文头部分析

RTP报文头部分析

1. 版本(version)(2 bits): 这个字段指定了RTP的版本号,用于

区分不同的RTP版本。当前的版本为2

2. 填充位(padding)(1 bit): 这个字段用于指示报文最后一个字

节的填充位是否有效。填充位用来使RTP报文的长度为整数个字(words),主要用于解决一些加密算法对字节边界的特殊要求。

3. 扩展位(extension)(1 bit): 这个字段指示是否存在头部扩展。头部扩展提供了额外的信息,用于传递媒体相关的控制信息,如时钟同步、序列号重置等。

4. CSRC计数(CSRC count)(4 bits): 这个字段指示了CSRC标识

符的数量。CSRC(Contributing Source)是贡献源标识符,用于表示参

与该报文生成的贡献源的标识符,如发送者和混音器等。

5. 标记位(marker)(1 bit): 这个字段用于标记报文的重要性或特

殊状态。应用程序可以根据标记位实现特定的处理逻辑,如重要事件的标

记等。

6. 负载类型(payload type)(7 bits): 这个字段指示了报文有效

载荷的类型。RTP支持多种有效载荷类型,如G.711音频、H.264视频等。每种有效载荷类型都对应一个唯一的标识符。

7. 序列号(sequence number)(16 bits): 这个字段是报文的序列号,用于解决报文乱序、丢失和重复等问题。接收方可以根据序列号来恢

复正确的报文顺序,并检测是否有报文丢失。

9. 同步源(synchronization source)(32 bits): 这个字段是一个标识符,用于唯一标识RTP流的源。RTP的接收方可以根据同步源来区分不同的媒体源,如不同的音频流或视频流。

pe explorer 用法

pe explorer 用法

pe explorer 用法

PE Explorer是一款功能强大的可执行文件(EXE和DLL)编辑器和资源编辑器。它提供了许多高级功能,帮助开发人员和逆向工程师分析和修改二进制文件。本文将向您介绍PE Explorer的用法,并以一步一步的方式回答有关其功能和操作的问题。

一、PE Explorer的介绍

PE Explorer是由Heaventools Software开发的一款Windows可执行文件编辑器。它可以显示和编辑二进制文件的各个部分,包括PE头、节表、导入表、导出表、资源、重定位表等。PE Explorer提供了一个直观的图形用户界面,允许用户在不同的视图(HEX、字符串、导入/导出等)之间切换,并提供了许多工具来修改二进制文件。

二、PE Explorer的功能

1. PE头信息查看和编辑:PE Explorer可以解析并显示PE文件的头部信息,包括标识、节表、导入/导出表、资源、重定位表等。用户可以对这些信息进行编辑和修改。

2. 节表编辑:PE Explorer可以显示PE文件的节表,并允许用户对每个节进行编辑和修改。用户可以修改节的属性、名称、大小等。

3. 导入表和导出表编辑:PE Explorer可以显示PE文件的导入表和导出

表,并允许用户对它们进行编辑。用户可以添加或删除导入/导出函数,修改函数名称等。

4. 资源编辑:PE Explorer在一个视图中显示PE文件的资源,包括图片、图标、对话框、字符串等。用户可以导入、导出和编辑这些资源。

5. 重定位表编辑:PE Explorer可以显示和编辑PE文件的重定位表。用户可以修改重定位表中的地址,以解决代码在不同基址上的运行问题。

逆向分析实验2PE文件结构分析

逆向分析实验2PE文件结构分析

实验二PE文件结构分析

一. 实验目的

1.了解PE文件的输入表结构;

2.手工解析PE文件的输入表;

3.编程实现PE文件输入表的解析。

二. 实验内容

1.第一步:手动解析输入表结构

(1)使用工具箱中的工具e verything,寻找当前系统中任意一个e xe

文件,文件名称是: actmovie.exe

(2)使用LordPE“PE编辑器”打开exe文件,确定输入表的RVA,截

图如下(图1):

(3)点击PE编辑器右侧的“位置计算器”,得到文件偏移值,截图如

下(图2):

(4)使用16进制编辑工具,跳转到相应的输入文件偏移地址,输入表

是每个IID对应一个DLL,根据IID大小,这里取20字节的数据进行分析,将输入表第一个IID结构的数据与IID结构体的成员一一对应,具体如下所示:

IMAGE_IMPORT_DESCRIPTOR {

OriginalFirstThunk = 000013C0

TimeDateStamp = FFFFFFFF

ForwarderChain = FFFFFFFF

Name = 000014C0

FirstThunk = 0000100C

}

(5)关注OriginalFirstThunk和Name两个成员,其中Name是一个RVA,

用步骤(3)的方法得到其文件偏移值为 000008C0 ,在16进制编辑工具转到这个偏移地址,可见输入表的第一个D LL名为 msvcrt.dll ,截图如下(图3):

(6)分析一下OriginalFirstThunk,它指向一个类型为

IMAGE_THUNK_DATA的数组,上面已经分析出了它的值为

peclass的书写格式

peclass的书写格式

peclass的书写格式

一、什么是peclass?

peclass是一种常用于Windows可执行文件(PE文件)的格式规范。PE文件是Windows操作系统下的可执行文件,包括.exe和.dll等文件类型。peclass定义了PE文件的结构和组织方式,规定了PE文件各个部分的格式和内容,使得不同的PE 文件能够被系统正确解析和执行。

二、peclass的结构

PE文件由多个部分组成,包括PE头、节表、导出表、导入表、资源表等。peclass规定了每个部分的结构和内容,并规定了它们在PE文件中的排列方式。

2.1 PE头

PE头是PE文件的入口,包含了文件的基本信息,如文件类型、目标机器类型、程序入口点等。PE头的结构由peclass定义,并且在文件的起始位置处。

2.2 节表

节表描述了PE文件中的各个节(section),每个节对应一段内存空间,包含可执行代码、数据、资源等。peclass定义了节表的格式和内容,使得系统能够正确加载和执行PE文件中的代码和数据。

2.3 导出表

导出表用于描述PE文件中的函数和变量,以供其他程序使用。peclass规定了导出表的结构和内容,使得其他程序能够正确引用和调用PE文件中的函数和变量。

2.4 导入表

导入表用于描述PE文件中依赖的其他函数和变量,以供自身程序使用。peclass 规定了导入表的格式和内容,使得PE文件能够正确加载和调用其他函数和变量。

2.5 资源表

资源表描述了PE文件中的资源,如图标、位图、字符串等。peclass定义了资源

表的结构和内容,使得PE文件能够正确加载和显示各种资源。

可执行文件分析

可执行文件分析
上面的导入表是Jview程序的分析结果,现在我们通过查看其导出函数,通过dependency walker工具来监视可执行文件运行是加载了那些动态链接库。用来跟踪不同的DLL函数调用,函数的返回值是什么。
导出表:
可以被其它函数调用的函数。
资源段:
在PE文件中还有一个资源段,这个段的名字叫做.rsrc段。这个段中包括程序使用的对话框、图标等资源信息。
Flag
Value
Description
IMAGE_FILE_RELOCS_STRIPPED
0x0001
Image only, Windows CE, and Microsoft Windows NT® and later. This indicates that the file does not contain base relocations and must therefore be loaded at its preferred base address. If the base address is not available, the loader reports an error. The default behavior of the linker is to strip base relocations from executable (EXE) files.
0x0100

peid 原理

peid 原理

peid 原理

PEID(Portable Executable Identifier)是一种用于识别可执行文件格式的工具,它可以帮助分析人员确定一个可执行文件的属性和特征。本文将介绍PEID的原理及其在软件分析领域的应用。

PEID的原理基于对可执行文件的结构和特征进行分析和识别。可执行文件是计算机程序或软件的载体,如Windows操作系统中的程序文件(.exe)或动态链接库(.dll)。PEID通过解析文件的头部信息,查找特定的标志和标识符,来确定文件是否符合PE文件格式。

PE文件格式是Windows操作系统中常见的可执行文件格式,它具有一定的结构和规范。PEID会检查文件的文件头、节表、导入导出表等部分,用于判断文件是否遵循PE文件格式,并提取文件的属性和特征。

PEID的应用范围广泛。对于安全研究人员和反病毒工程师来说,PEID可以帮助他们识别和分析未知的恶意软件样本。通过比对已知的PE文件特征库,他们可以判断一个文件是否是恶意文件,并深入分析其行为和特征,从而改进安全防护策略。

此外,PEID还可用于软件开发中的调试和逆向工程。开发人员可以使用PEID 来验证生成的可执行文件是否遵循PE文件格式,并确保文件的正确性和兼容性。逆向工程师可以利用PEID来识别和解析未知的可执行文件,了解其中的执行逻辑和功能实现,以便进行进一步的逆向分析。

总结而言,PEID作为一种可执行文件识别工具,在软件分析领域中发挥着重要作用。通过解析文件的结构和特征,PEID可以帮助人们识别和分析各种类型的可执行文件,包括恶意软件和正常的应用程序。无论是安全研究、反病毒工程还是软件开发和逆向工程,PEID都是一个不可或缺的工具。

PE文件结构

PE文件结构

检验PE文件的有效性

<1>首先检验文件头部第一个字的值是否等于IMAGE_DOS_SIGNATURE,是则表示DOS MZ header有效

<2>一旦证明文件的Dos header 有效后,就可用e_lfanew来定位PE header

<3>比较PE header 的第一个字的值是否等于IMAGE_NT_HEADER,如果前后两个值都匹配. PS.WinHex使用方法

1.Alt+G跳到指定位置

2.Ctrl+Shift+N放入新文件

3.大文件扩容,新建一个扩容大小+1的文件,把这个文件的数据复制后写入整个文件的尾地址.

4.文本搜索ctrl+F

5.十六进制搜索ctrl+alt+x

6.文本显示F7

7.打开内存alt+F9

8.进制转换器F8

9.分析选块F2

10.计算HASH ctrl+F2

11.收集文本信息ctrl+F10

12.编辑模式F6

一.IMAGE_DOS_HEADER

<1>位置00H,WORD(2个字节)的e_magic为4D5A,即MZ

<2>位置3CH,60,LONG(4个节节)的e_lfanew为64+112=176即B0H,

二.IMAGE_NT_HEADERS

<1>位置B0H,DWORD(4个字节),PE开始标记,写入50450000,即PE

<2>位置B4H,WORD,PE所要求的CPU,对于Intel平台,为4C01

<2>位置B6,WORD,PE中段总数,计划有3个段,.text代码段,.rdata只读数据段,.data全局变量数据段,所以值为0300,

<3>位置C4,WORD,表示后面的PE文件可选头的占空间大小,即224字节(E0),值为E000

PE文件解析-PE头解析-1-文件头,PE头

PE文件解析-PE头解析-1-文件头,PE头

PE⽂件解析-PE头解析-1-⽂件头,PE头PE⽂件解析-PE头解析

PE头⼜叫NT头,是PE⽂件真正的头部,DOS头只是⽤来为了兼容以前的DOS系统。

PE头位于DOS Stub后⾯,以PE00作为起始标记

类似于DOS头的MZ

DOS Stub

DOS Stub就是DOS头结束到PE头的开始中间的区域,基本上是垃圾区域没啥⽤,但是加壳的时候可以⽤到。NT/PE头

typedef struct _IMAGE_NT_HEADERS {

DWORD Signature;//PE标志,就是PE00

IMAGE_FILE_HEADER FileHeader;//⽂件头,是另⼀个⽂件的结构体

IMAGE_OPTIONAL_HEADER32 OptionalHeader;//可选PE头,也叫扩展头

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

⽂件头

typedef struct _IMAGE_FILE_HEADER {

WORD Machine;//程序允许的CPU型号,如果为0表⽰能在任何CPU上运⾏,如果是0x14c表⽰的是386以及后续的型号

WORD NumberOfSections;//⽂件中存在的区段的数量

DWORD TimeDateStamp;//时间戳

DWORD PointerToSymbolTable;

DWORD NumberOfSymbols;

WORD SizeOfOptionalHeader;//可选PE头的⼤⼩32位默认是E0,64位默认是F0

WORD Characteristics;//⽂件属性,每个位有不同的含义,

PE文件图标手工修改及原理分析

PE文件图标手工修改及原理分析

PE文件图标手工修改及原理分析

摘要:摘要可执行文件即exe文件是我们日常使用电脑时最常使用的一种文件类型,不同的exe文件有各式各样的图标,但是我们从网上下载的文件的图标基本都是固定的。本文首先通过对PE文件格式、图标文件格式以及PE文件中的图标资源的格式进行分析,然后手动实现了对PE文件图标的修改。

关键词:关键字PE文件图标手动修改

引言

在日常计算机使用中大家最常使用的文件就是exe文件,在大家使用exe文件时我们第一眼注意到的就是文件的图标。但是有多少人曾经考虑过将exe图标改成自己更喜欢的、有个性的图标呢?Internet上确实存在一些现成的PE文件图标修改工具,然而拿来主义毕竟没法给我们带来更多的成就感,本文的主要目的就是通过对PE文件格式[1]、图标文件格式以及PE文件中的图标资源的格式进行分析,然后手工实现对PE文件图标的修改。

在本文进行手动修改PE文件图标时主要使用到三个工具:PEView、Ultraedit和IconCool Editor,

下面将依次进行简单介绍。

1.1 PEView

PEView是一款很好的PE文件分析器,可以用来查看PE文件中各个结构的偏移位置以及具体内容。在本文所做的工作中,PEView主要用于查看PE文件资源节的地址、相关结构体地址以及图标资源地址。1.2 Ultraedit

UltraEdit是一套功能强大的文本编辑器,可以编辑文本、十六进制、ASCII码。在本文工作中该工具主要用来对PE文件和图标文件的内容进行查看并修改。

1.3 IconCool Editor

PE文件结构解析

PE文件结构解析

PE⽂件结构解析

说明:本⽂件中各种⽂件头格式截图基本都来⾃看雪的《加密与解密》;本⽂相当《加密与解密》的阅读笔记。

1.PE⽂件总体结构

PE⽂件框架结构,就是exe⽂件的排版结构。也就是说我们以⼗六进制打开⼀个.exe⽂件,开头的那些内容就是DOS头内容,下来是PE头内容,依次类推。

如果能认识到这样的内含,那么“exe开头的内容是不是就直接是我们编写的代码”(不是,开头是DOS头内容)以及“我们编写的代码被编排到了exe⽂件的哪⾥”(在.text段,.text具体地址由其相应的IMAGE_SECTION_HRADER指出)此类的问题答案就显⽽易见了。

exe⽂件从磁盘加载到内存,各部份的先后顺序是保持不变的,但由于磁盘(⼀般200H)和内存(⼀般1000H)区块的对齐⼤⼩不⼀样,所以同⼀内容在磁盘和在内存中的地址是不⼀样的。

换⾔之你在磁盘上看到⼀段内容⼀内容要到在内存中找到它--假设它是能映射到内容的部份--那么要做相应的地址转换。(⽐如你在Ultraedit 中看到某⼏个字节⽽想在OllyDbg中找到这⼏个字节那么需要进⾏地址转换)

另外要注意,PE⽂件中存放的地址值都是内存中的地址,这些地址在OllyDbg中不需要转换到其指定的位置就能找到其指向的内容;这要根据这个地址找到内容在Ultraedit的地址,需要将此RVA址转换成⽂件偏移地址。

还要注意DOS头/PE头/块表,映射到内存时属同⼀区块⽽且是第⼀区块,所以此三者上的RVA和⽂件偏移地址是相等的。

2.DOS头部

2.1MS-DOS头部(IMAGE_DOS_HEADER)

计算机病毒与防护课后习题

计算机病毒与防护课后习题

第一章

一.简述计算机病毒的定义:

编制者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码。

二.简述计算机病毒的主要特征:

1.程序性;2. 隐蔽性;3. 潜伏性;4. 可触发性;5. 表现性;6. 破坏性;7. 传染性;8.针对性;9.寄生性;11. 变异性;

三.按寄生方式分类,计算机病毒主要分哪几类?

1.覆盖型病毒(512病毒);

2.代替型病毒(打印病毒);

3.链接型病毒(黑色星期五);

4.填充型病毒(勒海病毒);

5.转储型病毒(小球病毒);

四.计算机病毒产生的主要技术原因有哪些?

1.计算机的体系结构上的缺点;

2.缺乏整体安全性和完整性的设计和检测;

3.安全性和开放性的矛盾;

五.简述计算机发展的主要阶段。

1.DOS引导阶段;

2.DOS可执行阶段;

3.伴随、批次型阶段;

4.幽灵、多形阶段;

5.生成器、变体机阶段;

6.网络、蠕虫阶段;

7.视窗阶段;

8.宏病毒阶段;

9.互联网阶段;

10.Java、邮件炸弹阶段;

六.计算机发展的主要技术。

1.抗分析病毒技术;

2.隐蔽性病毒技术;

3.多态性病毒技术;

4.插入性病毒技术;

5.超级病毒技术;

6.病毒自动生成技术;

7.跨平台病毒技术;

8.Internet病毒技术;

第二章

一.计算机逻辑结构由哪些部分组成?

(1)感染标志,(2)引导模块,(3)传染条件判断模块、实施传染模块,(4)表现或破坏条件判断模块、实施表现后破坏模块。

二.系统型病毒和文件型病毒在存储结构上有哪些不同?

系统型病毒是专门感染操作系统的启动扇区,主要指感染主引导扇区和DOS引导扇区的病毒。分两部分,第一部分存放在磁盘引导扇区中,第二部分存放在磁盘的其他扇区中。

PE文件详解1——PE文件头部解析

PE文件详解1——PE文件头部解析

PE⽂件详解1——PE⽂件头部解析

参考书籍:《WindowsPE⽂件权威指南》

MSDN中winnt.h是PE⽂件定义的最终决定者。

EXE⽂件与DLL⽂件之间的区别完全是语义上的,⼆者PE结构完全相同。唯⼀区别⽤⼀个字段标⽰处这个⽂件是exe还是dll。许多DLL扩展,如OCX控件,控制⾯板等都是DLL,它们有⼀样的实体。

64位的Windows只是对PE格式做了⼀些简单的修饰,新格式叫PE32+。没有新的结构加进去,其余的改变只是简单地将以前的32位字段扩展为64位字段。

1.PE⽂件基本结构:

PE⽂件的头分为DOS头、NT头、节头。注意,这是本⼈的分法。这样分法会更加合理,更易理解。因为这三个部分正好构成SizeOfHeaders所指的范围,所以将它们合为“头”。

2.⽂件头

2.1 DOS头

⽤记事本打开任何⼀个镜像⽂件,其头2个字节必为字符串“MZ”,这是Mark Zbikowski的姓名缩写,他是最初的MS-DOS设计者之⼀。然后是⼀些在MS-DOS下的⼀些参数,这些参数是在MS-DOS下运⾏该程序时要⽤到的。在这些参数的末尾也就是⽂件的偏移0x3C(第60字节)处是是⼀个4字节的PE⽂件签名的偏移地址。该地址有⼀个专⽤名称叫做“E_lfanew”。这个签名是“PE00”(字母“P”和“E”后跟着两个空字节)。紧跟着

E_lfanew的是⼀个MS-DOS程序。那是⼀个运⾏于MS-DOS下的合法应⽤程序。当可执⾏⽂件(⼀般指exe、com⽂件)运⾏于MS-DOS下时,这个程序显⽰“This program cannot be run in DOS mode(此程序不能在DOS模式下运⾏)”这条消息。⽤户也可以⾃⼰更改该程序,有些还原软件就是这么⼲的。同时,有些程序既能运⾏于DOS⼜能运⾏于Windows下就是这个原因。Notepad.exe整个DOS头⼤⼩为224个字节,⼤部分不能在DOS下运⾏的Win32⽂件都是这个值。MS-DOS程序是可有可⽆的,如果你想使⽂件⼤⼩尽可能的⼩可以省掉MS-DOS程序,同时把前⾯的参数都清0。

通过解析PE头。读取dll模块和dll模块函数

通过解析PE头。读取dll模块和dll模块函数

通过解析PE头。读取dll模块和dll模块函数

win32

int main()

{

//001e1000

::MessageBox(NULL, TEXT("111"), TEXT("222"), 0);

HMODULE vHmodule = GetModuleHandle(NULL);

printf("vHmodule = 0x%08X\n", vHmodule);

IMAGE_DOS_HEADER *vImageDosHeader = (IMAGE_DOS_HEADER *)vHmodule;

//printf("%08X\n", vImageDosHeader);

printf("vImageDosHeader->e_lfanew = %08X\n", vImageDosHeader->e_lfanew);

//DWORD *vTemp = (DWORD *)((DWORD)vHmodule + vImageDosHeader->e_lfanew);

//printf("vTemp=%08X\n", vTemp);

IMAGE_NT_HEADERS *vImageNtHeaders = (IMAGE_NT_HEADERS *)((DWORD)vHmodule + vImageDosHeader->e_lfanew); //printf("vImageNtHeaders[0]=%X\n", vTemp[0]);

//printf("vImageNtHeaders[2]=%X\n", vTemp[2]);

dumpbin.exe 原理 -回复

dumpbin.exe 原理 -回复

dumpbin.exe 原理-回复【dumpbin.exe 原理】

Dumpbin.exe是微软Visual Studio开发工具集中的一个实用程序,用于查看和分析可执行文件(包括DLL、EXE和OBJ文件)的二进制结构以及与文件相关的元数据和调试信息。文章将详细介绍Dumpbin.exe的原理,包括其功能、使用方法和内部原理。

一、Dumpbin.exe的功能和使用方法

Dumpbin.exe可以执行多种任务,包括但不限于以下几个方面:

1. 显示目标文件的文件头信息:这包括可执行文件的类型、机器类型、链接版本、时间戳等。

2. 显示目标文件中的节(section)和节的详细信息:这包括每个节的名称、起始地址、大小、属性、对齐方式等。

3. 显示目标文件中的导出函数和导入模块:列出所有导出函数的名称和序号,以及所有导入模块的名称和入口地址。

4. 显示目标文件的符号表:显示目标文件中定义的所有符号,包括函数、全局变量、局部变量等。

5. 显示目标文件的调试信息:如果目标文件包含调试信息,Dumpbin.exe 可以显示调试符号表、源文件信息、行号等。

6. 显示目标文件的资源:列出目标文件中包含的资源,如图标、位图、对话框模板等。

使用Dumpbin.exe也非常简单,只需打开命令提示符窗口(CMD),然后执行以下命令:

dumpbin /option <目标文件>

其中,/option代表需要执行的具体功能,可以根据需要选择。目标文件是用户想要分析的文件路径。

二、Dumpbin.exe的内部原理

PE文件格式详解

PE文件格式详解

PE文件格式详解

(一)基础知识

什么是PE文件格式:

我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32位Window系统中的可执行文件EXE以及动态连接库文件DLL的组织形式。为什么我们双击一个EXE文件之后它就会被Window运行,而我们双击一个DOC文件就会被Word打开并显示其中的内容;这说明文件中肯定除了存在那些文件的主体内容(比如EXE文件中的代码,数据等,DOC 文件中的文件内容等)之外还存在其他一些重要的信息。这些信息是给文件的使用者看的,比如说EXE文件的使用者就是Window,而DOC文件的使用者就是Word。Window可以根据这些信息知道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令中的地址等等。那么PE文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,针对不同的编译器和连接器通常会提供不同的选项让我们在编译和联结生成PE文件的时候对其中的那些Window需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window中默认的信息。例如:WindowNT默认的程序加载基址是0x40000;你可以在用VC连接生成EXE文件的时候使用选项更改这个地址值。在不同的操作系统中可执行文件的格式是不同的,比如在Linux上就有一种流行的ELF格式;当然它是由在Linux上的编译器和连接器生成的,所以编译器、连接器是针对不同的CPU架构和不同的操作系统而涉及出来的。在嵌入式领域中我们经常提到交叉编译器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交叉编译器在跑Linux的X86机器上编译出能在Arm上运行的程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PE可选头部

PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针:

PEFILE.H

#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \

((PIMAGE_DOS_HEADER)a)->e_lfanew + \

SIZE_OF_NT_SIGNATURE + \

sizeof(IMAGE_FILE_HEADER)))

可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下:

WINNT.H

typedef struct _IMAGE_OPTIONAL_HEADER {

//

// 标准域

//

USHORT Magic;

UCHAR MajorLinkerVersion;

UCHAR MinorLinkerVersion;

ULONG SizeOfCode;

ULONG SizeOfInitializedData;

ULONG SizeOfUninitializedData;

ULONG AddressOfEntryPoint;

ULONG BaseOfCode;

ULONG BaseOfData;

//

// NT附加域

//

ULONG ImageBase;

ULONG SectionAlignment;

ULONG FileAlignment;

USHORT MajorOperatingSystemVersion;

USHORT MinorOperatingSystemVersion;

USHORT MajorImageVersion;

USHORT MinorImageVersion;

USHORT MajorSubsystemVersion;

USHORT MinorSubsystemVersion;

ULONG Reserved1;

ULONG SizeOfImage;

ULONG SizeOfHeaders;

ULONG CheckSum;

USHORT Subsystem;

USHORT DllCharacteristics;

ULONG SizeOfStackReserve;

ULONG SizeOfStackCommit;

ULONG SizeOfHeapReserve;

ULONG SizeOfHeapCommit;

ULONG LoaderFlags;

ULONG NumberOfRvaAndSizes;

IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。

标准域

首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF 格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。

·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B

或267(译注:0x010B为.EXE,0x0107为ROM映像,这个信息我是从eXeScope上得来的)。

·MajorLinkerVersion、MinorLinkerVersion。表示链接此映像的链接器版本。随Window NT build 438配套的Windows NT SDK包含的链接器版本是2.39(十六进制为2.27)。

·SizeOfCode。可执行代码尺寸。

·SizeOfInitializedData。已初始化的数据尺寸。

·SizeOfUninitializedData。未初始化的数据尺寸。

·AddressOfEntryPoint。在标准域中,AddressOfEntryPoint域是对PE文件格式来说最为有趣的了。这个域表示应用程序入口点的位置。并且,对于系统黑客来说,这个位置就是导入地址表(IAT)的末尾。以下的函数示范了如何从可选头部获得Windows NT可执行映像的入口点。

PEFILE.C

LPVOID WINAPI GetModuleEntryPoint(LPVOID lpFile)

{

PIMAGE_OPTIONAL_HEADER poh;

poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);

if (poh != NULL)

return (LPVOID)poh->AddressOfEntryPoint;

else

return NULL;

}

·BaseOfCode。已载入映像的代码(“.text”段)的相对偏移量。

·BaseOfData。已载入映像的未初始化数据(“.bss”段)的相对偏移量。

Windows NT附加域

添加到Windows NT PE文件格式中的附加域为Windows NT特定的进程行为提供了装载器的支持,以下为这些域的概述。

·ImageBase。进程映像地址空间中的首选基地址。Windows NT的Microsoft Win32 SDK链接器将这个值默认设为0x00400000,但是你可以使用-BASE:linker开关改变这个值。

·SectionAlignment。从ImageBase开始,每个段都被相继的装入进程的地址空间中。SectionAlignment 则规定了装载时段能够占据的最小空间数量——就是说,段是关于SectionAlignment对齐的。

相关文档
最新文档