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

上传人:仙人指路1688 文档编号:2389795 上传时间:2023-02-17 格式:DOC 页数:27 大小:54KB
返回 下载 相关 举报
【doc】EXE文件的剖析和修改.doc_第1页
第1页 / 共27页
【doc】EXE文件的剖析和修改.doc_第2页
第2页 / 共27页
【doc】EXE文件的剖析和修改.doc_第3页
第3页 / 共27页
【doc】EXE文件的剖析和修改.doc_第4页
第4页 / 共27页
【doc】EXE文件的剖析和修改.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《【doc】EXE文件的剖析和修改.doc》由会员分享,可在线阅读,更多相关《【doc】EXE文件的剖析和修改.doc(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等等的初值(真实物理地址),以便

15、将控制传给程序去执行:这只要将初始化控制信息区中OEllh的内容分别置给ss和sP,ss中还要加入起始段值;把PSP的段值置给DS和s(一般它低于起始段值100h个字节);把1417h中的值分别置给IP和Cs,当然,Cs中也同时要加上起始段值.至此,就完成了EXE文件的全部装入,再定位,传送控制执行过程.从以上过程的分析可以知道,EXE的内存映象实际上只是文件中被调整修改过一些浮动地址的装载模块,而文件中的标题部份的256个字节内容在装入完成与执行时已无用处,故在用户内存中是找不到踪影的,事实上,它只是被读jXDOS/2作区中使用过而已.这也就是为什么不能直接用debug把带EXE后缀的文件写

16、回盘去的主要原因.四,EXE瓢COM的转换回顾第一节的比较和上节我们已知:道,装执行cOM文件比之EXE文件简单,容易,快速,节约时空特别是盘空间,故我们常为了提高时空效率而希望把某些EXE文件转化为COM文件来使用.但是,这种转化是有条件的,即并非任何一个不遵循一定编程规而产生的EXE文件都能被自动地(用EXE2BIN程序)或人工地(用DEBUG2E具)转换为可正常执行的COM文件.这些必要条件可归结为;(1),程序只含一个段(不超过64K)(2),程序分段无需再作再定位调整(再定位项数为0)(3),无堆栈段定义或只定义空栈(4),IP初值为100h为满足以上条件而建议采取的汇编模式之一如下

17、:StackSEGMENTPARASTACK:此空栈定义也可省略,StackENDS;1_LINK时会出现无栈之警告;与错误信息,不必理会.CodeSEGMENTPARAPUBLICORG100hASSUMECS:Code,DS:Code,SS:StackStart:iCodeENDSENDStart并且程序中不要苒定义别的段,且不把段偏移值在程序中设定(传给)有关段寄存器(从面保证无再定位项项数为0)按此模式编写并通过编译一连接而成的EXE文件就是一个可用以下两种方法顺利转化为COM文件的程序了;61,自动用DOS的EXE2BIN外部命令(程序)如下自动完成:>EXE2BIN<E

18、XE文件名><欲换成的COM文件全名>J现仅以一简单例程的实现全过程为例;C>TYPECODESTARTlINFOCoDEE-CTEST.ASMSEGMNTORGASSUMEMoVMoVINTINTDBGGodENDSEND100hCS:CODE,DS:CODEDX,OFFSETINFOAH.0g21h20hmorning!,10,13,$STARTC>MASME-CTEST,;MicroSoft(R)MacroAssemblerVersion4.00Copyright(C)MicrosoftCorp1981,198B,1984,1985.Allrightsres

19、ered.49908Bytessymbolspacefree0WarningErrors0Ses,ereErrorsC>TLNKE-CTEST,:Microsoft(R)8086ObjectLinkerVersion3.05Copyright(C)MicrosoftCorp1983,1984,1985.Allrightsreserved.WarningJ20stacksegmentC>EXE2BINE-CTESTE-CTEST.COM,JC>DELE-CTEST.EXE)C>E-CTESTJGoodinOrningl2人工续上例,用DEBUG按I下步骤实现:C>R

