<< Все статьи по взлому Сам себе антивирус Обсудить эту статью >>
Автор:Bokiv [AHTeam]
Уровень:Для опытных
Программа:Cетевой червь Win32.Mytob.D
Инструменты:OllyDbg 1.10, PE Tools 1.5, ImpREC 1.6, PEiD v0.93, Yoda Crypter 1.3

[Программы и файлы, используемые в статье]

Сам червь: mytob.rar (46.5 Кб) - осторожнее!
Пароль на архив: 000
В целях безопасности у файла удалено расширение ".exe"

OllyDbg 1.10
PE Tools 1.5
Import REConstructor 1.6 final
PEiD v0.93
Yoda Crypter 1.3

[Вступление]

Нынче мода пошла такая: написал чувак вируса или червяка на HLL, и давай его паковать и защищать чем-нибудь навесным. Вирусмейкер надеятся тем самым для аверов анализ вредоносного кода затруднить, да и жизнь простым смертным реверсерам подпортить, чтобы не поняли они, что плод злого гения делает, куда пишется и т.п. Нас такими дешевыми уловками не проведешь, мы протекторы в раз снимем!

[паразит]

Взять, к примеру, довольно популярного зверя Mytob.D. Попадет к тебе такой, и что ты будешь делать? На аверов молиться? Это не наши методы, Шура! Его надо своими средствами вскрыть, исследовать и нафиг из системы удалить. Однако пассивным дизассемблированием тут не обойдешься. Ida Pro тебе не выплюнет ничего членораздельного в ответ на скормленного ей червяка. В данном случае такая шняга произойдет потому, что вирус долго и усердно паковали и защищали. Благо, мы знаем, как в таких случаях поступать: грузим PEiD. Порывшись в своей базе сигнатур замечательная тулза выдаст нам верхний слой защиты - yoda's Protector 1.3 -> Ashkbiz Danehkar. Этот протектор, по правде говоря, просто обожают разработчики разного рода нечести. Вот, посмотри, что о нем пишут:

- поддержка большинства форматов PE-файлов;
- маленький размер дистрибутива;
- быстрота работы;
- полиморфное шифрование;
- проверка CRC-суммы;
- переадресация API-функций;
- удаление заголовков PE;
- антиотладчик;


И со всем этим предстоит разобраться. Но это еще не все. Если внимательно посмотреть на название секций (UPX0, UPX1, UPX2, yC), можно сделать один не самый утешительный вывод. Под йодой живет UPX. Ок, нет проблем, и его порвем. Вспоминаем основы снятие защит и принимаемся за работу.

1. Нахождение оригинальной точки входа (OEP).
2. Снятие дампа программы.
3. Восстановление таблицы импорта.

[нахождение оригинальной точки входа]

Первое, что нам необходимо - это найти ЕР упакованного червя, а затем уже ОЕР самого червя. Надеюсь, у тебя уже стоит замечательный ОllyDbg. Запускаем и открываем в нем червя. Стоп! Чуть не забыл. Советую проводить все опыты на виртуальной машине, так как активный анализ (то есть с запуском) вирусного кода - штука достаточно опасная. Итак, отладчик попросит проанализировать файл - нажимаем "нет". Курсор отладчика стоит здесь на EP:

0041B060	PUSH EBP
0041B061 MOV EBP, ESP
0041B063 PUSH EBX
0041B064 PUSH ESI
0041B065 PUSH EDI
0041B066 PUSHAD

Почти все распаковщики перед своей работой сохраняют все значения регистров в стеке командой PUSHAD, а после работы восстанавливают их командой POPAD. То есть нужно найти ниже команду POPAD и поставить на ней брейкпоинт. Если мы начнем трассировку программы или просто запустимся по F9, то сработает исключение, в результате которого отладчик или выдаст ошибку, или просто закроется. Причина кроется в распаковщике: он получает информацию о том, что программа отлаживается в данный момент. Ключом является функция Windows под названием IsDebuggerPresent, благодаря чему нас и обнаруживает распаковщик. Данная функция возвращает единицу, если отладчик обнаружен, и ноль — если нет. Вбиваем в командной строке Оли bp IsDebuggerPresent и нажимаем Enter. Если у тебя командная строка не активирована - нажимай Alt+F1. Остается запустить программу и надеяться на то, что бряк заработает. Как ни странно, он сработал, и мы оказываемся здесь.

