ZF

                          Анализ вируса Nutcracker
                              черепепятка из LMD
+--+-++--
--++-+--+ Presents
+  ++++-+ VMag, Issue 2, 1 June 1998
+-++ ++-+ --------------------------


Вирус Nutcracker.AB0: Атака на ADinf...
---------------------------------------


    В данной  статье  мы продолжаем знакомство с интересными приемами и
алгоритмами,  реализованными в вирусах семейства  Nutcracker.  Напомню,
что  вирусы  данного  семейства являются одними из наиболее сложных,  а
вирус Nutcracker.AB2  был  поставлен  Е.В.Касперским  по  сложности  на
второе место в мире после Zhengxi.


Введение.

    Формально вирус  Nutcracker.AB0  является   загрузочным   (бутовым)
вирусом,  поражающим  Главную  Загрузочную  Запись  (MBR)  винчестера и
Загрузочные  (BOOT)  сектора  дискет.  Данный  вирус  можно  отнести  к
категории очень опасных вирусов, т.к. вирусом в некоторых рассмотренных
ниже случаях может быть стерто начало винчестера. Основной особенностью
данного  вируса  является  его  способность  скрываться  от обнаружения
популярным антивирусом-ревизором диска ADinf Дмитрия  Мостового. Причем
для  этого  используется  не  какие-то  конкретные  меры,  направленные
конкретно против алгоритма проверок дисков,  реализованного в ADinf,  а
оригинальный  метод  сокрытия  (стелсирования) изменения MBR винчестера
вирусом.  Примечательным является еще  и  тот  факт,  что  учет  данной
возможности   для   стелсирования   вирусов   был  специально  добавлен
Д.Мостовым в ADinf версию 11.03 в апреле 1997 года,  именно  исходя  из
описания  алгоритма,  реализованного  в данном вирусе,  а сам вирус был
выловлен в "диком" виде в ноябре-декабре 1995 года. Т.о. около 1.5 года
пользователи  ADinf  (и не только они) находились под угрозой возможной
эпидемии данного вируса,  но почему-то об этом факте Д.Мостовой "забыл"
упомянуть в документации к своей очередной версии ADinf...  Ну, что же,
оставим этот эпизод на его совести...


Атака на ADinf: как это работает?..

    Особенностью данного   вируса   является   его   алгоритм  сокрытия
искажения  MBR  на  уровне  Int  15,  а  не  Int  13,  как  большинство
загрузочных  и  файлово-загрузочных  стелс-вирусов.  Классическая  идея
стелсирования на уровне Int 13 состоит  следующем:  вирус,  находясь  в
памяти,  осуществляет  перехват  Int  13/Fn=2  (чтение  сектора)  и при
попытке  прочитать  инфицированный  MBR  подставляют  в  буфер   чтения
оригинальный  код,  таким  образом  скрывая свое наличие на винчестере.
Принцип работы  ревизора  диска  ADinf  состоит  в  том,  что  проверка
информации  на  дисках  осуществляется  на  уровне BIOS Int 13,  что не
позволяет вирусу скрыть свое присутствие,  т.к.  на вирусный обработчик
просто   не   передается   управление,   что   позволяет   обнаруживать
стелс-вирусы даже при  их  наличии  в  памяти!  Так  что  же  позволяет
остаться   незамеченным  для  ADinf'а  рассматриваемому  вирусу?  Вирус
использует для стелсирования следующие "дыры" операционной системы:

    - дело в том,  что обработчик Int 13 BIOS перед началом операции  с
диском,  принтером  и  др.  вызывает  прерывание  Int 15/Fn=90 (открыть
устройство).  А при окончании обработки - Int 15/Fn=91.  Данные  вызовы
были  предусмотреын  для  многозадачных  операционных систем,  чтобы во
время  обработки  обращения  к  диску   операционная   система   смогла
производить  некоторые  действия.  Вызывается  данное  прерывание и при
обращении  к  винчестеру.  Вирусом  осуществляется   перехват   данного
системного  вызова  и  осуществляется стелсирование,  что позволяет ему
оставаться "невидимым" даже при чтении винчестера прямым  обращением  к
BIOS (подробнее см. Обработчик Int 15).

    - способ  инфицирования  MBR,  который  не позволяет проверить диск