20、ENAMEE-CTEST.EXEE-CTEST.c>DEBUGE-CTEST一NE-CTEST.COMJu400407J1E8l:0400BA09011E81:0403B4091E81l0405CD211E81t0407CD20D40041FM0VDX.01OgM0VAH.09INT21INT2O1E81:0400BAO901B409CD21CD一20476F6F64206D6F:4M!MGoodmoE81:04lO726E696E67202l0A0D240BF674230BFFrning!.$一M40041At0oju100lO71E8l0100BA090lMOVDX.01091E8l

21、0103B4O9MOVAH.091E81:0105CD2lINT21IE8I0107CD20INT20一D100llFrf1E8l:0100BA090lB409CD2lCD一20476F6F64206D6F:.4.M!MGoodmo1E8l:0llO726E696E6720210A一0D240B000l0OOO00rning!.S.RCXJCX03IA:lARBXBX0000:一WWriting00IAbytesQJC>E-CTESTJGoodmorningC>DIRE-CTEST.COMj8VolumeindriveChasnohbelDircctofyOfCtECTESTCOM

22、26l-0I-80l.49a1File(s)7774208bytesfree可见转换后的COM程序比EXE程序无论在占盘空间还是在装入速度上的效率都提高了.五,EXE文件的调试修改有了以上各节的分析,我们现在已可转到如何用DEBUG直接对EXE文件进行改造的重要课题了.1,只对EXE中的某些数据.常数或代码进行不增加长度的简单,局部的修改.譬如经调试分析后欲对某些显示信息进行修改,汉化,或对某条指令进行段内(不设定,存取别的段值)的简单修改,局部性改善(不涉及全局即别的段间).一般步骤是:(1)>DEBUGSAMPLE.EXEJ进入后用debug的s.D,UT,G等命令反复分析跟踪调试找

23、到欲修改的数据或指奄串.并记下来(2).>RENAMESAMPLEEXESAMPLE(3).>DEBUGSAMPLEJ进入后用debug的S,U,D等命令找到步(1)中所确定的数据或指令串的段.偏移地址.(4).用debug的E,F或A命夸进行所希望的修改(注意不要改变原机器码的长度数据可用空格填补或用00h,24h,0Ah,0Dh来结束或回车换行,视情况而定:指令可用NOP来填充).(5),用debug的w,Q命令写盘退出.(6),>RENAMESAMPLESAMPLE.EXE)后>SAMPLE.执行之,看是否达到预期效果,否则转(1)继续.注意,以上修改过程并未触及

24、文件标题参数信息,仅只是对装载模块的局部内容直接简单修改,且不增加文件装载模块的大小,这是一般常用DEBUGZK作的用户比较熟悉的.2,对EXE进行改变文件装载模块大小的改进,侧如增补一段数据或不涉及浮动字段址的程序代码.因为这种修改改变了文件的装入长度,故不仅在用w命令写盘前应用R命令改变CX(也许还有BX)中文件所占字节数以便存入改变了大小的文件外,更重要的是还必须对标题信息区中有关文件大小的参数进行修改.否则新增补的文件也不能被COMMAND正确装入运行.具体步骤为:(1)一(3)同l中(1)一(3)步.(4).用debug的A,E或F命夸在原装载模块空区(注意最好不在运行时可能被其他代

25、码或数据所复盖的缓冲工作区内进行)加入新的程序块(包括指令或数据均可),并修改某些原指令代码或地址以便正常使用调用或控制能传到新增程序段中执行.(5),用下述公式笔算出新的刻划文件大小的页数及剩余字节数;9新文件共占字节总数f+512的寨妄主着里繁区中的剩余字节数其中f可用CX中的原文件大小(可能外J0BX中的高16垃)加上新增添的程序块鲫犬小得到.当然应把16进制值先转换为十进值计算后再表成l6进制值.(6)用debug的E命令将16进表示的r,q值分别改入标题信息区第34字节和第56字节.即当前的01O2一们O3单元和01O4一O105单元中.注意其高八位在后.低八位在前(反字).(7),

