计算机病毒原理及防范技术-第2章 基础知识_第1页
计算机病毒原理及防范技术-第2章 基础知识_第2页
计算机病毒原理及防范技术-第2章 基础知识_第3页
计算机病毒原理及防范技术-第2章 基础知识_第4页
计算机病毒原理及防范技术-第2章 基础知识_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机病毒原理及防范技术,第1章 计算机病毒概述,2.4 计算机引导过程,2.3 汇编语言与程序接口,2.2 文件系统,2.1 磁盘结构与管理,2.5 COM和EXE文件结构,教学要求:,理解:有关计算机底层的最基本问题,计算机结构、汇编语言知识等在本课程学习中都会涉及的知识点 掌握:磁盘结构和分区,文件系统,汇编语言和接口的基础知识,启动过程,COM和EXE文件结构,2.1 磁盘结构与管理,计算机磁盘是计算机最重要的长期存储设备,其容量大、数据保存时间长,已经成为计算机不可或缺的基本组成设备。可以说,磁盘是当今计算机正常运行的保证之一。磁盘上记录着很多文件和数据,而计算机病毒正是瞄准了这些重要的地方,对磁盘进行入侵。可以这么说,如果不了解磁盘结构和管理工作,将根本无法抵抗病毒的攻击。,2.1 磁盘结构与管理(续),三参数概念 Cylinder(柱面):C表示磁盘的柱面数,亦即磁盘的每个盘面上有多少个磁道。其值最大为1023个(2101个),使用10位二进制数存储。 Head(磁头):H表示该硬盘中磁头的数量。其值最大为255个(281个),使用8位二进制数存储。 Sector(扇区):S表示每个磁道上扇区的数量。其值最大为63个(261个),使用6位二进制数存储。,2.1 磁盘结构与管理(续),典型硬盘拆解图,2.1 磁盘结构与管理(续),另一典型磁盘拆解图,2.1 磁盘结构与管理(续),磁盘分解示意图,同轴磁盘和柱面的关系,2.1 磁盘结构与管理(续),柱面、磁道和扇区,2.1 磁盘结构与管理(续),现代磁盘结构老式磁盘中,由于每个扇区都是512B,而忽略了扇区本身的长度,从而造成了很大的浪费。因此,现代新技术下的磁盘,都采取了等密度结构。也就是说,每个扇区,不论弧度是多少,其弧长都是一样,这样,外圈磁道的扇区数就要大于内圈磁道。这样一来,原有的三参数体系就被打破了,寻址方式也就成为了线性寻址方式,扇区成了寻址的单位。,2.1 磁盘结构与管理(续),基本INT 13H 调用和扩展INT 13H调用 基本INT 13H调用是针对三参数磁盘所提供的最基本磁盘输入输出功能的调用,包含读写、校验、定位、复位等功能。由于它是基于三参数的,所以只能支持最大不超过8GB的硬盘。 扩展1NT 13H调用是面向新型磁盘的。现代磁盘使用的是线性寻址方式。但是由于基本INT 13H的限制,使得在使用BIOS INT 13H接口程序,如MS-DOS时,还是只能访问最大8GB的磁盘空间。于是微软联合几家企业制定了扩展INT 13H标准,即所谓的Extended INT 13H,从而打破了这一限制。这一新标准就是采取线性方式寻址,并且还能支持移动硬盘等可移动介质。,2.1 磁盘结构与管理(续),主引导扇区(Boot Sector)是硬盘的第一个扇区(0柱面0磁道1扇区)。它由三部分组成。 主引导记录(Main Boot Record,MBR):主引导程序所在地,占用引导扇区的前446B(00x1bdh),负责从活动分区中加载操作系统引导程序。 硬盘分区表(Disk Partition Table,DPT):存放磁盘基本分区信息,共64B(0x1beh0x1fdh)。该分区表分为4个分区项,各16B,每个分区项用以记录各主分区的信息。这就是为什么硬盘中只能有至多4个主分区的原因。 引导扇区标记(Boot Record ID):用以标定引导扇区是否合法,如果其内容等于0xAA55则表明引导扇区合法。其位置在0x1FEH和0x1FFH,共2B。,2.1 磁盘结构与管理(续),分区表的结构说明: State:分区状态,占用一个字节,用来标定该分区是否被激活,其中:0=未激活;0x80=激活。 StartHead:分区起始磁头号,占用一个字节。 StartSC:分区起始扇区号和柱面号,占用两个字节,其中:低字节的低6位用来记录扇区号,低字节的高两位为柱面号的第9、10两位,而高字节为柱面号的低8位。希望读者一定注意。 Type:分区类型记录,占用一个字节。这一个字节不同的二进制组合代表不同的分区类型,如0x06为FAT16。本书后附录2中有详细记录,供读者参考。需要注意的是,如果该字节中为全0,则表明该分区未被使用。 EndHead:分区结束磁头号,占用一个字节。 EndSC:分区结束扇区号和柱面号,占用两个字节,其中,低字节的低6位用来记录扇区号,低字节的高两位为柱面号的第9、10两位,而高字节为柱面号的低8位。这和StartSC的定义是完全一致的。 Relative:用于线性寻址方式下的分区相对扇区表,占用4B,如果对于基本分区则是绝对地址。 Sectors:记录该分区所占用的总扇区数,占用4B。,2.1 磁盘结构与管理(续),扩展分区的特点: 在主分区表中,必须存放一个基本扩展分区项,用以存放后面所有的扩展分区的信息。 在基本扩展分区外的其余所有扩展分区以链表的形式存放,且后一个扩展分区的数据项存放在前一个扩展分区的分区表中,且没有两个扩展分区的空间是重合的。 扩展分区也有相应的类型(如上结构中的Type项),一般讨论的DOS/Windows操作系统中,扩展分区的类型定义为0x05。 扩展分区不能直接使用,而需要进一步分区;否则无法使用。在DOS/Windows操作系统中就是所谓的逻辑盘。 每个扩展分区中只能有一个其他分区,因此可以得出:一个扩展分区的分区表中最多只能有两个分区数据项,包括存放在本扩展分区第一扇区中的分区表项和链接到下一扩展分区的数据项。,2.2 文件系统,一台计算机的磁盘是不能直接使用的,还需要各种技术的支持。硬盘的作用是用来存放文件(File)和数据(Data)(其实对于底层物理硬盘而言,这两者实际上是没有区别的),就好像一个仓库一样。显然仓库中的物品是不能随意存放的,而应该是井井有条,既能让货物方便地存放进来,又能很高效、快捷地查找,取出需要的货物。磁盘上的文件存放也应该是这样。,2.2 文件系统(续),FAT一块硬盘是不能直接使用的,必须对它进行格式化。所谓的格式化,可以理解为对硬盘进行一定格式的划分,从而能规范文件的存储和提高硬盘的性能。FAT(File Allocation Table,文件分配表)是文件系统用以管理磁盘上文件各种信息的数据库,是一种供MS-DOS及其他Windows操作系统对文件进行组织与管理的文件系统。当用户使用FAT或FAT32文件系统对特定卷进行格式化时,由Windows所创建的一种数据结构,并将与文件相关的信息存入其中,以供日后获取文件时使用,这种数据结构就是FAT。,2.2 文件系统(续),簇和FAT32 在学习FAT32之前,有必要先学习一个概念:簇(Cluster)。如上所述,当硬盘被格式化后,就被划分成很多扇区,而FAT系统又会将若干个扇区合并成一个“簇”。当需要为文件分配存储空间时,系统就是以“簇”作为基本分配单位。在Windows操作系统中,簇被称为基本分配单元(Basic Allocation Unit)。一个簇所含有的扇区数必须是2的整数次幂。簇的大小是可以计算的:将磁盘的总容量除以64KB,大于所得数的最小的2的整数次幂就是一个簇的容量。如果再将这个容量除以512B,就得到了一个簇中所包含扇区的数量。 FAT32 是从早期的FAT经过改进得来的文件系统,与FAT相比,它能支持更小的簇以及更大的容量,从而能够在FAT32卷上更为高效地分配磁盘空间。下面将要就FAT16和FAT32做一个比较详细的比较。大家可以在这个比较过程中更加深刻地理解底层磁盘的工作原理。,2.2 文件系统(续),FAT16 和FAT32的比较最早的FAT文件系统是12位的。这里多少位是指FAT在保存文件信息时所使用的二进制位,以下的16位、32位等都是同样的含义。显然位数越少能记录的文件信息就越少。于是12位FAT就只能用在小容量磁盘上,如软盘。最早的DOS中DOS 1.0版本所使用的就是12位FAT。当计算机引入了硬盘这种海量存储设备后,12位的FAT就变得力不从心了,于是从DOS 2.0开始,FAT16就成了实际上的标准。,2.2 文件系统(续),FAT16很好地完成了当时所需的文件分配任务,对磁盘划分也十分适当,但是当硬盘容量飞速提高时,FAT16的弊端也开始显现,矛盾主要集中在以下两个方面: 首先,16位存储单位所能表征的最大值为65535(655361=65535),亦即只有65536个不同的二进制数(065535)。每一个二进制数对应一个扇区,则FAT16所能确定的最大磁盘容量就是65536512B=32MB。换句话说,使用FAT16的操作系统最多只能识别这么多个扇区,并对其编址和寻址。当20世纪80年代后期,硬盘的容量突破了这个“极限”后,FAT16就不能适应新的要求了。于是FAT32替代FAT16成为DOS 4.0及其以后的标准。 麻烦还不止这些,当一块硬盘的容量等于2GB时,由上可知一个簇大小为64KB,即65536B,可是FAT16只能识别到65535。这是个临界值,但很多早期的应用程序并没有意识到这个问题,而仍然按照64KB来编写文件,于是造成了文件存储的错误。显然,当硬盘容量大于2GB,这个问题会更加严重。 第二,FAT16中有一个磁盘参数列表(也就是一个记录磁盘参数的数据结构),其中有一个字节用来记录该磁盘中一个簇所具有的扇区的个数。由上所述,这个数必须是2的整数次幂。则一个字节所能表征的最大值为255,所以一个簇最多只能包含128个扇区,即64KB。而当硬盘容量较2GB翻倍后这个问题也会显现出来。当然,4GB硬盘使用FAT16会发生的错误是通过理论推知的,实际上不可能被看见,因为当硬盘在2GB时就已经不能使用FAT16了。,2.2 文件系统(续),NTFS的安全性要远大于FAT系列文件系统。这又体现在以下两个方面: 使用NTFS的分区,可以设置各种访问权限,如可以对文件夹、文件、网上共享资源等设置各种权限,也可以对用户或用户组设置各种权限,甚至可以精确地设置某一用户在某一资源上所具有的非常详细的权限列表。所谓的权限,有以下两方面的内容。首先,允许哪些组或哪些用户对哪些文件夹、文件、网络共享资源等进行访问;其次,获得访问许可的组或用户可以进行什么级别的访问,如某用户可以对某台局域网中的计算机上的某个文件进行读操作而不能修改、删除等。仅从这点看来,NTFS就比FAT32对文件夹或文件进行访问要安全得多。 NTFS下的审核策略能将这种安全隐患减到最低。在Windows 2000系统中使用了NTFS的分区,都能够应用审核策略,该机制能对文件夹、文件及活动目录对象进行审核,审核结果记录在安全日志中,通过安全日志就可以查看哪些组或用户对文件夹、文件或活动目录对象进行了什么级别的操作,从而发现系统可能面临的非法访问,以便采取相应的措施。通过这种方法可以将绝大多数的安全隐患扼杀在萌芽状态。而这正是FAT所不具备的一项重要安全功能,2.2 文件系统(续),NTFS的磁盘空间分配和回收基本单位也是簇,但是NTFS使用的簇更小,亦即对磁盘的划分更加细致,从而磁盘空间的利用率也更大,如下表,2.2 文件系统(续),NTFS格式还支持大硬盘,能满足日益增大的硬盘需求。NTFS可以支持的分区(在动态磁盘中则称为卷)最高为2TB(即21024GB),相比较Windows 2000中FAT32支持分区的大小最大为32GB,优势十分明显。,2.2 文件系统(续),NTFS文件系统还可以进行磁盘配额管理。所谓“磁盘配额”是指管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。同时,在设置了磁盘配额后,管理员可以对每一个用户的磁盘使用情况进行监测、记录及控制,监测功能可以标识出超过配额报警阈值和配额限制的用户,并帮助管理员采取相应的措施。有了这一利器,管理员就能方便地为用户分配存储资源,避免由于用户磁盘空间使用冲突而可能造成的系统崩溃,这点也提高了系统的安全性和稳定性。,2.2 文件系统(续),NTFS文件系统具有可恢复性。NTFS总是在维护一个标准的事务处理日志,在每一次涉及到文件系统结构的修改事务写入卷之前,该日志文件会进行记录。NTFS使用该处理日志,加上恢复技术来保证分区的一致性。发生系统失败事件时,NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。因此,使用NTFS的用户很少需要运行磁盘修复程序。 但是,尽管NTFS有日志及日志维护功能,但是它并不是一个日志系统(Journal File System,JFS)。这是因为NTFS只能恢复卷结构,而一个标准的JFS则能恢复文件。例如,VxFS格式有设置检查点功能,当一个用户需要更新一个硬件驱动时,VxFS会在更新前设置一个检查点,并且记录当前的文件,然后才更新驱动;一旦用户发现更新的驱动不能正常使用或是不符合要求,就可以使用VxFS的检查点来恢复更新前的驱动文件。这一点NTFS是做不到的。,2.2 文件系统(续),NTFS文件系统支持对分区、文件夹和文件的压缩。这就是说,任何基于Windows的应用程序对NTFS分区上的压缩文件进行读、写操作时都不需要相应的解压缩程序的帮助。当需要对该压缩文件进行读、写操作时,文件自动解压;反之,当对文件的访问结束时,NTFS又会自动对修改后的文件夹、文件等进行压缩。全部过程无需任何程序或人工的介入,完全是透明的。,2.2 文件系统(续),磁盘上的数据都是用0和1写成的,对于底层物理硬件,这些0和1的排列组合序列是没有任何区别的。但是必须明确的是,这些序列由于所处的位置不同会有不同的含义,或者说,其作用不同。普通情况下,磁盘上的数据可以分为以下5个区域,每个区域代表不同的作用: MBR区 DBR区 FAT区 DIR区 DATA区,2.2 文件系统(续),DBR区指操作系统引导记录区,一般位于磁盘的0磁道1柱面1扇区。它是操作系统可以直接访问的第一个扇区。它包括两部分: 引导程序:分辨其所在分区是否为操作系统所在分区,如果是,则将系统控制权交给它。简单来说,就是看本分区的文件目录的最前面两个文件是否为操作系统引导文件,如DOS中的IO.Sys和Msdos.sys。这部分内容在后面的“启动过程”处还要重点讲到,请读者注意。 BPB(Bios Parameter Block):本分区参数记录表。这是非常重要的一个区域,里面记录着其所在分区的各种重要参数,如起始和结束扇区、根目录大小、分配单元大小、FAT数等。,2.2 文件系统(续),簇具有独占性,即一个簇只能被一个文件使用。显然,这就必然会出现文件分割的问题。在磁盘上文件是以链的形式进行存储的,就好像将一个物体以某个大小为单位进行切割,然后存放在相应的格子里,最后不够一格的也要占据一格。格子和格子之间用链子前后挂起来,从而能保证物体的完整性。这就是FAT链的原理,如图:,2.2 文件系统(续),DIR区指根目录区。其所在位置紧贴FAT镜像之后,里面记录文件和文件夹存放的信息,如各个文件、文件夹的起始单元、文件属性等。如果要对一个文件或文件夹进行定位,只需要结合DIR区和FAT即可得知文件或文件夹在硬盘上的物理位置、大小等。 DATA区指数据区。这里才是存放一般意义上的“数据”的地方。,2.2 文件系统(续),一些需要特别说明和注意的地方: 各种格式化命令都可以格式化硬盘,但实际上是不能擦除硬盘DATA区所存放的数据的。它只是重建并初始化了FAT而已。换句话说,只要DATA区没有新的数据写入覆盖掉原有的文件所在簇,就可以通过手工方法将其找回。 主分区的概念很简单,就是硬盘最开始的一片区域,当然也可以通过技术手段改在别的地方,一般不提倡。主分区就是逻辑C盘,里面不能再次划分逻辑盘。 所谓扩展分区的存在是因为主引导扇区一共只能存储4个分区的数据,如果将逻辑磁盘概念等同于分区,则系统最多只允许4个逻辑磁盘,于是操作系统也只允许存储4个分区的信息。这在实际使用中显然是不够的。所以要引入扩展分区的概念。 可以将扩展分区看作一个指针,实际上它也并不是一个真正的分区。它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。从最初的一个扩展分区项的最后可以链接到下一个扩展分区,也就是实质上的下一个逻辑磁盘。如此一来,无论系统中有多少个逻辑磁盘,主引导扇区只需要保留第一个扩展分区参数即可找到它们全部。,2.3 汇编语言和接口基础,微型计算机简明结构:,2.3 汇编语言和接口基础(续),8086CPU结构示意图,2.3 汇编语言和接口基础(续),执行部件(Execution Unit,EU)的功能大致可以归结为以下3点: 一般顺序执行,EU不断地从指令队列中取指令连续执行,而省去访问存储器取指令的时间。 需要访问存储器取操作数时,EU将访问地址送给BIU后,等待操作数到来后才能继续操作。 遇到转移类指令时,要将指令队列中的后续指令作废,等待BIU重新从存储器取出目标地址中的指令代码进入指令队列后,EU才能继续执行指令。 总之,EU就是专门用来执行各条指令的地方。从图2.4可以看出,EU主要由算术逻辑单元(ALU)、标志寄存器、通用寄存器组和EU控制系统等部件组成。,2.3 汇编语言和接口基础(续),算术逻辑单元(ALU): 完成16位或8位的二进制运算。 16位暂存寄存器用来暂存参加运算的操作数。 运算结果通过内部总线送到通用寄存器组或BIU的内部寄存器中等待写入存储器。 经ALU运算后的结果特征置入标志寄存器中保存。 EU控制系统: 负责从BIU的指令队列中取指令,并对指令译码。 根据指令要求向EU内部各部件发出控制命令以完成各条指令的功能。,2.3 汇编语言和接口基础(续),总线接口部件(Bus Interface Unit,BIU)的主要功能也可以看作3点: 形成访问存储器的物理地址,负责与外部(存储器或I/O接口)打交道。 正常情况下,BIU通过地址加法器形成指令的物理地址,从给定存储器地址中取出指令代码送指令队列缓冲器中等待执行(指令队列缓冲器中出现一个空字节,BIU将自动进行读指令的操作填满队列)。 收到EU送来的操作数地址,BIU将立即形成操作数的物理地址,完成读、写操作数或运算结果功能。遇到转移类指令,BIU将指令队列缓冲器中的尚存指令作废,重新从存储器目标地址中取指令送指令缓冲器中。 总之,BIU的最重要的任务就是寻址将所需要处理的数据从辅助存储器找到并取出,放入CPU,或是将处理好的数据放回辅助存储器的相应位置。从图2.4来看,BIU由地址加法器、专用寄存器组、指令队列缓冲器和总线控制电路等部件组成。,2.3 汇编语言和接口基础(续),指令队列:用以存放6B的指令代码。一般情况下,指令队列中总是填满指令,使EU可不断地得到执行的指令。 16位地址加法器:专门用来完成由逻辑地址变换成物理地址的功能。实际上是进行一次地址加法,将两个16位的逻辑地址转换为20位的物理地址,以达到可寻址1MB的存储空间。 总线控制电路:将8086 CPU的内部总线与外部总线相连,是8086 CPU与外部交换数据的必经之路。包括16条数据总线、20条地址总线和若干条控制总线。 EU和BIU是相互之间独立工作的,也就是说它们可以同一时间做各自的任务,这样大大减少了等待取指令的时间,提高了微处理器的利用率和整个系统的执行速度。,2.3 汇编语言和接口基础(续),寄存器组结构,2.3 汇编语言和接口基础(续),8086 CPU引脚定义,2.3 汇编语言和接口基础(续),IP(Instruction Pointer)叫做指令指针寄存器,是BIU中一个十分特殊却又十分重要的寄存器,因为它永远存放的是下一次将要从主存储器中取出的指令的偏移地址,其中存放的数值就是该指令到其所在段的段首址的字节距离(注意,是以字节为单位!)。程序一旦运行,IP中的内容就是由计算机自己来设置,一般情况下程序是不能直接对其进行访问的,但是有一些指令能够却能办到,例如子程序调用指令。 FR(Flags Register)也有16位,但我们只使用其中的9位。这每一位都由其特定的含义,代表不同的计算机状态。程序每往前执行一步,计算机就根据执行结果自动刷新一次FR。我们不能直接对FR加以修改,但是却可以通过一些可预期结果的运算来达到对FR“置位”的目的。下图为FR:,2.3 汇编语言和接口基础(续),当前段在主存储器中的分配示例,2.3 汇编语言和接口基础(续),20位物理地址形成的过程,2.3 汇编语言和接口基础(续),寻址方式汇编语言的一条指令一般只有两大部分:指令和操作数。所以在汇编语言中一个极为重要的工作就是指明操作数的存放地或写入目的地。这种寻找操作数地址的方法就是所谓的寻址方式。一个程序员汇编语言的层次高低,在极大程度上是对其寻址能力的考核。基本使用的寻址方式有6种,必须完全熟练掌握应用。,2.3 汇编语言和接口基础(续),寄存器寻址 指令所指明的寄存器,就是操作数的存放地址。 格式:R 功能:寄存器R中的内容就是操作数。 说明:在寄存器寻址方式中,一个16位的操作数必须用AX、BX、CX、DX、SI、DI或BP中的一个来存储;而一个8位的操作数必须用AL、AH、BL、BH、CL、CH、DL或DH中的一个来存储。 由于寄存器是CPU的一部分,因此使用寄存器寻址可以提高整个运行速度和效率。尤其是累加器AX,若使用它来存放运算结果,则指令运行速度会更快一些。对于要经常存取的操作数,采用寄存器寻址。,2.3 汇编语言和接口基础(续),寄存器间接寻址方式 在寄存器间接寻址方式中,操作数放在存储器中,而操作数的EA在指令所指明的寄存器中,即寄存器的内容为操作数的EA。 能够用来作间接寻址的寄存器只能是SI、DI、BP或BX,所以,对于寄存器间接寻址方式所给出的操作数,其EA的计算方式如下:EA=SI (当使用SI做间址寄存器时);DI (当使用DI做间址寄存器时);BX (当使用BX做间址寄存器时);BP (当使用BP做间址寄存器时)。 如果使用寄存器BX DI SI 作间接寻址,则操作数在当前数据段中,即数据段寄存器DS中的内容,左移4位,然后加上BX、DI或SI 中的EA,形成PA;如果使用BP间接寻址,则在当前堆栈段中(即堆栈寄存器SS中)的内容左移4位,加上BP中的EA,形成PA。 格式:R 功能:R中的内容是操作数的EA,2.3 汇编语言和接口基础(续),变址寻址 在变址寻址方式中,操作数在存储器中,但是操作数的EA是指令指明的寄存器的内容与指令给出的位移量之和。 格式:XR 功能:R中的内容与X相加之和为操作数的EA,其中X表示位移量,其值使用8位或16位的二进制补码表示的有符号数。R表示寄存器名,且只能是SI、DI、BP和BX其中之一。 如果使用寄存器BX、DI或SI 作变址寻址,则操作数将当前数据段中,即数据段寄存器DS中的内容,左移4位,然后加上BX、DI或SI中的EA,再加上位移量,形成PA;如果使用BP间接寻址,则在当前堆栈段中,即堆栈寄存器SS中的内容左移4位,加上BP中EA,再加上位移量,最终形成PA。,2.3 汇编语言和接口基础(续),基址加变址寻址方式 在这种寻址方式中,操作数在存储器中,操作数的EA是指令指定的基址寄存器内容、变址存储器内容和位移量X三者之和。 格式:XBR+IR 功能:将BR中的内容加上IR中的内容,再加上X,即得操作数的EA。 X其值使用8位或16位的二进制补码表示的有符号数。 BR表示基址寄存器,只能使用BX或BP中的一个,IR表示变址寄存器,只能使用SI或DI中的一个。其EA的计算方式如下: EA=BX+SI+X(当选用BX作为基址寄存器,而SI作为变址寄存器时);BX+DI+X(当选用BX作为基址寄存器,而DI作为变址寄存器时);BP+SI+X(当选用BP作为基址寄存器,而SI作为变址寄存器时);BP+DI+X(当选用BP作为基址寄存器,而DI作为变址寄存器时)。 说明:基址寄存器到底是选取BP 还是BX,决定了是从堆栈段还是从数据段中获取操作数。就是说,若选用BP作为基址寄存器,则使用SS中的内容左移4位,与EA相加,得到PA;若选用BX作为基址寄存器,则使用DS中的内容左移4位,与EA相加,得到PA。,2.3 汇编语言和接口基础(续),立即寻址 立即寻址方式所提供的操作数直接放在指令中,它是紧跟在指令操作码后面的一个可用的8位或16位二进制补码表示的有符号数。 格式:n 功能:指令下一单元的内容为操作数n。 n 也被称为立即操作数。 说明:立即操作数主要用来给寄存器或存储器赋初始值。这是最快的存取方式。,2.3 汇编语言和接口基础(续),直接寻址 在直接寻址方式中,操作数的16位EA紧跟在指令操作码的后面。即操作数的EA与操作码一起存放在代码段中,而操作数可以存放在数据段,也可以存放在其他段中。操作数的PA由其所在段的段寄存器内容左移4位与EA相加形成。 格式:含有变量的地址表达式或段寄存器名,EA。 功能:指令下一单元的内容是操作数的EA。,2.3 汇编语言和接口基础(续),8086基本指令有大约100余条,可以分为以下6大类: 数据传送指令。 算术运算指令。 位操作指令。 串操作指令。 控制转移指令。 处理机控制指令。,2.3 汇编语言和接口基础(续),压栈指令PUSH 格式:PUSH OPS 功能:将寄存器、段寄存器或存储区中的一个双字节数据压入栈中。 例:PUSH AX 执行过程: (SP)1SP;(AH)SP;(SP)1SP;(AL)SP。 这就相当于是将AX中的内容分两次压入堆栈中。但是需要注意的是,对于堆栈,操作单位只能是双字节(或“字”)。,2.3 汇编语言和接口基础(续),出栈指令POP 格式:POP OPD 功能:将栈顶数据弹出,并送到指定寄存器、段寄存器或存储区中。 POP可以看作是PUSH的逆操作,同样要注意的是,操作单位仍然只能是双字节。还有一点比较特殊的是,POP的OPD不能是CS,希望读者注意。,2.3 汇编语言和接口基础(续),传送指令MOV 格式:MOV OPD, OPS 功能:(OPS)OPD 注意:CS只出不进,所以OPD绝对不能是CS。 数据交换指令XCHG 格式:XCHG OPD, OPS 功能:(OPD)OPS; (OPS)OPD 查表转移指令XLAT 格式:XLAT OPS或 XLAT 功能:(BX+AL)AL 说明:这条指令在病毒中十分常见,因为可以用它很方便地建立起一个字符对应表,从而实现病毒自加密的功能。这在本书后面的病毒技巧部分会有所体现。,2.3 汇编语言和接口基础(续),传送偏移地址指令LEA 格式:LEA OPD, OPS 功能:按OPS提供的寻址方式计算偏移地址,并将其送入OPD中。 注意:OPD 必须是一个16位的通用寄存器;OPS所提供的一定是一个寄存器地址。 传送偏移地址及数据段首地址的指令LDS 格式:LDS OPD, OPS 功能:(OPS)OPD, (OPS+2)DS 注意:OPD 必须是一个16位的通用寄存器;OPS所提供的一定是一个寄存器地址,且其类型必须为DD。 传送偏移地址及附加数据段指令LES 格式:LES OPD, OPS 功能:(OPS)OPD, (OPS+2)ES 注意:OPD 必须是一个16位的通用寄存器;OPS所提供的一定是一个寄存器地址。,2.3 汇编语言和接口基础(续),自加1指令INC 格式:INC OPD 功能:(OPD)+1OPD 加运算指令ADD 格式:ADD OPD, OPS 功能:(OPD)+(OPS) OPD 注意:OPS中的数据不改变。 带进位加指令ADC 格式:ADC OPD, OPS 功能:(OPD)+(OPS)+CFOPD 自减1指令DEC 格式:DEC OPD 功能:(OPD)1OPD,2.3 汇编语言和接口基础(续),求补指令NEG 格式:NEG OPD 功能:将OPD中的每一位取反(包括符号位),然后加1,再送到回OPD里面去。 减运算指令SUB 格式:SUB OPD, OPS 功能:(OPD)(OPS) OPD 带借位的减指令SBB 格式:SBB OPD, OPS 功能:(OPD)(OPS)CFOPD 比较指令CMP 格式:CMP OPD, OPS 功能:(OPD)(OPS) 注意:CMP指令不改变 OPD和OPS中的数值,但是ZF、SF会根据结果而改变,这时由于FR会根据每步运算的结果自动刷新一次,因此这条命令常用来刷新FR。同时,为了提高运行效率,很多病毒巧妙地使用了CMP指令,读者在病毒技巧部分会具体看到。,2.3 汇编语言和接口基础(续),有符号乘指令IMUL 格式:IMUL OPS 功能:字节乘法(AL)*(OPS) AX字乘法 (AX)*(OPS) DX, AX 说明: 乘法运算指令属于双操作数指令,但是在语句中只制定源操作数(乘数),而另一个操作数是隐含的,而且不可以使用规定以外的寄存器。并且,源操作数只能是存储器操作数或寄存器操作数,并且操作结束以后,(OPS)不变。 如果乘数的高位(字节乘指的是AH,字相乘指的是DX)不是低位的符号扩展,也就是说AH或DX中包含有乘积的有效位,则CF=1,OF=1,否则为0。系统未定义乘法指令影响SF、ZF、AF和PF。,2.3 汇编语言和接口基础(续),无符号乘指令MUL 功能:MUL OPS 功能:字节乘法(AL)*(OPS) AX字乘法 (AX)*(OPS) DX, AX 说明: 和IMUL基本相同,只是参与运算的数是无符号的,而且结果也是无符号的。 如果乘积的高位不为0,即在AH或DX中包含有乘积的有效位,则CF=1, OF=1,反之为0。系统未定义乘法指令影响SF、ZF、AF和PF。,2.3 汇编语言和接口基础(续),有符号除指令IDIV 格式:IDIV OPS 功能:字节除法(AX)/(OPS) AL (商) AH (余数)字除法 (DX、AX)/(OPS)AX(商) DX(余数) 无符号除指令DIV 格式:DIV OPS 功能:字节除法(AX)/(OPS) AL (商) AH (余数)字除法(DX、AX)/(OPS)AX(商) DX(余数),2.3 汇编语言和接口基础(续),算术左移和逻辑左移。 格式:SAL OPD, 1或SHL OPD, 1SAL OPD, CL或SHL OPD, CL 功能:将(OPD)向左移动指定的位数,而低位补入对应的0,同时改变CF,CF的内容为最后移入的位的值。 说明:逻辑右移指令的做法和上面的完全一样,唯一的不同就是移动方向是从高到低。,算数左移 逻辑左移,2.3 汇编语言和接口基础(续),算术右移指令。 格式:SAR OPD, 1或SAR OPD, CL 功能:将(OPD)向右移动指定的位数,而高位不动,同时改变CF,CF的内容为最后移入的位的值。,2.3 汇编语言和接口基础(续),循环左移和循环右移。 格式:ROL OPD, 1或ROL OPD, CL(循环左移)ROR OPD, 1或ROR OPD, CL(循环右移) 功能:将目的操作数的最高位和最低位首尾相连,形成一个逻辑环,然后向左或向右移动对应的位数,移动的位数预先存放在CL中。,2.4 计算机引导过程,计算机启动是一个极其复杂的过程,虽然对于绝大多数用户而言,仅仅只是按下一个开关的动作。计算机是一台高智能化、高集成度的复杂电子仪器,它的每一次启动,都必须是在其所有部件都能正常工作的前提下实现的。为了保证这些部件的状态都符合计算机启动的要求,大约需要经过100多道检测步骤,只有当这些检测全部通过了,计算机才能正常引导。引导型病毒就是利用了计算机引导过程中的一些规则,成功地控制了整个系统,并造成破坏。,2.4 计算机引导过程 (续),计算机内存的地址。目前计算机的内存即使是一台最普通的PC也有至少2GB(2048MB),比起计算机发展初年的32MB要大了很多倍。内存就是一个临时存放地,里面放着很多准备进入CPU或写回其他设备的指令和数据。内存有很多地方是系统保留的,普通的程序是不能对其加以访问的,放在那里面的数据有着特殊的含义。内存中地址0FFFFFH的低端1MB非常特殊,就是系统保留的。,2.4 计算机引导过程 (续),BIOS(基本输入输出系统)。它是直接与硬件打交道的最底层代码,它为操作系统提供了控制硬件设备的基本功能。计算机上的独立部件几乎都有自己的BIOS,例如系统BIOS(即常说的主板BIOS)、显示卡BIOS和其他设备(如IDE控制器、SCSI卡或网卡等)的BIOS。这里主要讨论的就是系统BIOS,因为正是它控制计算机的启动过程。BIOS一般被存放在ROM(只读存储芯片)之中,掉电后代码仍然保留。,2.4 计算机引导过程 (续),第一步 加电后电源就开始向主板和其他设备供电,由于瞬时电流此时要冲击主板,造成激荡,所以这一阶段(一个极短的人无法感知的时间段)电压还不稳定。然后主板上的控制芯片组向CPU发出并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行指令,直到当芯片组检测到电源已经开始稳定供电,才撤去RESET信号,此时CPU立即从地址FFFF0H处开始执行指令。由表2.2可知,这个地址在系统BIOS的地址范围内,无论是Award BIOS还是AMI BIOS,这里只有一条跳转指令,指向系统BIOS中真正的启动代码处。,2.4 计算机引导过程 (续),第二步 系统BIOS进行加电自检(Power-On Self Test,POST)。POST只检查两点:系统中一些关键设备是否存在;如果都存在这些设备能否正常工作。不出意外的话,POST也将快到人类几乎无法感知,所以很多人都忽略了这一过程,甚至不知道它的存在和意义。,2.4 计算机引导过程 (续),第三步 在POST结束之后BIOS将调用其他代码来进行深一步的硬件检测。系统BIOS接下来将查找显示卡的BIOS。由表2.2可知,显示卡BIOS的起始地址在内存C0000H处(记住,各个独立设备的BIOS不在系统主板上,而都是自己的独立ROM),一旦找到它后就调用它的初始化代码来初始化显示卡。这就是一开机最先看到的屏幕上方出现的一些有关显示卡的初始化信息,如生产厂商、图形芯片、显存大小类型等。这个画面驻留时间不长,但确实是最真实的有关显示卡的信息,在购买计算机时可以用这种方法识别被奸商打磨并重新刻字的GPU(但是如果修改显示卡BIOS则不能用这种方法识别)。以此类推,系统将逐步检测、调用各个关键设备的BIOS,并用它们初始化各自的设备。在这个过程结束后,系统BIOS才最后显示出包含自己基本信息的启动画面,里面有系统BIOS的类型、序列号和版本号等。,2.4 计算机引导过程 (续),第四步 检测和显示CPU的型号、工作电压、工作频率等初始化条件。接下来开始测试所有的RAM(系统所能检测到的都检查),同时在屏幕上显示测试进度,这就是在开机屏幕中上方看见的一串跳动的数字,最后会停留在系统总RAM的那个值上。 第五步 检测系统中安装的一些标准硬件设备,包括了硬盘、DVD、并口、串口等,并且还要检测和设置硬盘参数和访问模式、内存的定时参数等硬件设置项。,2.4 计算机引导过程 (续),第七步 系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS中。一般情况下,ESCD只有当系统硬件配置发生改变后才会更新,但也有很多主板的系统BIOS在保存ESCD数据时使用的数据格式与Windows 9x不同。为了能够启动,Windows 9x在启动过程中又把ESCD数据修改成自己的格式。这样在系统BIOS看来ESCD就发生了改变,是必须改回来的。于是相当于每次开机都要更新一次ESCD,会大大降低启动速度。这个问题在现在的流行配置上已经看不见了。 第八步 系统BIOS根据用户指定的启动顺序选择启动设备启动。在读取引导记录进入内存指定地点后,系统BIOS的历史使命完成并将控制权交给MBR。这之后的过程就是研究引导型病毒的主要内容,后面有专门章节讲述相关内容。,2.5 COM和EXE文件结构,COM文件加载过程: MS-DOS申请内存,这里要注意的是COM程序必须位于一个64KB的段中,这其中还必须包含用于PSP的256B和用于一个起始堆栈的至少256B,所以COM文件不能大于65024B(64KB256B256B)。如果内存不够,则分配申请被系统驳回,COM文件就无法加载。申请成功后,即使COM程序本身不能大于64KB,MS-DOS也会分配尽可能多的内存,但不能涉及系统保留内存,能这么做的原因是由于MS-DOS是单任务系统。但如果有新的内存申请进入,则大多数的COM程序会释放所有用不上的内存。 在得到相应的内存后,MS-DOS在这块空间的前256B建立一个PSP,如该PSP中的第一个FCB含有一个有效驱动器标识符,则置AL为全0,否则置为全1。同样,如果该PSP中的第二个FCB含有一个有效驱动器标识符,则置AL为全0,否则置为全1。至此,PSP构建成功。随后MS-DOS立即开始加载COM文件。 MS-DOS设置SS、DS和ES的段地址,并创建一个堆栈。创建这个堆栈的方法比较复杂:如果已经分配了64KB内存,则将SP指向0000H;如果没有,MS-DOS设置寄存器比自己所有的内存大2的值。最后,将0000H压入栈中。 注意:显而易见,MS-DOS启动程序的过程实际上是将控制权传递给偏移100H处的指令,所以任何COM文件的第一条指令必须是程序的入口。同时,所有代码一定要注意自己的偏移也是相对于100H的。,2.5 COM和EXE文件结构(续),MZ文件格式每个EXE文件包含一个文件头和一个可重定位程序的映像。文件头包含MS-DOS用于加载程序的信息,如程序的大小和寄存器的初始值。程序映像包含处理器代码和程序初始化数据。文件头和程序映像的大小之和就是EXE文件的大小。MZ文件是EXE文件中最简单的,一般用于MS-DOS环境。它的文件头结构如表所示。,2.5 COM和EXE文件结构(续),NE文件格式 NE (New Executable,“新可执行”文件),是16位Windows可执行文件的标准格式。由于16位Windows的淡出市场,这种格式目前已经不再使用了。NE文件格式最重要的地方在于两个数据结构,:,2.5 COM和EXE文件结构(续),第一个数据结构: / EXE 文件头 struct HeadEXE WORD wType; / 00H MZWORD wLastSecSize; / 02H 最后扇区被使用的大小WORD wFileSize; / 04H 文件大小WORD wRelocNum; / 06H 重定位项数WORD wHeadSize; / 08H 文件头大小WORD wReqMin; / 0AH 最小所需内存WORD wReqMax; / 0CH 最大所需内存WORD wInitSS; / 0EH SS 初值WORD wInitSP; / 10H SP 初值WORD wChkSum; / 12H 校验和WORD wInitIP; / 14H IP 初值WORD wInitCS; / 16H CS 初值WORD wFirstReloc; / 18H 第一个重定位项位置WORD wOverlap; / 1AH 覆盖WORD wReserved0x20; /1CHWORD wNEOffset; / 3CH NE 头位置 ;,2.5 COM和EXE文件结构(续),第二个数据结构: / NE 文件头 struct HeadNE WORD wType; / NEBYTE wLinkerVerMajor;BYTE wLinkerVerMinor;WORD wEntryOffset;WORD wEntrySize;DWORD dReserved;/ wModelFlag : b15 - -EXE/DLL,其他位指定 286/386 指令等WORD wModelFlag;WORD wDGROUPseg;WORD wI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论