ADinf даже при загрузке с чистой системной дискеты,  но не  приводит  к
каким-либо  проблемам  при работе с диском на уровне DOS (подробнее см.
Инфицирование MBR).

    - способ  создания  резидентной  копии,  не  обнаруживаемый   ADinf
(подробнее см. Резидентная копия).


Загрузка с инфицированного диска.

    Инфицирование MBR вирусом происходит только при попытке загрузиться
с дискеты,  с инфицированным BOOT сектором.  В этом случае производится
следующая последовательность операций:

    - вирусный загрузчик проверяет: имеется ли копия вируса в памяти (в
этом  случае  байт  по  адресу  0:87 будет иметь значение 7B),  и,  при
наличии в памяти резидентной копии (это может произойти,  если  вы  уже
один раз попытались загрузиться с инфицированной дискеты и после выдачи
сообщения о  замене  незагрузочного  диска  на  загрузочный  нажали  на
клавишу,  но  не  выняли незагрузочный диск или вставили инфицированный
новый и произошла повторная попытка загрузки с  инфицированной дискеты)
расшифровывает (NOT) и выдает на экран сообщение:

  Non-system disk or disk error.
  Replace and press any key when ready.

    После чего ждет нажатия на любую клавишу и  вызывает  Int  19h  для
повторной попытки загрузки.

    - в  случае  отсутствия  в  памяти резидентной копии вирус читает с
диска  5   секторов   своего   кода,   находящегося   на   нестандартно
отформатированной инженерной дорожке дискеты или с инженерного цилиндра
винчестера по адресу 7c00:0 и,  в  случае  успешного  чтения,  передает
управление  на  свой код.  При ошибке чтения,  вирус пытается повторить
операцию 2 раза и при невозможности прочитать с  дискеты  основной  код
производит  ту же последовательность действий,  что и при обнаружении в
памяти своей активной копии (см.выше).

    - получив управление,  основной код  вируса  производит  чтение  по
адресу   0:7c00   кода  оригинального  загрузчика  (при  ошибке  выдает
сообщение  "Non-system..."  и  т.д.  [см.выше])  Затем  вирус  временно
перехватывает  Int  15,  инициирует  вызов  Int  13/AX=201 и читает MBR
первого винчестера,  предварительно сохранив указатель на  стек,  чтобы
выявить  возможность  стелсирования  на  уровне Int 15.  При отсутствии
указанной  возможности  вирус  издает  звуковой   сигнал   и   передает
управление  оригинальному  загрузчику.  Если  же BIOS-обработчик Int 13
вызывает перед началом операции чтения MBR Int  15/Fn=9000,  то  данный
вызов  перехватавается  вирусом,  вычисляется  разность  между  текущим
значением стекового указателя  и  запомненным  и  вычисляется  смещение
адреса  возврата  из  BIOS-обработчика  Int  13  в  стеке  относительно
значения стекового указателя при вызове Int 15/Fn=9000.  После этого  в
стеке  ищется значение 201 (значение р-ра AX на входе в Int 13) или 200
(если BIOS сохраняет в стеке только  номер  обрабатываемой  функции)  и
также  запоминается  его  относительное смещение.  После прочтения MBR,
вирус восстанавливает оригинальный Int 15.

    - вирус производит попытку инфицирования MBR первого  винчестера  и
при  невозможности его инфицирования (напр.  отсутствии винчестера),  а
также в случае  ненахождения  в  стеке  при  обработке  Int  15/Fn=9000
смещения  с сохраняемым BIOS'ом номером обрабатываемой функции передает
управление на оригинальный загрузочный код с выдачей звукового сигнала.
В   случае,  если  винчестер  был  уже  инфицирован,  вирус  запоминает
оригинальные  значения   голоки/цилиндра   начала   активного   раздела
винчестера, сохраненные вирусом в псевдо-загрузочном секторе.

    - при успешном инфицировании либо в случае, если MBR винчестера уже
