• Поиск
  • Кодер HEX
  • Чекер proxy
  • CSRF/XSS форма

ЦИКЛЫ СТАТЕЙ:

  • 4. SHELL
  • 4.1. ANDROID SHELL
  • 4.2. WINDOWS. КОМАНДНАЯ СТРОКА
  • 4.3. LINUX. UNIX SHELL
  • 4.4. SHELL НЕ БЕЗ METASPLOIT
  • 4.5. WEB SHELL

САМ СЕБЕ АНТИВИРУС

Автор: Bokiv [AHTeam]
Ссылка на оригинальную статью.

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

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

ПРОГРАММЫ

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

ПАРАЗИТ

Взять, к примеру, довольно популярного зверя 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. После запуска найди в списках процессов нашего червя (если ты уже всё закрыл, то придётся запускать файл C:\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-файлы. Это же файлы адресных книг Outlook’а! Да-да, червь грабит все мыльники и рассылает себя по ним. Дальше уже просто: всё делаем аналогично, так что писать тут про остальные функции я не буду. Однако мы пропустили работу червя с сетью… Извини, но в эту статью уже не поместится полный анализ. Думаю, дома ты с легкостью теперь сможешь и сам это проанализировать. Каркас действий мы с тобой разработали.

ЗАКЛЮЧЕНИЕ

Итак, мы сделали простейший анализ за 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]

Теги:

Автор: