【doc】EXE文件的剖析和修改

上传人:人*** 文档编号:469604659 上传时间:2022-08-09 格式:DOC 页数:27 大小:54KB
返回 下载 相关 举报
【doc】EXE文件的剖析和修改_第1页
第1页 / 共27页
【doc】EXE文件的剖析和修改_第2页
第2页 / 共27页
【doc】EXE文件的剖析和修改_第3页
第3页 / 共27页
【doc】EXE文件的剖析和修改_第4页
第4页 / 共27页
【doc】EXE文件的剖析和修改_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《【doc】EXE文件的剖析和修改》由会员分享,可在线阅读,更多相关《【doc】EXE文件的剖析和修改(27页珍藏版)》请在金锄头文库上搜索。

1、EXE文件的剖析和修改,EXE文件的剖析和修改云南师大杨秀国MsDOs(或PC-DOS,CCDO5,GWDO5)对COM型命令程序文件和EXE型可执行程序文件的管理机制与处理过程是有较大或某种意义上说是本质区别的.弄清楚它们在结构上,处理机制(装入,执行,调试等过程)上的差别与详情对各种程序的调试修改,特别是用DEBUG等调试工具对机器代码(而不是源程序)的直接修改,汇编改造,甚至对开发编语言程序及与其它语言的接口程序均有较大意义和助益.但正是对这一部份重要内容,MS,DOS有关手册及技术资料中往往写得过于简略,分散,不够具体且无例子参考,加之翻译常常不准,使得许多一时难以搞清这些详情就试图对

2、EXE文件直接进行调试改进(譬如加入一段汇编机器代码)的用户的不少好主意落空或失败.通过本文的抛码引玉和读者诸君共同切嗟,进一步探究,将使大家原先可能感到难以下手及困惑不解的问题得以解决,明晰甚或是只受到一点启发,这就是笔者最大的愿望.一,EXE与COM文件大家知遭,在DOS提示符>后的命令行上直接打入不加扩展名的EXE或COM文件名时均可运行这两类程序,并且它们都是非AscI码文本文件型的十六进表示的,可执行的二进制代码文件.这只是二者表面上看起来的共同点,以致使有些用户或程序编制人员误以为它们大概一样,而犯企图直接用REN命令去将二者换名使用的错误,或以为顶多不过只要用EXE2BIN

3、实用命令即可任意转换成功了.其实,这两类文件在内部结构和装入执行过程上有很大的不同,请看下表(图1).图1COM和EXE文件差别对照表COM文件可用汇编语言,高级语言经编译一连接一转换得来,也可由DEBuG直接产生.只能在一个物理段(64K)内运行.文件本身不能超过64K.文件中不合再定位(relocate)信息.由构成程序(包括数据)的纯二进制代码装载模块组成.虽整个文件可作为一整个段被装入当前用户可用内存.中成ExE文件只能由编译一连接(LINK)程序产生.可使用多个段,诸段可重叠或不重叠地分布在内存中.程序可在64K以上内存空间中运行.文件本身可超过64K.文件中带有再定位信息.由台控制