был заражен,  вирус формирует по адрусу 0:4F1 три межсегментных  прямых
перехода на собственные обработчики Int 8 (таймер),  Int 40 (операции с
дискетой)  и  переход  на  оригинальный  вектор   Int   15,   а   затем
перехватывает Int 8 и Int 40,  устанавливая их адреса на сформированные
межмегментные прямые переходы.

- передает управление на оригинальный код загрузчика.


Инфицирование Главной Загрузочной Записи (MBR).

    В вирусе  Nutcracker.AB0  применен  метод инфицирования MBR впервые
использованный  в  вирусе  Starship,  но  имеющий   свои   особенности.
Инфицирование MBR происходит следующим образом:

    - в  память  читается  содержимое  MBR,  в  Таблице  разделов диска
(Partition table) ищется раздел,  помеченный как загружаемый и в память
читается активный BOOT сектор.

    - вирус  проверяет  BOOT cектор на инфицированность и,  если он уже
заражен,  прекращает алгоритм  инфицирования  винчестера,  в  противном
случае   вирус  проверяет  доступность  последних  5  секторов  первого
винчестера на чтение/запись и в случае  успеха  записывает  копию  BOOT
сектора  с  внедренным  в  нее кодом загрузки основного вирусного тела,
находящегося в следующих секторах,  и сами сектора  основного  кода.  В
зараженном  псевдо-BOOT  секторе  вирус сохряняет оригинальные значения
Цилиндр-Сектор  Начала  Активного  раздела/Головка   Начала   Активного
Раздела  и  устанавливает  данные  параметры в прочитанной копии MBR на
инфицированный псевдо-BOOT сектор.

    - пишет скорректированный  MBR  на  диск.  При  наличии  IDE  вирус
производит  запись  MBR путем непосредственного программирования портов
винчестера.


Инфицирование Загрузочных секторов дискет.

    Инфицирование дискет   производится   при   чтении  BOOT-сектора  в
физическом дисководе A: или B:. В этом случае:

- вирусом вычисляется значение инженерной дорожки дискеты (Количество
  Дорожек+1);

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

- форматируется (Int 40) инженерная дорожка дискеты;

- на нее записывается вирусное тело;

    - в  случае  успешного  выполнения  всех  указанных  действий в MBR
записывается код вирусного загрузчика, производящего загрузку основного
вирусного кода и осуществляющего передачу на него управления.


Резидентная копия.

    Данный вирус в отличие от большинства загрузочных  вирусов является
резидентым  в  середине,  а  не  в конце памяти.  Данная особенность не
позволяет  обнаруживать  его  присутствие  сравнением  доступного   при
загрузке  для  DOS значения памяти с реальным (данный алгоритм проверки
реализован в ADinf).  Причем вирус  может  оставаться  резидентно  и  в
области  UMB,  распределяемой  вызовом  XMS-драйвера.  Причем  в данном
вирусе    применен    так     называемый     (Е.В.Касперский)     метод
"паразитического" резидента. Он заключается в следующем: вирус не имеет
собственного  блока  распределения  памяти  (MCB),  а  добавляет  длину
собственного блока к предыдущему,  таким образом "паразитируя" на нем и
скрывая свое присутствие в памяти.


Обработчик Int 8 (таймер).

    Данный обработчик  используется  вирусом  для  выполнения следующих
действий:

- на этапе загрузки DOS вирус "ждет" установки DOS-векторов и
  временно перехватывает Int 21.

    - вирус  постоянно  проверяет первые 2 байта начала обработчика Int
15 на соответствие CD,7 (Int 7) и в  случае  не  соответсвия записывает
туда  данный  код,  сохраняя оригинальные 2 байта в собственном буфере.
Вирусом также проверяется смена  адреса  Int  15,  и,  в  случае  смены
последнего,  вирус восстанавливает первые 2 байта "старого" обработчика
Int 15, запоминает адрес нового и производит вышепроиведенную операцию.

    - на  этапе  проявления  вирус  генерирует  на  экране   движущееся
изображение   "шарика"  со  стуком  отражающегося  от  краев  экрана  и
некоторых букв.


Обработчик Int 15 (сервис AT).

    Вирусный обработчик этого прерывания выполняет следующие функции:

    - вирусом  перехватывается прерывание Int 7,  а вирусный обработчик
