一、COM文件结构及原理

   COM 文件比较简单,COM文件包含程序的一个绝对映象――就是说,为了运行程序准确的处理器指令和内存中的数据,MS-DOS通过直接把该映象从文件拷贝到内存而加载COM程序,它不作任何改变。为加载一个COM程序,MS-DOS首先试图分配内存,因为COM程序必须位于一个64K的段中,所以COM文件的大小不能超过6527865536减去用于PSP(程序段前缀)的256字节和用于一个起始堆栈的至少2字节)。如果MS-DOS不能为程序、一个PSP、一个起始堆栈分配足够内存,分配尝试失败。否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使COM程序本身不能大于64K。在试图运行另一个程序或分配另外的内存之前,大部分COM程序释放任何不需要的内存。分配内存后,MS-DOS在该内存的头256字节建立一个PSP,如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL00h,否则为0FFhMS-DOS还置AH00h0FFh,这依赖于第二个FCB是否含有一个有效驱动器标识符。建造PSP后,MS-DOSPSP后立即开始(偏移100h)加载COM文件,它置CSSSDSESPSP的段地址,接着创建一个堆栈。为创建一个堆栈,MS-DOSSP0000h,若已分配了至少64K内存;否则,它置寄存器为比所分配的字节总数大2的值。最后,它把0000h推进栈(这是为了保证与在早期MS-DOS版本上设计的程序的兼容性)。MS-DOS通过把控制传递给偏移100h处的指令而启动程序。程序设计者必须保证COM文件的第一条指令是程序的入口点。注意,因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于100h。汇编语言程序设计者可通过置程序的初值为100h而保证这一点(例如通过在原程序的开始使用语句org 100h)。

 

   二、MZ文件(DOS下的EXE文件)结构

   MZ文件比较复杂,每个MZ文件都有一个文件头,结构如下:

MZ头的结构

位移

含义

MZSignature

00H---01H

MZ”或“ZM”,MZ文件标志

MZExraBytes

02H---03H

文件最后一页的大小(文件长除以512的余数)

MZPages

04H---05H

文件所占用的页数(每页为512字节)

MZRelocItems

06H---07H

重定位项的个数

MZHeaderSize

08H---09H

以节为单位(1=16字节)的MZ文件头的大小

MZMinAlloc

0AH--0BH

程序运行所需的额外内存的需最小节数

MZMaxAlloc

0CH--0DH

程序运行所需的额外内存的需最大节数

MZInitSS

0EH--0FH

