┌──┌─┐┌──
──┘├─┘──┘ 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