05.03.2000 Деструкция [mongoose]

   вступление

   Дисскусия  на  эту  тему  происходила  в  вирмейкерской сети Evolution
Network.

   где деструкция уместна? (теория)

   Вирмейкеры-пацифисты  конечно  скажут, что деструкция и вирусы вещи не
совместимые,  я  тоже  не деструктор и никогда [!] не занимался подобными
вещами  (и  не собираюсь). Но хочется дать совет деструкторам, потому что
большинство применяет деструкцию неправильно (тут уместна фраза: неумеешь
ненадо)  и  в  результате  страдают  невинные люди. Что лично для меня не
очень приятно.

   Видимо   деструкция   сильно   повлияла  на  появления  в  конституции
Российской  Федерации  статьи  о  судьбе  пойманых  вирмейкеров.  Немного
поразмышляв  на  тему  "где  уместна  деструкция"  я пришел к выводу, что
правильное    применение    деструкции   сводится   к   применению   ее в
антиотладочных  триках  и  при  обнаружении  антивирусов способных лечить
вирус.

   деструкция в антиотладочных триках

   Для  чего нужны антиотладочные трики? Для того чтобы защитить вирус от
изучения  различными  кодерами  (ламера остановит простенькая шифровка, а
вот  кодера  пишущего  на  асме  и  имеющего  стаж год или чуть больше не
остановит  навороченный  полиморфик),  но  как  и  все люди даже хорошему
кодеру  свойственно  ошибаться.  Если кодер во время не заметит трик и не
занопит его, то его компьютер в лучшем случае повиснет ;). Повиснет, ну и
что...  reset  нажать  не  тяжело  и  заново  загрузить зараженный файл в
отладчит  ему  особых проблем не доставит, но при дальнейшем исследовании
вируса он учтет наличие этого трика и я уверен на 99% что он его во время
занопит.  А  что  если  стирать  файл  который  этот крендель разбирает и
повесить  тачку?  Это  причинит немного больше проблем ;), потому что ему
прийдется  найти  резервную копию файла и снова загрузить его в отладчик.
Но чем больше ему прийдется по потеть и чем больше времени удастся вирусу
добыть  тем  лучше ;). Поэтому нужно наносить больший вред его винту, для
того  чтобы  уничтожить все резервные копии файлов с вирусами и чтобы ему
пришлось  потеть приводя тачку в чувства, вам решать что вы будете делать
с  его  тачкой  (сносить  фат,  пороть  сектора или просто вешать тачку).
Возможно  своей  деструкцией  вам удастся отбить желание дизасемблировать
вирус  у  простого смерного (не у антивирусника, вирмейкера или кодера со
стажем)  или  же  выиграть время. В результате невинные чайники и простые
юзеры  страдать  небудут,  а  "любопытной  варваре,  нос  оторвали"  хотя
деструкторам глубоко начихать кто пострадает, а кто нет...


   антиотладочные трики

   Итак,  в  продолжение  темы антиотладочных триков. В помощь начинающим
здесь  приведена подборка триков. Они позволяют определить, отлаживают ли
вас, дальнейшая реакция виря целиком зависит от вас. Должен заметить, что
завесить машину гораздо проще, чем отфоматировать винт (в том смысле, что
подобные действия легче просечь и пресечь).

   1.  Противодействие отладчикам реального режима (к ним относятся такие
дебагеры, как TurboDebugger, Debug).

   Противодействовать можно двумя способами:
    - затруднение работы отладчика
    - определение самого факта трассировки.

   Первый  способ  основан  на  том факте, что отладчики реального режима
используют  в  своих  целях  прерывания  int  1,  int  3,  им  необходимо
работать  с клавиатурой, работа программы под отладчиком занимает гораздо
больше времени, чем без него. По-порядку:

   1.1 Забивание нулями адресов прерываний int 1, int 3
  
    xor ax,ax
    mov ds,ax
    mov ds:[0004],ax
    mov ds:[0006],ax


    Действует хорошо, но также легко и снимается

   1.2 Перенаправление векторов
  
    xor ax,ax
    mov ds,ax
    mov ax,ds:[0084h]
    mov ds:[0004],ax
    mov ax,ds:[0086h]
    mov ds:[0006],ax


    И далее во всей программе заменять вызовы int 21h на int 1

   1.3 Отрубание клавиатуры
  
    in al,21h
    or al,02
    out 21h,al


    Опять-таки хороший способ, но только если его не просекли :)

   1.4 Проверка времени работы процедуры.
  
    call start_timer
    call test_proc
    call stop_timer


   Теперь  пусть в dx:ax - время работы процедуры test_proc, в сх - время
