可执行程式(executable program,EXE File)是可在作业系统存储空间中浮动定位的二进制可执行程式。它可以载入到记忆体中,由作业系统载入并执行。特定的CPU指令集(如X86指令集)对应的不同平台之间的可执行程式不可直接移植运行。
基本介绍
- 中文名:可执行程式
- 外文名:executable program
- 后缀名:.com .exe等
- 特点:在作业系统存储空间中浮动定位
- 用途:完成各项计算机功能
简介
windows作业系统中的二进制执行档分两种:一种后辍名为.COM,另一种是.EXE 。在MS-DOS下,有重名的.EXE档案和.COM档案运行时,优先执行.COM档案。如果只有A.EXE,就可以直接输入"A",而不用输入全名。但如果有A.COM和A.EXE,输入A则优先执行A.COM,要运行A.EXE只能输入A.EXE而不能输入A。在WINDOWS系统中的执行档案一般都是.EXE档案。在windows中,用户在命令提示符输入不带 .exe 扩展名的档案名称后按 Enter 键或者点双击就能运行可执行程式。linux不象MS-DOS/windows一样靠档案后缀名来判断是否可执行,而是靠档案属性来判断。每个档案专门有个属性来表示档案是否可执行,对于脚本之类的程式,档案第一行指明执行本脚本的程式位置。
windows/MS-DOS下的EXE 档案比较複杂,但每个EXE档案都有一个档案头,其结构如下。
EXE档案头的信息
├偏移量┤ 意义 ┤
├00h-01h ┤MZ'EXE档案标记 ┤
├02h-03h ┤最后一页的位元组数(每页512B) ┤
├04h-05h ┤档案长度(位元组数)除以512的商+1 -| ┤
├06h-07h ┤重定位项的个数 ┤
├08h-09h ┤档案头除16的商 ┤
├0ah-0bh ┤程式运行所需最小段数 ┤
├0ch-0dh ┤..............大.... ┤
├oeh-0fh ┤堆叠段的段值 (SS) ┤
├10h-11h ┤........sp ┤
├12h-13h ┤档案校验和 ┤
├14h-15h ┤IP ┤
├16h-17h ┤CS ┤
├18h-19h ┤............ ┤
├1ah-1bh ┤............ ┤
├1ch ┤............ ┤
―――――――――――――――――――――――――
.EXE档案包含一个档案头和一个可重定位程式映象。档案头包含MS-DOS用于载入程式的信息,例如程式的大小和暂存器的初始值。档案头还指向一个重定位表,该表包含指向程式映象中可重定位段地址的指针鍊表。档案头的形式与EXEHEADER结构对应:
EXEHEADER STRUC
exSignature dw 5A4Dh ;.EXE标誌
exExraBytes dw ;最后(部分)页中的位元组数
exPages dw ;档案中的全部和部分页数
exRelocItems dw ;重定位表中的指针数
exHeaderSize dw ;以位元组为单位的档案头大小
exMinAlloc dw ;最小分配大小
exMaxAlloc dw ;最大分配大小
exInitSS dw ;初始SS值
exInitSP dw ;初始SP值
exChechSum dw ;补码校验值
exInitIP dw ;初始IP值
exInitCS dw ;初始CS值
exRelocTable dw ;重定位表的位元组偏移量
exOverlay dw ;覆盖号
EXEHEADER ENDS程式映象
包含处理器代码和程式的初始数据,紧接在档案头之后。它的大小以位元组为单位,等于EXE档案的大小减去档案头的大小,也等于exHeaderSize的域的值乘以16。MS-DOS通过把该映象直接从档案拷贝到记忆体载入.EXE程式然后调整定位表中说明的可重定位段地址。
定位表是一个重定位指针数组,每个指向程式映象中的可重定位段地址。档案头中的exRelocItems域说明了数组中指针的个数,exRelocTable域说明了分配表的起始档案偏移量。每个重定位指针由两个16位值组成:偏移量和段值。 为载入.EXE程式,MS-DOS首先读档案头以确定.EXE标誌并计算程式映象的大小。然后它试图申请记忆体。首先,它计算程式映象档案的大小加上PSP的大小再加上EXEHEADER结构中的exMinAlloc域说明的记忆体大小这三者之和,如果总和超过最大可用记忆体块的大小。则MS-DOS停止载入程式并返回一个出错值。如果总和没超过最大可用记忆体块的大小,它便计算程式映象的大小加上PSP的大小再加上EXEHEADER结构中exMaxAlloc域说明的记忆体大小之和,如果第二个总和小于最大可用记忆体块的大小,则MS-DOS 分配计算得到的记忆体量。否则,它分配最大可用记忆体块。分配完记忆体后,MS-DOS确定段地址,也称为起始段地址,MS-DOS从此处载入程式映象。如果exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映象儘可能地载入到记忆体最高端。否则,它把映象载入到紧挨着PSP域之上。接下来,MS-DOS读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表中的每个指针,MS-DOS寻找程式映象中相应的可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了记忆体中被载入程式的代码和数据段。 MS-DOS在所分配记忆体的最低部分建造256位元组的PSP,把AL和AH设定为载入 .COM程式时所设定的值。MS-DOS使用档案头中的值设定SP与SS,调整SS初始值,把起始地址加到它之上。MS-DOS还把ES和DS设定为PSP的段地址.最后,MS-DOS从程式档案头读取CS和IP的初始值,把起始段地址加到CS之 上,把控制转移到位于调整后地址处的程式。
档案格式
Linux32/64位执行档
Linux是靠档案属性来判断判断是否可执行。每个档案专门有个属性来表示档案是否可执行。
MS-DOS执行档
最简单的执行档格式,可以在MS-DOS和32位的WINDOWS中运行。它通过在档案头添加ASCII字元串“MZ”(16进制中表示为4D5A)来标识。“MZ”是MS-DOS开发者之一的马克·茨柏克沃斯基(Mark Zbikowski)的姓名首字母缩写DOS执行档是16位执行档,运行于兼容x86指令集(或x86虚拟机)下的实模式或虚拟8086模式。
16位NE X86执行档
通过在档案头添加ASCII字元串“NE”来标识。它只能运行在Windows和OS/2系统,而不能在DOS下运行。
16/32位X86执行档
通过在档案头添加ASCII字元串“LE”来标识。它仅用来在Windows 3.x和Windows 9x中替代VxD驱动。
32位线性执行档
通过在档案头添加ASCII字元串“LX”来标识。运行在OS/2 2.0以及更高版本中,也可用于某些DOS扩展。
32位X86执行档
这是最複杂也最流行的执行档格式,通过在档案头添加ASCII字元串“PE”来标识。它主要运行于Windows 95和Windows NT以及更高版本的Windows中,也可在BeOS R3中运行。
64位X86-64执行档
与前一种类似,但使用支持64位的X86cpu(64根地址汇流排)。因此它仅能在64位的Windows系统中运行,譬如Windows 7 64位和 Windows10 X64。
反编译
计算机软体反向工程也称为计算机软体还原工程,是指通过对他人软体的目标程式(可执行程式)进行“逆向分析、研究”工作,以推导出他人的软体产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出原始码。
反彙编是把目标代码转为彙编代码的过程,是把二级制可执行程式机器语言转换为彙编语言代码,常用于软体破解、病毒分析、逆向工程、软体汉化等领域。
常用软体debug、W32Dasm、C32Asm等
修改软体UEStudio开发环境等