4、和苒定位信息的描述标题(header)与装载模块代码组成.可设定多个段,各段可分别在装入时被再定位(真正的浮动代l(续前)COM文件为可执行内存映象(即所谓整个浮动装载模块的再定位),但文件中各部分不能分别再定位.文件短小简单,装入过程简便快速.被COMMAND装入后,cs,Ds,Es,sS始终指向程序前缀(PSP)的段地址,IP恒指向100h,SP恒指本物理段尾,栈顶恒存两字节的00h,详见图2.故程序员不能也不必随便在程序中指定上述地址及值.且必须保证程序的第一条可执行指令(入口)在CS:100处(通常在该处放一条ORG10oh伪指令即可).又因整个程序只在一个物理段中运行且cs恒指PSP

5、,故在程序任一处均可用INT20h中断调用遣返DOS.因无再定位信息,故程序中不能出现诸如MOVAX.CODESEGMOVDS,AX之类要根据装入时的再定位信息才能确定的浮动地址值(CODESEG的段值),而应代之嵌PUSHPOPDS等指令来实现(倘若程序中必须对段进行修改,操作的话).EXE文件码程序的再定位).文件较长(最d640字节),结构较复杂,装入(含再定位)过程较复杂,较慢.详见二,三节.被cOMMAND装入后,DS,ES首先指向PSP段地址;cS:Ip,sS:Sp均按LINK传来的(处于标题控制信息中的)值处理设置.故程序员须在程序中指定上述各地址(栈和启动地址可处于程序的任何一

6、个地方).因程序可在多个段中运行,各段寄值可变,故在用INT20h退返之前,必须确保cs指向PSP(DOS规定),这就是为什么常要求应按以下标准模式来编制汇编程序的缘故:CO?DESEGMENTASSUMECSCODEMAINMAINCODEPROCFARpUSHDSSUBAX.AXPUSHAXRETENDPENDSENDMAIN(因为一开始执行ExE文件时头三条指令即把PSP的首址(此时正是DS=000O)保存进栈,而退出时远的段间RET指令正是从栈中相继弹出返址到CS=IP从而既保证了cs指向PSP段地址,又使程序控制返回到PSP开始处,那儿恰是一条INT20h指令,所以就正常终止退返DO

7、S了)2由此表井参看图2,3的内存映象图已可初步了解到,有经验的程序员和熟悉汇编语言的同志当然也知道的关于cOM和ExE文件及程序的一些端倪,譬如要生成,转换,修改它们须分别遵循一些规则,条件而不是信手拈来一些指令,命令随便做一下(如仅只是换一下名)就可保成功的.酉2?c.瞅内7唑景盥图5ExE蚪装行的黝啪对DOO0:FN:F峙)断匐量表R0H通讥E代码段壶中阁内存巨蝴可使用注:DOS常驻部分通常包括IBMBIO.注意:装入后,DSES并未指向COM,IBMDOS.COM,DOSSE作区,用户在程序中定义的段址,而是初始化COMMAND常驻部分和其它.SYS常驻服为指向PSP首址.要到执行使用

8、它们时务程序(作为DOS的扩充部分)才指向所需的段以下各节,特别是用实例一节按们将进一步阐明EXE文件的结构,装入机制,转换修改方法等详情,通过逐步掌握并实践,作为一般用户和程序设计改进者的您也就可3一一一一一一一一一以轻而易举地用汇编,连接,调试等工具软件来处理涉及cOM和EXE文件的种种问题了.二,EXE文件的结构ILINK建立得来的EXE文件由文件标题和装载模块(程序本身)两部分组成.1,标题部分含有DOS对运行该文件程序的控制信息和再定位信恩,故又可缅分为初始化控制信息区和再定位表组成.整个标题部分位于文件开头,一般大小为512字节.(1)初始化控制信息区由以下内容构成并位于标题酋部:

9、字节序号il6进制偏移值第12字节O00I嚣34字节iO203第56字节10105第78字节06-07第9lO字节08一O9第1l12字节OA一0B第13l4字节0C一0D第1516字节.0E一0F第l718字节ll01l第1920字节Il2一l3第2l22字节;l4一l5第2324字节l6一l7第2526字节l8一l9第2728字节1AlB内容LINK程序的签字标记,有效值为4D,5A文件最后一个扇区中剩余字节数(模512后的长度)文件共占用的扇区数即页数(包括.标题在内)再定位表中所含再定位项的项数以节(每节:l6字节)表示的.标题长度在装载程序尾部之后要求的最少内存大小(以节表示)在装载

10、程序尾部之后要求的最大内存长度(以节表示)在装载程序中设定的栈段的段偏移值(ss的初始段值)装载模块取得控制时,sP寄存器中之初值(偏移地址)字检查和,文件中所有字之负和,不考虑溢出控制传给模块时,IP寄存器中之偏移值在装载模块中代码段的段偏移值(CS的初始值)第一个再定位项的偏移值(即再定位表在文件标题中的始址)复盖号(0表程序的常驻部分)由上表可见,初始化控制信怠区中存放着DOS对该文件进行装八,再定位及传送控制使其正常运行时必须据之操作的重要信息.这些信息均hLINK组织并填八.(2)再定位表跟在初始化信息区后的再定位表由称作再定位项的数目可变(取决于程序中设置的段数)的若干项组成,该项