работы процедуры на вашем компе.
  
    div cx
    cmp ax,1000 ;для работы на всех компах
    jae debugger


   1.5 Существует множество триков, связанных с использованием конвейера.
Hо  насколько  мне  известно,  они  не  работают  на  586  и выше компах.
Поэтому здесь не рассматриваются.

   1.6 Определение факта трассировки
  
    pushf
    pop ax
    test ah,1
    jz traced


   Это  в  примитиве. Hа само деле отладчики при выполнении команды pushf
сбрасывают   этот   бит,   так  что  вы  обломитесь. Hо не все так плохо.
Существует  баг процов, связанный с тем, что после выполнения команд типа
pop   ss,   mov  ss,reg  пропускается  следующая  за  ним  команда.  Т.о.
последовательность команд
  
    push ss
    pop ss
    pushf
    pop ax
    test ah,1
    jz traced


   позволит вам определить факт трассировки

   1.7 Переход по динмаически изменяемым адресам

   Устанавливаем  обработчик  int  1  на  себя.  Далее устанавливаем флаг
трассиров- ки, и обрабатываем команды:
  
int_1 proc
      mov bp,sp
      add byte ptr [bp+3],offset bbb - offset aaa ;изменяем команду, на
                                     ;которую указывает ip
      iret
int_1 endp
; код программы
jmp short aaa        ;db 0ebh,xxh
....
aaa:
....
bbb:


   Таким  образом произойдет переход не на метку ааа а на метку bbb Кроме
этого можно в теле обработчика int 1 производить расшифровку кода и сразу
же после выполнения команд призводить обратную зашифровку.

   1.8  Для  противодействия Soft-Ice можно использовать тот факт, что им
можно  управлять  через  int  3  (более  полную  информацию см. Interrupt
List)


   2. Противодействие отладчикам защищенного режима.

   Здесь наши возможности ограничены более сильно в силу того, что данный
тип  отладчиков  эмулит  прерывания,  так  что  ... Hо все равно бороться
можно.

   2.1 Забивание отладочных регистров
  
    xor eax,eax
    mov dr0,eax
    mov dr1,eax
    mov dr2,eax
    mov dr3,eax
    mov dr7,eax

   Хороший  метод,  но  ...  и  отладочные регистры также эмулятся... Мне
кажется  (пока  что  я  это  еще  не  проверял)  что тут как раз подойдут
проверки на эмуляцию, давно уже применяющиеся против антивирусов.

   2.2  Данный  код  работает  против DeGlucker'a v0.04 (взято из Cr0cK'z
AntiDEBUGING FAQ)
  
    db 66h,0fah,0fbh

   2.3 Использование функций Win32 (если вирь под win32)

   функция   IsDebuggerPresent(VOID)   возвращает   0,  если  мы  не  под
дебугером, иначе возвращает ненулевое значение.

   2.4  Обнаружению  отладчика  Soft-Ice  посвящены  две статьи в Xine #4
(xine-4.103,  xine-4.106).  Hе  считаю необходимым заниматься переводом и
переписыванием.

   P.S.  Hо  imho  лучший  способ  найти хороший трик - попытаться пройти
какую-нибудь из защит типа PCrypt и взять что-то оттуда...

   P.P.S.   Просьба   опытных   кракеров   не   пинать   меня  ногами  за
представленные  здесь  простенькие  трики  -  у  статьи  несколько другое
предназначение.

 Список "литературы", в которой можно посмотреть все это и еще больше :)
  - Cr0cK'z AntiDEBUGGING FAQ
  - Anti Debugging Tricks by Inbar Raz
  - Xine #4 (.103, .106)
  - Расторгуев С. "Программные методы защиты информации в компьютерах и
    сетях"
  - да еще много где...


   деструкция как метод борьбы с антивирусами

   Антивирусы  всегда являлись главными "врагами" вирусов. Рано или позно
продукт  будет  детектиться антивирусами и главное не стирать сектора при
обнаружении на машине антивируса. Нужно сначала определить в состоянии ли
он  детектить  (и  лечить)  продукт,  для этого наиболее приемлемо чтение
различных  документаций  (хотя  бы документации к дополнению(ям) и списка
всех  вирусов  определяемых  антивирусом) прилагаемых к антивирусу, и при
обнаружении  в  списке  вирусов вирус с названием похожим на наше гробить
тачку.  Главное  чтобы  вирус  содержал  в  своем  теле свое имя, которым
антивирусники должны будут назвать его.

                  article by UazZ & mongoose, both from misdirected youth