Анализ вируса 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
|