┌──┌─┐┌──
──┘├─┘──┘ 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,7E (Int 7E) и в случае не соответсвия  записывает
  туда  данный  код,  сохраняя  оригинальные  2  байта  в  собственном
  буфере.  Вирусом также проверяется смена адреса Int 15, и, в  случае
  смены  последнего,  вирус  восстанавливает  первые 2 байта "старого"
  обработчика   Int   15,   запоминает   адрес   нового  и  производит
  вышепроиведенную операцию.

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


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

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

- вирусом  перехватывается прерывание  Int 7E,  а вирусный  обработчик
  Int 8  записывает в  начало обработчика  Int 15  вызов Int 7E, таким
  образом, при вызове Int 15  срузу же вызывается Int 7E,  т.е. вирус.
  Данный  прием  позволяет  исключить  возможность  вызова   вирусного
  обработчика через  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