7C812E03	MOV EAX,DWORD PTR FS:[18]
7C812E09 MOV EAX,DWORD PTR DS:[EAX+30]
7C812E0C MOVZX EAX,BYTE PTR DS:[EAX+2]
7C812E10 RETN

Пройдем до RETN по F8. Вот посмотри: значение регистра EAX равно единице - это результат работы функции IsDebuggerPresent, то есть отладчик обнаружен. Кликни по регистру EAX в отладчике и введи вместо единицы ноль. Дальше можешь выходить из функции по F8. Вышел? Смотрим дальше - видим код:

0041B88C	JE SHORT Mytob.0041B890
0041B88E POPAD
0041B88F RETN

Интересное место. Если отладчик обнаружен, то переходим на команду POPAD, где искусственно создается исключение, так как POPAD отработал раньше времени! Но мы обманули протектор и поэтому спокойно перепрыгиваем ловушку. Теперь давай искать дальше POPAD’ы. Сразу скажу это примерно на 40 строк вниз.

0041B8F9	POPAD				<- ставим брейкпоинт
0041B8FA JMP SHORT Mytob.0041B8FE
0041B8FC INT 1
0041B8FE RETN

Посмотрим еще ниже и опять:

0041B975	POPAD				<- ставим брейкпоинт
0041B976 PUSH EAX
0041B977 XOR EAX, EAX
0041B979 PUSH DWORD PTR FS:[EAX]
0041B97C MOV DWORD PTR FS:[EAX],ESP
0041B97F JMP SHORT Mytob.0041B982

Как видишь, я установил брейкпоинты на два найденных мной вызова POPAD. Делай то же самое и запускай программу. Оля остановилась на 0041B975, а дальше (0041B982) идут команды, которых не было, когда мы смотрели код после остановки на IsDebuggerPresent (полиморфный код для сокрытия ЕР upx)! Команда POPAD отработала, а значит, где-то рядом должен быть нужный нам переход. Пройдемся по F8 и посмотрим, что же будет дальше. По адресу 0041B982 происходит исключительная ситуация, проходим ее по Shift+F8 и попадаем в системную библиотеку ntdll:

7C90EAF0	MOV EBX,DWORD PTR SS:[ESP]
7C90EAF3 PUSH ECX
7C90EAF4 PUSH EBX
7C90EAF5 CALL ntdll.7C9377C1
7C90EAFA OR AL,AL
7C90EAFC JE SHORT ntdll.7C90EB0A
7C90EAFE POP EBX
7C90EAFF POP ECX
7C90EB00 PUSH 0
7C90EB02 PUSH ECX
7C90EB03 CALL ntdll.ZwContinue

Скажу сразу: если пройти CALL (7C90EB03) по F8, то программа запустится, значит, мы дойдем до адреса 7C90EB02 (F8) и посмотрим содержимое стека. Если не знаешь что это такое, то тебе рановато еще читать эту статью. Будем искать адрес, который меньше, чем EP протектора (0041B060). Просмотрим правое нижнее окно Оли (стек):

0012FD7C	7C910738 ntdll.7C910738
0012FD80 FFFFFFFF
0012FD84 20008332
0012FD88 7C90EB94 ntdll.KiFastSystemCallRet
0012FD8C 0012FFB0
0012FD90 00000000
0012FD94 0012FFC0
0012FD98 00419910 Mytob.00419910 <- этот адрес нам подходит!
0012FD9C 0000001B
0012FDA0 00010246 UNICODE "_HOST_CHECK=NO"

Итак, сравним:

00419910 - найденный нами адрес.

0041B060 - EP протектора.

Ух, я уже на ЕР UPX! Ты еще нет? Тогда быстрей ставь брейкпоинт на 00419910 (bp 00419910), дави Enter, потом F9 — и ты со мной. Если ты видишь кучу нулей, то нажми Ctrl+A — Оля проанализирует код. Тут уже совсем все просто: надо всего лишь распаковать UPX.