26、用RCX(或许还有BX)命令修改原文件所占字节数为新字节数的I6进表示.(8)一(9),同I中之(5)一(6)步.3,对EXE进行涉及别的段值需再定位的修改增补,这种修改除按l,2中各步来做外.还可能要修改标题信息区中的再定位表顼,譬如新增补的程序块中有设定(改变)一个新的段地址值的有关指令则要在程序中增加一个再定位项,这就需要在原再定位表项之柬新增占4个字节的一再定位项,并修改OlO6一O107单元中的项数.此再定位项的前两字节中应放入它指向的浮动字的偏移地址,而后两个字节中应放入该浮动字的装入段值减去起始段值后的相对段址,这就要用到在步(1)中记下来的有关数值了(特别是用R命令看到的一些寄

27、存器值).例如.起始段值=PSP段值+00IOh,PSP段值正是刚进入时的Ds或Es值.加OO1岫于段值上相当于往高处浮动100h个单元作起始段址,这恰是PSP的大小.详见六中实例.六,实倒为加深对以上各节所阐述内容的理解,现给出欲对某加密程序Prolok.EXE分析改造的一些有关操作实例,该例仅只是说明性的,聪明的读者当可如法按自己的所需对各种EXE程序进行各种不同目的的改进泡制.(见图4)从R命令列出的各寄存器中,我们可看JCOMMAND已按LINK填入的.EXE文件的标题初始化信息区中各参数与再定位表中各指针完成装入后的初始状况,即:装载模块内存映象大小占CX=8400h个字节.栈指针S

28、P=1000,PSP段址为DS=ES=IE95,并由此可算出起始段址=tEA5.栈段地址SS=2760,程序入口点cs;IP为lEA5t2BE5下面一行的地址和代码正好给出入口处第一条指令为MOVDI,22CC.接着,用D命令列出的是占256(100h)/卜字节的PSP的内容,回忆第三节开头所述,其中OO一01中是INT20的机器码CD20,O203中的7FC0是可用内存顶部(当前最大内存区段址),5O一52中为INT21和RETF的机器码,8O一8C中是命令行PROLOK.ExEJ等等.PSP后面紧跟着的就是装入模块的内存映象了(用DIOOJ列出),包括各种指令,数据,栈等等.接着用u命令列

29、出的是入口部份的开头几条指令,由其反汇编内容可知它们是检测从浮动段址22CC向上方是否还有64K的内存可用空间从而作不同处理.在EXE的内存映象中是找不到标题信息区踪影的,电是不能用w命令写盘的,读者可用s,w命令一试:但却可以发各种DEBUG命令进行修改调试,跟踪执行工作.那么,怎样才能看到标题区及修改存盘呢请看下面:(见圜5)iOD睫强蔚pLOK,Denter】-R【enter3OBx=o0O0CX:8480Dx=0口00Sp=-lO00BP=0000S【:0000Dl=0000Ds.1日5Es:i四5SS=2760CS=lE5IP=28瞄UPDIpl_NAP0NclE5:2BBYCC22

30、H0VDI,22CCD0阡fenterj!瞪5:cD20co7FOOeA鼬FF-0D鼬艘0277l27002M觐.p.pRp.1四5:00lO77l2E204盯O977l2-0l03010002FFFFFTb.j四5:G020阡FFFFFFFFFF_FFl下FF!=F79l5C82AY.l四5:G03077l200000000-000000O000O0.iE95:O0O00o00O00000-0000000O00000000.l四5:0050CD2jCB0000000000-0000000000202020l四5:OO20202rJ2020202020咱000口0202020.1四5:0070

31、2020202020202020-o00000OO000000.15:0980000D5052胛托4B_2E毒55845200D0000.PROLOExEi四5:09000G000C000000O0000O0000000000.i礴5:AoOOG0OO6000-0000000000000000.1E95:08B.0000C0O0鼢0000-0000O000O0000000.1E95:OBc.000000000000000000000000000000口0.15:O0D.000600OG00000-0000000000000000.iE95:00融00O0O000-00000000O000OOO

