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