00419910	PUSHAD				<- стоим здесь
00419911 MOV ESI,Mytob.0040F000
00419916 LEA EDI,DWORD PTR DS:[ESI+FFFF2000]
0041991C PUSH EDI
0041991D OR EBP,FFFFFFFF
00419920 JMP SHORT Mytob.00419932

Опять знакомая команда PUSHAD! Теперь крутим мышкой вниз, пока не увидим:

00419A67	POPAD
00419A68 JMP Mytob.0040A0EB <- это OEP "червя"
00419A6D ADD BYTE PTR DS:[EAX],AL <-а куча этих строк не даст ошибиться!
00419A6F ADD BYTE PTR DS:[EAX],AL

Ставим брейкпоинт на POPAD 00419A67, нажимаем F9 и два раза F7. Все мы находимся на OEP

"червя". Запишите это значение (у меня это 0040A0EB).

[дамп]

Для дампа воспользуемся программой PE Tools. Перед тем как снять дамп, давай проведем некоторую настройку самой программы. Заходи в Options программы и смотри. Внутри панели Task Viewer должен стоять флажок только напротив Full dump: fix Header. После того как ты это сделаешь (а я это уже сделал) мы с тобой продолжим. Выбираем из списка процессов червя -->, в контекстном меню жмем Dump Full. Думаю, с вводом имени файла проблемы возникнут только у безруких инвалидов :). Сперва необходимо провести небольшую оптимизацию данных. Как ты знаешь, наш протектор переименовал имена всех секций, однако тут все понятно: первые две секции – это секции кода протектора и распаковщика UPX, остальное – нормальная программа, просто переименованная. Нажимаем меню Tools->PE Editor и указываем червя. Теперь обрежем лишние секции протектора и упаковщика, про которые я только что сказал. Видишь кнопку Sections? Нажимай и обрезай две нижние секции с именами UPX2, yC кнопкой в меню Kill section (from file). Ну вот, теперь мы снова вместе. После восстановления импорта, описанного ниже, можно сделать rebuild (кнопка rebuild pe), при этом оптимизируется PE-заголовок файла, что может уменьшить его размер на несколько килобайт, к тому же происходит оптимизация внутренней структуры и расположения данных в файле. Также можно воспользоваться rebuild для восстановления файла после распаковки протекторов и упаковщиков.

[восстановление импорта]

Импорт мы будем восстанавливать с помощью одной замечательной программы - Import Recontructor. После запуска найди в списках процессов нашего червя (если ты уже все закрыл, то придется запускать файл С:\WINDOWS\system32\wfdmgr.exe).

Теперь нам необходимо указать RVA OEP (в ImpRec он просто OEP). Формула тут проста, как int 21h - "RVA OEP = VA OEP - ImageBase". Это надо знать наизусть! Image Base находится все в том же PETools, в главном окне. В нашем случае RVA = 01006420 – 01000000 = 6420. Вводим это значение в поле OEP и нажимаем кнопку IAT AutoSearch (то есть автопоиск). Программа найдет ссылки на функции таблицы импорта, затем мы получим саму таблицу, нажав на кнопку «Get Imports» (Получить импорты). Мы должны увидеть строки с функциями и надписью YES напротив. Если все так, а так и должно быть, то кнопка Fix Dump направляет нас на путь истинный. Указывай наш дамп в появившемся окне — и вуаля. Все готово!

[уроки анатомии]

Что теперь? Теперь приступаем к исследованию. Перед нами, как ты видишь, голый вирус. Если не веришь, то запусти PEiD. Надо отметить, что до этого мы занимались крэкингом, то есть распаковывали файл, снимали защиту. Сейчас же перейдем к реверс-иженерингу. Реверс – далеко не крэкинг. Это более фундаментальное понятие, которое заключается в (да простят меня боги за тавтологию) понимании работы программы, исходя из дизассемблерного листинга. Углубляться в это дело мы сейчас не будем, так как нас интересуют только некоторое моменты: как существует вирус, что он делает и где живет в системе. Конечно, есть множество антиотладочных ухищрений, но в этом случае все не так просто. Прежде всего в таблице импорта содержатся функции работы с сетью. Сперва идут функции работы с файлами — вот их-то мы и рассмотрим для начала. Давай поставим бряки на CreateFile и CopyFile. Запускаем! Видим перед собой очень хорошую строку:

00407BA4 FF15 24114100 CALL DWORD PTR DS:[<&kernel32.CopyFileA>>; kernel32.CopyFileA

Если посмотрим в стек, то можем увидеть новое имя файла: NewFileName = "C:\WINDOWS\system32\wfdmgr.exe". Теперь понятно: вирус проверяет, где он находится, и если он не в системной директории, то копирует себя в нее. Далее следует запуск вышеуказанного файла и завершение исходного процесса. Для дальнейшего продолжения исследования следует обмануть вирус. Можно скопировать его, куда он просит, а можно просто-напросто обойти функцию проверки — это как тебе будет угодно. Я лично скопировал. Так, едем дальше - DeleteFile. Что же он удаляет? Нашел или подсказать? Первой же функцией он удаляет C:\WINDOWS\system32\msnmsgr.exe, затем копирует себя в эту папку и открывает сокетное соединение. Кроме этого, червяк гадит в реестре. О, вижу ты уже совсем вошел в раж и поставил бряки на RegOpenKey. Замечательно, так ему, гаду, и надо!

00403F90	51	PUSH ECX
00403F91 68 19000200 PUSH 20019
00403F96 6A 00 PUSH 0
00403F98 52 PUSH EDX
00403F99 68 01000080 PUSH 80000001
00403F9E FF15 08104100 CALL DWORD PTR DS:[<&advapi32.RegOpenKey>; advapi32.RegOpenKeyExA

Угу, функция есть, смотрим стек:

00E7FE44	80000001	|hKey = HKEY_CURRENT_USER
00E7FE48 00E7FE60 |Subkey = "Software\Microsoft\WAB\WAB4\Wab File Name"
00E7FE4C 00000000 |Reserved = 0
00E7FE50 00020019 |Access = KEY_READ
00E7FE54 00E7FE58 \pHandle = 00E7FE58

Следует ли объяснять, что происходит в этот момент? Червь ищет WAB-файлы. Это же файлы адресных книг аутглюка! Да-да, червь грабит все мыльники и рассылает себя по ним. Дальше уже просто: все делаем аналогично, так что писать тут про остальные функции я не буду. Однако мы пропустили работу червя с сетью… Извини, но в эту статью уже не поместится полный анализ. Думаю, дома ты с легкостью теперь сможешь и сам это проанализировать. Каркас действий мы с тобой разработали. Итак, мы сделали простейший анализ за 15 минут, не правда ли здорово? Еще 15-20 минут таким темпом — и вирус у нас полностью обезврежен. Может быть, пора сделать свою антивирусную лабораторию?

[вместо заключения]

Да, теперь мода пошла писать всякую зараазу. Но нашаа сс тобой задача - опережать это движение, пускай лишь на один шаг, но все же, быть впереди. Внедряйся!

Net_Worm.Win32.Mytob.D – вот как пишут антивирусные лаборатории.

Сетевой вирус-червь, заражающий компьютеры под управлением Windows.

Вирус распространяется, используя уязвимость в сервисе Windows LSASS (MS04-011).

Также он распространяется через Интернет в виде вложений в зараженные электронные письма и рассылается по всем найденным адресам электронной почты. Вместо файла %System%\msnmsgr.exe червь создает %System%\wfdmgr.exe. Он регистрирует данный файл в ключах автозапуска системного реестра:

[HKCU\Software\Microsoft\Windows\CurrentVersion\Run]
[HKLM\Software\Microsoft\Windows\CurrentVersion\Run]
[HKLM\Software\Microsoft\Windows\CurrentVersion\RunServices]
[HKCU\SYSTEM\CurrentControlSet\Control\Lsa]
[HKCU\Software\Microsoft\OLE]

"LSA"="wfdmgr.exe"


WARNING!

Если ты распаковывал "червя", то не забудь уничтожить процесс wfdmgr.exe и удалить файл C:\WINDOWS\system32\wfdmgr.exe.



21.04.2006 by Bokiv [AHTeam]

<< Все статьи по взлому Обсудить эту статью >>

ALIEN Hack Team - http://ahteam.org
Только для образовательных целей