32、O.i瞄5:F9o0O00O0000000O00000D口000.一D100(enterl嘶:0l0.000o008Ci5558B_Ec鼹i000EB8026c5U18.h.F5:町l046FEoo醴Bc18船7E_4】F7067E4l们O475Fh<.#咄.uiE95:Ol2016.F7067E414074-07C606650lOiEB0C.一A甩t.e.k.1E95:0130CB06660l们髓05C6-0664们OlB8984550fkd.8.CPUfenter】一D1O0(entmDlOOctzif-Di00(enterlDiO0enterJDlOOentcrJDlO0entel

33、EA5:2BE5BF19lEA5:2B8B560.001Ei5:2BEc2脚l68C2BZE8lFED叭0l58C2BF27-03l58C2B唧0l01Ei5:2BF7FAlEA5:2B8ED7lEA5:2髓8lC45E49lEA5:2B疆F8lEA5:2B7303lEA5:2c0l豳490ll58C2C048lFEFF?D啊,22CCSI,【000.】S【,DlS【,l0002BF7sl,1000SS啊Sp.495E2c042D4DSR开iFE皿叫脚E亏姗册c>嘣EpR0L0kExERIOc>D匝【】GpR0LoK【enter】一R【enter】AX=O000B)0000CX=8

34、600Ds=lE81酷=1E8lSS=1E8IlE8l:01004DDEc-I10FF【enter】Dx=0000,匝BP-41000SI=0000D【1000cS=1E8l=0100NvUpDIpLN阳NCBPlE8l:0000CD20C07F009A疆FE.ID420277I27002l曙l:00l077l2晓049F099F09-0l05010002FFFFFFIE8l:0020FFFFFFFFFFFFFFFF-FFFFFFFF680ACA2lE8I:003077l2000000000000-0000000000000000lE8l:00000000口000000000-00000000

35、00000000lE8l:0050CD21CB0000000000-0000000000202020lE8l:00602020202J20202020-00000000002020201EBI:f10702020202020202020-00000000000000口01礴l:0080000D50524F4C4F4B_0D000000000000001E8I:00900000000000000000-00000000000000口01E8I:00A00000000000000000-00000000000000001E8l:00即00口0口00000000000-000000000000000

36、01E8l:00C00000000000000000-00000000000000001E8l:00D0000000000000000000000000O00000001E8l:00印00口0000000000000-00000000000000001E8l:00F00000000000000000-00000000000O0000一D1002FF【enter】1曙l:010041)5A02口l躬000600-20008A01FFFFBB08lE8l:叭1000109A6EF.52B0000-1E00000001000400IE8I:01200000A4250000B40F_2C04BB2B0

37、000c92FIE8l:叭500000lBS000000000-0000000000000000IE8l:01000000口000000000-00000000000000001E8I:叭5000口0000000000000-o0000000000000001E8l:01600000000000000000-0000000000000000IE8l:02即000000IE8l:02C000000OIE8l:02D0000000IE8l:D2印000000IE8l:D2F0000000一U2EE5IE8l:2匝5BF2704IEBl:2EE8813360200IE8l:2EEc2BF7IE8l:

38、2眦81F印010IE8l:2眦7203IE81:2EF4B印0l0lE81:2EF7FAlE81:2E8唧lE81:2EFA8lC43E491E8l:2EFEFB1E8l:2EFF7303lE8l:2FD1E949口llE8l:2FD48lE4阿FQ.0427SI.【00f12SI.DISI.10002EF7SI.1000ss,DISP.493E2FD4S04DSF屯H邑.np&p.b.h.J冒.PR0L0吼忆.C.ne十.$X.4.0枷咖枷枷枷肿忡肿与前对照,R命令列出的各寄存器中现已是COMMAND装入.COM文件后的初卷(这便是换名调试的作用),即装入内存映象大小Cx=8600

