【doc】EXE文件的修改与空间扩展

EXE文件修改与空间扩展
鬣电千学与计算机9s年第1轴
EXE文件的修改与空间扩展●_●●_●-_●_●●__
顾景文徐佩珍
(同济大学.上海)
摘要
本文舟鲳了咝毫拦的修改秘充中所必然
要遇到的问题,即确定实际修改地址以及直接扩展
文件空问拇霹的解决方法.已用遗一方法成功地汉
化了一十轼件,证宴了方法的可靠性和有技性
ExE文件是££盆Q§和量2Q§下用汇
编语言或其它高级语言编写的程序经汇编或编
译,并在连接以后产生的可直接执行的二进制代
码文件沱的执行效率高1但可读性和可理解性差
因此,在无源程序可供利用而不得不对这种文
件进行修改或扩充(如软件有错误)吨其难
度较大由于在ExE文件中,代码区,数据
区和栈区的安{{卜搬都比铰紧凑.所以,当文
件原有的空问不足以满足修改或扩充的需要而
必须扩展其容量时,工作量就更大更复杂.这
样的软件,特别是软件,目前还很少见到
介绍.根据不同的原文件和不同的目的要求.
空问的扩展可以采取不同的方法实现即可以
直接扩展,也可以利用软中断功能调用等手段
间接扩展
,£X£文僻的结构与格式化区
EXE文件由文件首部和装入模块两部分
组成装入模块位于文件首都之后.是程序的
本体即运行部分,它实际上是i丽里序的执行代码赫.文件首耀系躺装入模块之间的界
面,它由—个有L4项共嚣个字节(每项2个字节)的格式化区和一个f刮妾的含有若干项的重定位表组成c它集中了系统对文件进行操作的控制信息,系统根据其中各项的内容,确定程
序本体的长度.对程序中各重定位项进行处理, 并决定指令段,堆栈段寄存器与指令指针,堆
栈指针的值.以保证可浮动的程序代码在装入内存后能获得正确麴控制流程关于文件首部'车l螂8年6揖牧到
中各项内容的具体含义及文件装入过程可参阅".这里仅指出格式化区中与所述的文
件修改,扩充密切相关的项及含义:
第项.指出了以512字节为一页单位的
文件的总页数,当将文件扩展了若干页以后必须对该项内容作相应的更改:
第4项,它指明了重定位表中所含的重定
位项数当扩充的程序增加了重定位项后必须对该项内容作相应的修改:
第5项.以l6字节为一节指出了文件首都
的长蛮节数.由它可确定装入模块的起始处.
它对本文中所述的空间扩展至为重要:
第8粕第】2项.分别给出了程序中的堆栈
段和代码段的段偏移量;
第l项的内容表示重定位表在文件首部中
的起始地址偏移量,重定位表中的重定位项信
息是连续存放的,每个定位项含4个字节.以
偏移值l段值目指针形式指明了程序在装入对必须进行定位操作的一个目标地址.龇.从
该项与第4顼内容可以算出表中最后一个重定位项的地址.以便在其骨增加固程序的修改和
扩充所可能带聋自新增重定位操作的重定位指针:
二,文件的修改与空间扩展
计算机系统提供的动态调试程序0EBUG
是目前可用于修改EXE文件的主要工具对
于未曾更改过扩展名的ExE文件.DEBUG
实际装入的只是其经过重定位处理的装入模块, 在这种情况下,只能对程序进行跟踪调试,不
能修改.对于已更改了ExE扩展名的文件, DEBUG装入的是包含了文件酋部和装入模埭的整个原始文件在这种情况下.不能进行跟踪
调试.但可匕上进行修改和扩充.下面我们将把前一
种工作方式称为EXE文件的"调试方式".
再一种方式称为"修改方式".由此可知.要
9目q年幕,期髓电学与{t瓤
实现一个ExE文件的修改和扩充,必须经过
这两个阶鼠
(I)在调试方式下确定修改和扩充的相对
地址
(2>;在修改方式下进行修改,扩充a
下面将分别讨沦这二阶段的实现步骤a
1相对修改地址的确定
(i)以调试文件为参数启动DEBUG后,
用R命令显示并记下段寄存器CS的初始值lc 供以后计算相对地址用;
(2)通过对程序的跟踪调试记录所有需要
修改扩充的指令的当'地址(当前段址
CC偏秽值CO).要注意,这一当前段址
与修改方式下对应指令的实际地址是不相同的, 具体修改中需要解决的—个主要问题就是这种实际地址的确定:
({)为了便于在第二阶段中确定实蕲的修
改地址,将当前段址换算成相对段址RC:
RC=CC-IC
2.修改和空问扩展的实现
1)实际修改地址舶确定在修改方式下
启动DEBUG后,DEBUG将段寄存器CS,, DSES和SS同置为最低可用的内存区地
址,把欲咎改的文件装入偏移量从100开始的
内存单元,即格式化区的起始地址为cs:0l∞.
由于装入模块紧接在文件首部之后,因此,由
格式化区第5项内容(即文件首部的长度值L) 和第l2项内容(即代码段偏移量OC)可以算
出与上节中初始值Ic对应的修改方式下的起
始段值Sc:
SC=(CS]~-0010J|L+OC
这里[CS]表示段寄存器cs的内容,由此可
算出实际修改段址AC
AC:RC+sc
于是,实际的修改地址为AC:CO,随即可以
进行修改.
2)空间的扩展本文所介绍的是一种操
作步骤似乎稍复杂,但是个十分可靠而有效的扩展方法,即把扩展的空间插在文件首部与装入模块之间,将装入模块后移若干单元,见图
I.这种扩展方法的优点是:
(1)不用担心原程序中对该部分空间的访
问操作.只要将原文件中与重定位操作有关的所有段址值统一增
加一卟与扩展的空
间量等价的偏移量
即可;
(2)地址确定
简便,凡涉及将控习I文件的扩展
制和指针转(指)向该部分空fl珀自段问操作指令和操作数可简单地采用如CALL(JMP) 0∞0:×××x的形式等,无需进行段址计算. 具体的扩展步骤是:
(1)以5l2字节为一块单位确定欲扩醺的
空间总块数n,用^命令将原装入模块焉移n* 512字节,装入模的初始起址为[CS]+
O0l0+L(即SC—oC);
(2)将重定位表项中的重定位指针及其指
向的程序目标单元和格式化区中第8,第12硕的内容先后增加相应的字节数偏眵量(按段址值),以便保证在扩展空间后仍能保持原程序的正确葫濯.这一步可以在内存一空闲区汇
编一小段指令并加以执行而方便地完成.当然在执行之前必须记录各寄存器的初始值,以便在修结束时
恢复.图2所示为一个EXE文件

本文发布于:2024-09-21 04:21:33,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/91469.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:文件   修改   装入   定位   扩展   进行   程序   地址
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议