程序堆栈区相对于MZ头结尾处的段位移(SS

MZInitSP

10H---11H

程序加载时的栈顶位移(SP

MZChechSum

12H---13H

文件的补码校验和,一般未用,通常为0

MZInitIP

14H---15H

程序运行的第一条指令的位移(IP

MZInitCS

16H---17H

程序运行的第一条指令相对于MZ头结尾处的段位移(CS

MZRelocTable

18H---19H

重定位表相对于文件首的偏移

 

   MZ文件包含一个MZ文件头和一个可重定位程序映象。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映象中可重定位段地址的指针链表。程序映象包含处理器代码和程序的初始数据,紧接在文件头之后。它的大小以字节为单位,等于MZ文件的大小减去文件头的大小,也等于MZHeaderSize的域的值乘以10HMS-DOS通过把该映象直接从文件拷贝到内存加载MZ程序然后调整定位表中说明的可重定位段地址。重定位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址。文件头中的MZRelocItems域说明了数组中重定位的项数,MZRelocTable域说明了分配表相对于文件首的偏移量。每个重定位指针由两个16位值组成:偏移量和段值。

   为加载MZ程序,MS-DOS首先读文件头以确定MZ标志并计算程序映象的大小。然后它试图申请内存。首先,它计算程序映象文件的大小加上PSP的大小再加上MZMinAlloc域说明的内存大小这三者之和,如果总和超过最大可用内存块的大小。则MS-DOS停止加载程序并返回一个出错值。否则,它计算程序映象的大小加上PSP的大小再加上MZMaxAlloc域说明的内存大小之和,如果第二个总和小于最大可用内存块的大小,则MS-DOS 分配计算得到的内存量。否则,它分配最大可用内存块。分配完内存后,MS-DOS确定段地址,也称为起始段地址,MS-DOS从此处加载程序映象。如果MZMinAlloc域和MZMaxAlloc域中的值都为零,则MS-DOS把映象尽可能地加载到内存最高端。否则,它把映象加载到紧挨着PSP域之上。接下来,MS-DOS读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表中的每个指针,MS-DOS寻找程序映象中相应的可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。 MS-DOS在所分配内存的最低部分建造256字节的PSP,把ALAH设置为加载 COM程序时所设置的值。MS-DOS使用文件头中的值设置SPSS,调整SS初始值,把起始地址加到它之上。MS-DOS还把ESDS设置为PSP的段地址。最后,MS-DOS从程序文件头读取CSIP的初始值,把起始段地址加到CS 上,从CSIP处开始执行程序。

 

   三、系统引导过程

   硬盘有两个引导区,在001扇区的称为主引导区(MBR),内有主引导程序和分区表,主引导程序查找激活分区,激活分区的第一个扇区即为操作系统的引导程序。软盘只有一个操作系统引导区,只要软盘做了格式化,就会存在。其作用为查找盘上有无IO.SYSDOS.SYS,若有则引导,若无则显示“NOSYSTEM DISK...”等信息。绝大多数病毒感染硬盘主引导扇区和软盘DOS引导扇区。

   硬盘主引导记录程序的功能是读出自举分区的BOOT程序,并把控制转移到分区BOOT程序,再由BOOT程序负责引导操作系统。整个程序流程如下:
    1.将本来由BIOS从硬盘装入到07C00H处的硬盘主引导记录程序移至0600H处;
   
2.顺序读入四个分区表的自举标志,以找出自举分区,若找不到,转而执行INT18HBOOT异常执行中断程序;
    3.找到自举分区后,检测该分区的系统标志,若为32FAT表或16FAT表但支持13号中断的扩展功能,就转到执行13号中断的41号功能调用进行安装检验,检验成功,就执行42号扩展读功能调用把BOOT区程序读入到内存07C00H处,成功,跳到第5步,若读失败或系统标志为其它,就调用13号中断的读扇区功能调用把BOOT读到07C00H
   
4.13号中断的读扇区功能时,用两种方式分别进行5次试读。第一种方式是直接从自举分区的头扇区读入BOOT程序,若读成功,但结束标志不是55AA,则改用第二种方式,又如果用第一种方式试读五次均不成功,就改用第二种方式。若两种方式试读均失败,就转到出错处理程序;
    5.读入BOOT区程序成功,转至07C00H处执行BOOT程序。

   注:主引导记录的内容可由用下面的方法得到:
    debug
    a 100
    mov ax, 0201
    mov dx, 0080
    mov cx, 0001
    mov bx, 0200
    int 13
    int 20
   
    g
    n mainboot.com
    rcx
    200
    w 200
    q

    操作系统的引导程序可由下面的方法得到:
    debug
    L 100 2 0 1
    n dosboot.com
    rcx
    200
    w
    q

   附一:PSPProgram SegmentPrefix,程序段前缀)结构

偏移

大小(Byte

 

0000h

02

中断20H

0002h

02

以节计算的内存大小(利用这个可看出是否感染引导型病毒)

0004h

01

保留

0005h

05

DOS的长调用

000Ah

02

INT 22H 入口 IP

000Ch

02

INT 22H 入口 CS

000Eh

02

INT 23H 入口 IP

0010h

02

INT 23H 入口 CS

0012h

02

INT 24H 入口 IP

0014h

02

INT 24H 入口 CS

0016h

02

父进程的PSP段值(可测知是否被跟踪)

0018h

14

存放20SOFT

002Ch

02

环境块段地址(从中可获知执行的程序名)

002Eh

04

存放用户栈地址指针

0032h

1E

保留

0050h

03

DOS调用(INT 21H / RETF

0053h

02

保留

0055h

07

扩展的FCB

005Ch

10

格式化的FCB1

006Ch

10

格式化的FCB2

007Ch

04

保留

0080h

80

命令行参数长度

0081h

127

命令行参数

    附二 DOS内存控制块(MCB)的结构

Z:最后一块

所有者的PSP,为0表示空闲块

内存块的节数

保留

所有者的名称

M’或‘Z

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

















 



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=57319


[点击此处收藏本文]  发表于2004年08月02日 11:30 AM




正在读取评论……
添加评论
大名
网址


验证码
评论