Int 8 записывает в  начало  обработчика  Int  15  вызов  Int  7,  таким
образом,  при  вызове  Int  15 срузу же вызывается Int 7,  т.е.  вирус.
Данный  прием  позволяет   исключить   возможность   вызова   вирусного
обработчика  через  Pushf/Call  Old_Int15_Handler,  если  Int  15 будет
перехвачен после перехвата Int 15 вирусом, т.е. вирусный обработчик Int
15 _всегда_ получает управление первым.

    - вирус    обрабатывает    вызовы   Int   15/Fn=9000,9001,9100,9101
(open/close device hard disk/floppy disk).  Данные  функции  вызываются
BIOS   при   обработке  прерываний  Int  13/Int  40.  Вирус  проверяет:
осуществлялся ли вызов данных функций BIOS'ом  при  обработке  вирусных
внутренних вызовов и,  если да,  то передает управление на оригинальный
обработчик Int 15h,  находящийся в BIOS,  т.о.  вирус  противодействует
возможному перехвату Int 15h антивирусными мониторами.

    - вирусом также обрабатывается вызов функции 4F (get scancode), и в
случае обнаружения нажатия комбинации Ctrl-Alt-Del на  клавиатуре вирус
проверяет   некоторые   условия  и  в  некоторых  случаях  осуществляет
выполнения троянской компоненты (см. Проявления).

    - вирус  восстанавливает  первые  2  байта  обработчика  Int  15  и
вызывает  его Pushf/Call Old_15h_Hanler.  Т.о.,  по окончании обработки
вызова Int 15 "старым" обработчиком управление снова  получает вирусный
код.

    - если  был  осуществлен  вызов  функции  9000 и сброшен внутренний
флаг,  то вирус проверяет нахождение в стеке по вычисленному  на  этапе
загрузки смещению (см. Загрузка с инфицированного диска) значения 2 или
3,  т.е.  если  BIOS   обрабатывает   операцию   чтения/записи,   вирус
подставляет,  исходя из вычесленного на этапе загрузке смещения, в стек
адрес возврата из BIOS-обработчика  Int  13  на  свой  код  и  возводит
внутренний флаг,  чтобы исключить обработку данной ситуации до тех пор,
пока BIOS не возвратит управление из обработчика  Int  13  на  вирусный
код.

    - при   получении   управления   данный   вирусный  код  проверяет:
производились ли эти операции с инфицированным MBR  первого  винчестера
и,   если   да,  осуществляет  повторное  заражение  (при  записи)  или
стелсирование начала активного раздела в partition table  (при чтении),
затем передавая управление на оригинальный адрес возврата.


Обработчик Int 40 (операции с дискетой).

- выполняет вызов оригинального обработчика;

    - в случае бессбойного выполнения проверяет:  была ли  это  функция
чтения/записи и,  если так,  проверяет системное время и с определенной
(довольно  малой)  вероятностью  активизирует  в  обработчике   Int   8
генерацию  изображения  "стучащего  шарика",  а  также запоминает время
активизации;

    - после  этого  проверяет  дискету  на  зараженность  и,  в  случае
необходимости, инфицирует ее

Проявления.

    - генерация на экране движущегося "шарика" со  стуком отражающегося
от  краев  экрана  и  некоторых букв (см.  Обработчик Int 8).  В данном
режиме работы вирус отслеживает нажатие пользователем комбинации клавиш
Ctrl-Alt-Del и в случае, если с момента "запуска" шарика прошло менее 5
минут,  отключает клавиатуру и затирает первые  100  секторов  на  двух
винчестерских дисках. Ту же операцию вирус производит при обнаружении в
буфере данных,  записываемых на  винчестер  начало  собственного  кода,
полагая, что он уже обнаружен.

    - по  7-м  апреля каждого года при загрузке с инфицированного диска
вирус расшифровывает и выводит на экран следующий текст:

  юSюUюPюEюRюUюNюKюNюOюWюNю was done by Lord Nutcracker(AB0).

  Затем ждет нажатия на клавишу и продолжает загрузку системы.


Специально для LMD, Nice aka Psychomancer // SPS06.
                    ю 2:454/5.9@FidoNet


(C) NF, 1998-2004