11、数由(1)中第78字节中的值给出.每个再定位项含4字节,该4字节值表示一个指向装载模块中某一浮动字的地址(指针),前两字节为其偏移值,后两字节为其相对段值在控制传给程序执行之前,这些浮动字的值(通常为程序中引用,设定到的段值)需要加上用户可用内存的起始段值(基址),这一由COMMAND完成的对相对段值进行修改调整的过程就是可浮动代码的再定位,实现详见第三节.下图示出再定位项与浮动字和程序段之间的一,一对应关系.4再定位表因再定位项只是地址指针,故再定位表只是一个内容与顺序无关的无序表(一般是按偏移值从小到大填).2,装载模块紧跟在文件标题区后(偏移始址应为512字节的边界如0200处)的装载模

12、块即可执行映象即程序的运行部分,包括可分为着干段的程序(指令代码),数据,堆栈等等.此外,其中还含有上文提到的指向相应程序段的若干浮动字,每个字与一程序段一一对应,即浮动字的内容恰是指向对应段的段偏移值(相对段地址).经DOS将来装入调整后的浮动字值便给出各程序段工作时的真实物理段值(绝对段地址),而文件中保存的调整修改前的浮动字值只是LINK传来的需经再定位处理的可浮动偏移段值,它要加上一起始段基址才等于绝对段地址.故也常称浮动字中的相对段值为不完全机器段地址,而修改浮动字的内容.即意味着实现对程序模块相应段的再定位.三,EXE文件的装入执行过程EXE文件的执行过程主要是由命令处理程序COM

13、MAND完成的将文件中的程序从外存传送到指定存区域并使各段定位的装入过程,具体说,它是如何工作和实现的呢首先,与装A.COM文件一样,它在用户可用内存首都(一般是COMMAND的常驻部分后面)建立占用偏移地址O0一FFh的256字节的一个程序段前缀PSP,PSP的结构详情请参看DOS技术手册.这里只提请注意,其中OOOlh字节中为NT20的机器码CD2O.OAl5h中保存着各种终结退出地址.5O一52b中为1NT21和RETF的机器码.5Ch一8Oh为两个FCB(文件控制块).8OFFh中为命令参数行存放区及默认的盘传输区(DTA).从第六节的实例中您将会看到它们.第二步工作是把EXE文件标题

14、的初始化信息部分读八其内存工作区.然后根据其中第O2一O5h,O8一O9h中的内容,算出装载模块的实际大小,并基于LINK时是否设置/H开关,确定出适合装入装载模块的起始段值(段基址).5第四步,即把文件中的装载模块读八从起始段首址开始的内存单元中.以下各步就开始利用再定位表进行各浮动段地址的再定位工作了:首先,它把标题中的再定位表读进它的工作区,然后按起始段值调整每个再定位项内容为(再定位项原相对段址+起始段值):再定位项中偏移值,从而指向巳装入的程序模块中的每个相应浮动字.接着,再把起始段值加到每个由此找到的浮动字上.最后一步工作是确定有关段寄存器cs,Ds等等的初值(真实物理地址),以便将控制传给程序去执行:这只要将初始化控制信息区中OEllh的内容分别置给ss和sP,ss中还要加入起始段值;把PSP的段值置给DS和s(一般它低于起始段值100h个字节);把1417h中的值分别置给IP和Cs,当然,Cs中也同时要加上起始段值.至此,就完成了EXE文件的全部装入,再定位,传送控制执行过程.从以上过程的分析可以知道,EXE的内存映象实际上只是文件中被调整修改过一些浮动地址的装载模块,而文件中的标题部份的256个字节内容在装入完成与执行时已无用处,故在用户内存中是找不到踪影的,事实上,它只是被读jXDOS/2作区中使用过而已.这也就是为什么不能直接用d

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号