admin 管理员组

文章数量: 1184232


2024年3月20日发(作者:css定位实例)

1基本概念

下表描述了贯穿于本文中的一些概念:

名称 描述

是虚拟地址而不是物理地址。为什么不是物理地址呢?因为数据在内存的位置经常在变,这样可以节省内存开支、

地址

避开错误的内存位置等的优势。同时用户并不需要知道具体的真实地址,因为系统自己会为程序准备好内存空间的

(只要内存足够大)

镜像文件

包含以EXE文件为代表的可执行文件、以DLL文件为代表的动态链接库。为什么用镜像?这是因为他们常常

被直接复制到内存,有镜像的某种意思。看来西方人挺有想象力的哦

0

RVA

英文全称RelativelyVirtualAddress。偏移(又称相对虚拟地址)。相对镜像基址的偏移。

节是PE文件中代码或数据的基本单元。原则上讲,节只分为代码节和数据节。

VA英文全称VirtualAddress。基址

2概览

x86都是32位的,IA-64都是64位的。64位Windows需要做的只是修改PE格式的少数几个域。这种新的格式被称为

PE32+。它并没有增加任何新域,仅从PE格式中删除了一个域。其余的改变就是简单地把某些域从32位扩展到64位。

在大部分情况下,你都能写出同时适用于32位和64位PE文件的代码。

EXE文件与DLL文件的区别完全是语义上的。它们使用的是相同的PE格式。惟一的不同在于一个位,这个位用来指示

文件应该作为EXE还是DLL。甚至DLL文件的扩展名也完全也是人为的。你可以给DLL一个完全不同的扩展名,例

如.OCX控件和控制面板小程序(.CPL)都是DLL。

K件表

CoimPew

谑莅适息

COFF

符号表

CQFF

行号

*u,pudy.L'Inn

调试信息

i

J

L

.rdoc

.edata

.data

.text

IhIAGE_SECTKMCHEACER

IkiAGE_5ECTIONJSEADER

ILIAGE_5ECTIONJILADEE.

IMAGE_SECTICUCHEABER

(Secti-

MZ;

J

I

L

1

l

!

专指目李杰

I

ILIAGE_OPTIONAL_HEADEP32

PE

文件头

ZMAGE_TLLE_HEADEE.

■PE'ACi

!

DOSstub

IX>5'MZ'HEADER

J I

DOSSEf

FE文件框架结构

图1解释了MicrosoftPE可执行文件格式:

PE文件总体上分为头和节。头是节的描述、简化、说明,节是头的具体化。

3文件头

正好构成SizeOfHeaders所指的范围,所以将它们合为头。这里的3个头与别的文章的头的定义会有所区别。

PE文件的头分为DOS头、NT头、节头。注意,这是本人的分法,在此之前并没有这种分法。这样分法会更加合理,更易理解。因为这三个部分

节头紧跟在NT头后面。

3.1 DOS

头(

PE

文件签名的偏移地址就是大小)

用记事本打开任何一个镜像文件,其头2个字节必为字符串MZ,这是MarkZbikowski的姓名缩写,他是最初的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下时,这个程序

显示TisroramcannotberninDOSmode(此程序不能在DOS模式下运行)这条消息。用户也可以自己更改该程序,有些还原软件就是这么干的。同时,

有些程序既能运行于DOS又能运行于Windows下就是这个原因。整个DOS头大小为224个字节,大部分不能在DOS下运行的Win32

文件都是这个值。MS-DOS程序是可有可无的,如果你想使文件大小尽可能的小可以省掉MS-DOS程序,同时把前面的参数都清0。


本文标签: 文件 程序 地址 内存 偏移