39、h,已将标题大d200h包括在内;DS=ES=sS=CS=1E8l为PSP段地址;栈指针SP,CS,1P等均为EOS设定的常值.接着用DOVE.)看到的是与原先列EXE类似的100h大小的PSP.后面用D1002FF.;歹n出的就是占5I2(200h)个字节的整个标题信息医内容了对照第二节所述,10O101单元中为LINK签字45A;l02一l05中是最后一页的剩余字节数0102h和总页数(包括最后一页)0043h,它们给出原文件的准确大小(包括标题在内)为34o5od字节(它一般应与BX,CX中的盘文件大小一致);106一l07单元的ooo6N是后面的再定位表项数;lO8一l09中的0020

40、h说明标题大小是32I6=5l2(或20h10h=200h)字节;10A一1OD中的O18A和FFFF分别为装载模块在其内存映象尾部以上还要求的最小和最大空间节数(16字节/每节)前者与栈的设置有关.IOElIl中08BB和1000分别为ss的初始相对段值和sP的值;1l2一3中是作校验用的所有字的负和6E9A;人口地址的cs初始相对段值0000和IP指针值2BE5由1l4一Il5单元中给出;而1l8119中001E指出再定位表从11E处开始,其中六个表项分别为指向六处浮动字的指针.000,o,0004,0000;25A4,042C;0FB4,0000:301B.再下而直至2FF单元韵O0值是

41、该再定位表的空余部分.下面,我们就可利用这些参数(并结台前面曾记下来的当前环境下的起始段址)来观察(或修改)EXE文件中的装载模块本身了.首先,我们来看一下程序入口在哪里?从标题中已知cstIP为0000;2BE5,因此,用U2EE5)(2EE5=2BE5+300h,300h是PSP和标题所占去的大小)命令即可看到在直接调试EXE文件中相应看到的入口处那几条检测指令.请特别注意,这里唯有第一条指令是MOVDI,e427而不是那里的MOVDI,22CC,这正是第三节中曾详述的再定位表项的再定位作用所致,我们可用人工模拟这一过程如下;查位于l2Al2D中的第四个再定位项是00O0:2BE6,它正好

42、指向装载模块中的浮动字0427(当前情况下其真实物理地址则是1E8】;2EE6),故经装入过程调整后的该字值应是0427十lEA5=22(2C,因此COMMAND装入并执,EXE的内存映象时的真正代码是lEA5:2BE5处的MOVDI,22CC指夸至于0427为什么是一个浮动字,则可以从后面的指令MOVSS,DI得到解释一它是一个欲放/kSS的新段值(因程序的某种需要而设定).同理,请看下一个再定位项0000;2FC9=>1E8132C9(仍指向浮动字0427)ExE申的lEA5,2FC9的字22CC及前后的指令的对照就更清楚什/厶是再定位了在DEBUGPROLOKEXE中;一U1EA5

43、2FC5IEA5i2FC5gCDAEA52FC781FACC22tEA5I2FCB7405lEA5?cD弱MoVCMPJZEs;DX.DSDX,22CC2FD21EA5?2FCE8CIEA6I1lEA5I2FD2897F02IEA52FD5C3IEA52FD626eMOVMOVRETES(IIA6,DS(BX+02,DI在DEBUGPROLOK中:一U32C5L10IE8I:32C58CDAMOVDX.DSIE8II32C781FA2704CMPDX.0427IE8I:32CB7405TZ32D21E81t32CD26ES:IE81I32CE8CIEA61IMOVI1A6).DSIE81I32

44、D2897F02MOVBX+02).DI注意:22CC=0427+1EA5最后,我们给出第五节中讨论到的第3种修改的一个举例作为全文的结束:假定,我们要在Ptolok.exe中经调试后加入约4K的一段程序,使文件总长度为42242d字节(譬如),并且,加入的程亭块中含有譬如下面的几条指令-PUSHDSPUSHAXMOVAX,8600;在汇编源程序中一般相当于MOVAX,DATAn-SEGM0VDS.AX并设其中代码0086的地址为IE81t92IA(譬如).则我们既要改标题区中的lO2105单元中的文件大小参数,又要修改再定位表,才能使新的EXE文件能被COMMAND正确装入执行.具体过程是:先计算42242512得商82余258,敞用命令E10453

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号