Pull to refresh

Вирусный анализ для начинающих — анализируем Virus.Win32.MTV

Reading time3 min
Views16K
Я, наконец, нашел время не просто на анализ вредоносного ПО, но и на написание ещё одной статьи на эту тему. Начнём, пожалуй. Сегодня мы будем анализировать вирус Virus.Win32.MTV.4608.a, обнаруженный ещё в 2000 году. Пусть дата обнаружения вируса Вас не смущает – никогда не помешает анализ вируса даже такой давности. Взять его можно на vx.netlux.org.

Требуемые инструменты: любой дизассемблер или отладчик на ваш выбор.

Итак, загружаем наш испытуемый файл в любой дизассемблер или отладчик. Видим вполне приятный код для анализа – никакой упаковки, никакой обфускации, никакой антиотладки — всё видно как на ладони. Сразу в глаза бросается строка: «Copyright 1989-2000 Borland Inc. Borland C++ run-time library», определяющая язык и версию компилятора, на котором был написан данный вирус. Начнём, непосредственно, анализ функционала данного вируса самым подробнейшим образом. Выполнение программы начинается со следующего места:

00401000>MOV ESI, Virus.004032A8
00401005 MOV ECX, 2D
0040100A>MOV AL, BYTE PTR DS:[ESI]
0040100C XOR AL,3
0040100E MOV BYTE PTR DS:[ESI], AL
00401010 INC ESI
00401011^LOOPD SHORT Virus.0040100A

Данный цикл выполняет расшифровку строковых констант, расположенных по адресу 0х004032A8 размером 0х2D байт. После расшифровки мы получим вот это:
image

Далее будет выполнен следующий код:
image

Нетрудно видеть, что программа определяет своё месторасположение на диске, открывает свой собственный файл для чтения, узнаёт его размер и загружает его в специально выделенную для этого область памяти. Зачем? Поймём далее. А сейчас отметим, что при любом неблагоприятном для программы истечении событий она выводит на экран окно сообщения и завершает работу Windows:
image

Теперь обратим внимание на следующее место:

004010CD CMP EAX, 1200
004010D2 JE Virus.004011D2

Здесь программа сравнивает свой физический размер с константой 0х1200 и в зависимости от данной операции продолжает своё выполнение различным образом. Размер текущего файла также равен 0х1200. Можно сделать предположение, что данный экземпляр программы представляет собой исходный файл вируса, что впоследствии подтвердится. Смотрим, что выполниться, если же размер файла отличен от 0х1200:
image

Сначала программа создаёт временный файл, а затем расшифровывает некоторую область памяти в следующем цикле:

00401152>MOV AL, BYTE PTR DS:[ESI]
00401154 XOR AL, 3
00401156 MOV BYTE PTR DS:[ESI],AL
00401158 INC ESI
00401159^LOOPD SHORT Virus.00401152

Шифрованием является простой побайтовый XOR. Какую область памяти программа расшифровывает? Этой областью оказывается буфер, в который программа предварительно записала содержание текущего исполняемого файла, причём расшифровка начинается со смещения 0х1200. Вы ещё не догадались что происходит? Смотрим далее – после этого программа записывает расшифрованные данные во временный файл и запускает последний на исполнение, передавая текущие параметры командной строки. Теперь можно с уверенностью сказать, что данная программа самым примитивным образом заражает исполняемые файлы, шифруя их содержимое и сбрасывая полученные зашифрованные данные в оверлей собственного файла, который записывается вместо заражаемой программы. А при запуске вирус расшифровывает оверлей, сохраняет его во временный файл и запускает исходную программу на исполнение. Просто и банально.
Узнаем теперь, что же происходит дальше:
image

Дальше программа запускает ещё один поток и ждёт завершения, как исходной программы, так и созданного потока. Что же происходит в созданном потоке?
image

Программа определяет, запущена ли уже в системе копия вируса путём проверки существования глобального идентификатора «MTV-2» — если он существует, значит, копия вируса уже запущена, иначе этот идентификатор создаётся, после чего вызывается ещё одна функция вируса. Посмотрим, что она делает:
image

Как и ожидалось это функция рекурсивного обхода папок на диске, которая заражает все найденные исполняемые файлы. Меня здесь заинтересовало два момента. Первый – функция переходит к обработке следующего файла только через 5 секунд из-за задержки WinAPI функцией Sleep. Из этого следует что вирус будет очень-очень медленно перебирать все файлы и все время висеть в списке задач. Ну и следующий код:

004013C6 PUSH Virus.004032D6
004013CB CALL JMP.&KERNEL32.GetSystemTime
004013D0 CMP WORD PTR DS:[4032DC], 0D
004013D8 JNZ SHORT Virus_Wi.004013E6
004013DA PUSH Virus.004031A6
004013DF CALL JMP.&KERNEL32.DeleteFileA

Если сегодня 13 число любого месяца, то функция удаляет все найденный файлы… На этом весь бедный функционал данного вируса и заканчивается.

Выводы: сегодня мы разобрали простой в устройстве и быстрый в написании вирус, создание которого не требует специальных знаний и под силу практически любому начинающему программисту. При этом функционал вируса так же крайне беден. Видно, что у программиста не было никакой тяги к творчеству — всё было нацелено на быстрый результат. Хотя… Я совершенно не могу понять для какой цели данный вирус, вообще, предназначен? Все-таки за 10 лет вредоносное ПО сделало большой шаг в своём развитии.
Tags:
Hubs:
Total votes 49: ↑46 and ↓3+43
Comments29

Articles