Вирусы (и антивирусы)

индекс
185,66

Нецензурный троян.

В общем, с этим трояном все было понятно с самого начала: что-то он из сети качает. Но в силу некоторых причин (одна из них - детект каспером как P2P-Worm.Win32.Socks.s) я решил его "разобрать". Под катом - технические подробности вскрытия трояна. Внимание, наличествуют не совсем цензурные слова и много технических подробностей!


Сегодня на столе файл services.exe, чуть менее 20000 байт. Не упакован, писан на VC какой-то из версий.
IDA после обработки файла останавливается на WinMain. А в WinMain мы тут же видим:

.text:00403444 push ebp
.text:00403445 mov ebp, esp
.text:00403447 push 0FFFFFFFFh
.text:00403449 push offset unk_404140
.text:0040344E push offset loc_403540
.text:00403453 mov eax, large fs:0
.text:00403459 push eax
.text:0040345A mov large fs:0, esp
.text:00403461 push ecx
.text:00403462 push ecx
.text:00403463 sub esp, 10h
.text:00403466 push ebx
.text:00403467 push esi
.text:00403468 push edi
.text:00403469 mov [ebp+var_18], esp
.text:0040346C and [ebp+var_4], 0
.text:00403470 and dword ptr [ebp+Time+4], 0
.text:00403474 mov eax, dword ptr [ebp+Time+4]
.text:00403477 mov dword ptr [eax], 0DFADBABEh
.text:0040347D or [ebp+var_4], 0FFFFFFFFh
.text:00403481 jmp loc_40352B
..............
.text:0040352B loc_40352B: ; CODE XREF: WinMain(x,x,x,x)+3D
.text:0040352B mov ecx, [ebp+var_10]
.text:0040352E mov large fs:0, ecx
.text:00403535 pop edi
.text:00403536 pop esi
.text:00403537 pop ebx
.text:00403538 leave
.text:00403539 retn 10h
.text:00403539 _WinMain@16 endp

Но обратим внимание на код, начинающийся с адреса 0x403470 - явная попытка обратиться к адресу 0x000000! В этом месте вызывается обработчик SEH, и в итоге управление-таки передается куда следует. Подобный трюк используется еще как минимум один раз в WinMain. Но WinMain подготовила еще пару сюрпризов, например управление передается на такой код:

.text:00401EA3 loc_401EA3: ; CODE XREF: WinMain(x,x,x,x):loc_4034C9
.text:00401EA3 push ebp
.text:00401EA4 mov ebp, esp
.text:00401EA6 push 0FFFFFFFFh
.text:00401EA8 push offset unk_404120
.text:00401EAD push offset loc_403540
.text:00401EB2 mov eax, large fs:0
.text:00401EB8 push eax
.text:00401EB9 mov large fs:0, esp
.text:00401EC0 push ecx
.text:00401EC1 push ecx
.text:00401EC2 push ecx
.text:00401EC3 push ebx
.text:00401EC4 push esi
.text:00401EC5 push edi
.text:00401EC6 mov [ebp-18h], esp
.text:00401EC9 and dword ptr [ebp-4], 0
.text:00401ECD mov eax, 1
.text:00401ECD ; ---------------------------------------------------------------------------
.text:00401ED2 dw 3F0Fh
.text:00401ED4 dd 45C70B07h, 0FFFFFFFCh, 0FC4D83FFh, 6A14EBFFh, 8BC35801h
.text:00401ED4 dd 6580E865h, 4D8300E7h, 458AFFFCh, 0B002EBE7h, 0F04D8B01h
.text:00401ED4 dd 0D8964h, 5F000000h, 0C3C95B5Eh

Неверный опкод. Olly в этом месте наглухо отказывается перемещаться на следующую инструкцию. То есть имеем своеобразный антиотладочный прием. И последняя хитрость - обнаружение VMWare которое быстро и просто опознается по таким инструкциям:

.text:00401F34 mov eax, 'VMXh'
.text:00401F39 mov ebx, 8685D465h
.text:00401F3E mov ecx, 0Ah
.text:00401F43 mov dx, 5658h
.text:00401F47 in eax, dx

На самом деле, WinMain выполняет две функции: осложняет жизнь исследователю и передает (если все как надо) управление на полезную нагрузку. WinMain я не проходил, а в самом ее начале переместил EIP сразу на PayLoad. Сначала, как и водится, троян подготавливает для своих черных дел данные: расшифровывает все строки и узнает адреса нужных API-функций (LoadLibrary + GetProcAddress, причем не в цикле). Шифрование строк - XOR одним байтом, правда ключ везде разный. Алгоритм легко распознается:

.text:0040100E loc_40100E: ; CODE XREF: decryptXor+37 j
.text:0040100E mov eax, [ebp+pos]
.text:00401011 inc eax
.text:00401012 mov [ebp+pos], eax
.text:00401015
.text:00401015 loc_401015: ; CODE XREF: decryptXor+C j
.text:00401015 push [ebp+lpString] ; lpString
.text:00401018 call ds:lstrlenA
.text:0040101E cmp [ebp+pos], eax
.text:00401021 jge short loc_401039
.text:00401023 mov eax, [ebp+lpString]
.text:00401026 add eax, [ebp+pos]
.text:00401029 movsx eax, byte ptr [eax]
.text:0040102C xor eax, [ebp+key]
.text:0040102F mov ecx, [ebp+lpString]
.text:00401032 add ecx, [ebp+pos]
.text:00401035 mov [ecx], al
.text:00401037 jmp short loc_40100E

На Delphi, кстати, такая функция расшифровки заняла бы страницы две. За что я Delphi и не люблю.
Затем идет вызов WSAStartup - подготовка к работе с Windows Sockets, попытка удалить файл c:\stop (именно по имени этого файла троян однозначно идентифицируется), подготовка строк, содержащих нужные пути. Интересен следующий момент: троян открывает свой файл на чтение, перемещает позицию чтения на 0x43 байт и читает оттуда 8 байт. Смотрю в HIEW на это место... Оппа! Да у нас тут ВРУЧНУЮ модифицированный заголовок! 0x43 - как раз начало строки "This program...", а у нас тут load\0. Следующим номером нашей программы - вычисление некой уникальной строки на основании пути к системному каталогу винды и серийного номера диска. Теперь троян будет проверять наличие в системе двух файлов: %Windows%\system32\drivers\services.exe и svchost.exe в каталоге текущего пользователя. Когда троян не установлен в системе, осуществляется переход на очень интересный код. Сперва из строки (!) через собственную реализацию функции atoi получается число, которое затем умножается на 1000, и полученный результат передается в функцию Sleep, то есть осуществляется регулируемая задержка. Задержка перед тем, как троянец получит аргументы командной строки, соберет их все вместе и передаст в WinExec. Наводит на подозрения, что троян может быть прописан в качестве дефолтной программы для открытия файлов! Отсутствие аргументов обрабатывается корректно. Перед выполнением деструктивных действий троян проверяет наличие в системе мьютекса, и если мьютекс уже есть завершает свою работу. Если же собратьев нет - создает две нити, одна из которых проверяет в цикле наличие файла c:\stop (если он есть - завершает процесс), а вторая осуществляет работу с сетью. Последний штрих - извлечение из своего тела файла ftp34.dll (шифрование XOR'ом, ключ - 1 байт) в каталог пользователя и системный каталог с последующей ее загрузкой. Для усложнения жизни пользователя, дата создания этих файлов будет такой же, как и у системных.

Сетевая активность.
Вся работа с сетью сосредоточена в одном из потоков трояна. В этом же потоке троян копирует себя в %Windows%\system32\drivers\services.exe, файл svchost.exe в каталоге текущего пользователя и файл userinit.exe в "Автозагрузке" в Главном Меню винды (и тоже правит дату). (На этом месте я сдуру выпустил трояна из под контроля и пришлось восстанавливать систему с образа). Прописывает в реестре, как минимум в 5 местах. И, как я и предполагал, прописывается как дефолтная программа для открытия EXE-файлов. Бряку на начало ThreadProc ставить не буду, опять тупо и цинично поменяю EIP на ее начало :-)
Так что же с сетью? Производится попытка запросить URL вида site.com/shl/?&v=load&lid=1033. Whois сообщает, что контактное мыло для этого сайта - на mail.ru, а IP адрес принадлежит российскому хостеру. Что же передается в URL'е? "load" - это как раз тот кусок, который был извлечен из заголовка сайта, а 1033 - идентификатор языка системы. Если зайти браузером на site.com/shl/ - там будет картинка и форма для логина.

Троян Залупко. Логотип с админки сайта
Вот такой вот логотипчик!



Поставил я на венду shttpd, прописал в etc/hosts 127.0.0.1 для site.com. Но есть проблема: shttpd плохо с урлами, содержащими "?" справляется. Проблема решается просто: скачиваем wget'ом нужный файл с сервера, переименовываем его в shl.txt, а перед вызовом InternetReadFile из трояна, патчим в памяти URL, чтобы он стал site.com/shl.txt. Теперь и сервер отдаст файл, и троян его примет. Сначала я думал, что трояну эта страница нужна, чтобы как-то отправить логин и пароль. Но все оказалось проще: троян ищет строку "form method" и если она есть продолжает качать. На этот раз скачивается файл с URL site.com/shl/manda.php?ns=1&id=1212312124, где id - уникальный номер (о получении см выше). Но этот файл у меня уже почему-то не скачался :-( Возможно, стоит блокировка по IP на сервере, кто знает... Но на работе файлик скачался. Там - список URLов открытым текстом. Код довольно простой, и становится понятно, что с указанных URLов качаются файлы и запускаются на исполнение, это производится из отдельного потока.

Итоги.
Касперы ошиблись с названием, а я в очередной раз убедился, что подобные файлы - как минимум Downloader'ы. Авторы трояна - русскоязычные товарищи, продают троянца... Меньше 20% кода детально не разобраны, но судя по описанию на сайте авторов, а также по текстовым строкам, троянец способен собирать email-адреса для спам-рассылок. Библиотека ftp34.dll скорее всего служит для перехвата паролей на доступ к FTP. Думаю, на работе смогу оставшуюся часть расковырять детально. Вот такой он, троян "залупко" :-)

UPDATE Продолжение http://vilgeforce.habrahabr.ru/blog/4414…
+108
8 июня 2008, 01:57
24

комментарии (51)

+14
Rchee #
Вы не могли бы почаще выкладывать подобные вещи? хоть и не все понял, ибо асму не знаю, но очень увлекло.
+2
vilgeforce #
Не, чаще точно не буду. Потому что когда я работаю, я все это держу в голове и в IDAшной базе. Чтобы записать эту информацию, анализ нужно, фактически, заново производить, и времени будет уходить гораздо больше... Начитывать на диктофон - тоже не выход, да и коллеги не поймут :-)
+2
RainFall #
Все равно, главное не останавливайтесь. Всегда любил читать обзоры про вирусы. Вам плюсик.
+1
rzoner #
на диктофон=)? прям как патологоанатом был бы=)
0
Shemet #
И в отдельный блог, чтоб потом легче искать было.
0
vilgeforce #
Дык это и есть отдельный блог. Я сюда буду писать в основном про вирусятину, для остального у меня ЖЖ есть :-)
0
vilgeforce #
Выложил. На ближайшие дни хватит с меня :-)
0
Herra #
И правда очень интересно. Спасибо. :)
0
vilgeforce #
Стараюсь понемногу :-)
0
vilgeforce #
Вторая серия готова, наслаждайтесь ;-)
0
Gard #
Спасибо за статью. Однозначно в избранное.
После прочтения возникли несколько вопросов:
Как Вы достали данный файл?
Где можно почитать про методы обнаружения и вышибания VMWare?
+2
vilgeforce #
Я вирусным аналитиком работаю, такого "добра" приходит несколько штук в неделю. Притащил домой, разобрал по косточкам... :-)
Про обнуружение и защиту ВМВАРИ - http://www.google.ru/search?hl=ru&q=VMXh
Целенаправленные атаки - тут http://www.securitylab.ru/search/index.p…
Пока я встречал только один вирус, который VMWare в BSOD уводил. И делали ли это он специально - тоже вопрос...
+3
Mad_Fish #
Ох и корявый код для расшифровки xor-ом... Это же Си-строки, то есть в конце стоит 0. Код в трояне эквивалентен примерно такому

char* lpString;
for(int pos=0;pos>lstrlenA(lpString);pos++)
lpString[pos]^=key;

неудачно написано...

лучше так
char* lpString;
for(char* t=lpString;*t!=0;t++)
*t^=key;

зачем lstrlen вызывать?..
0
vilgeforce #
Корявый :-) Мало того, что strlen, так еще и в каждой итерации цикла она будет вызываться :-) Я для расшифровки на IDAScript написал как раз с проверкой на нулевой байт.
0
Nakilon #
почему lstrlen?
делфя...
0
vilgeforce #
http://msdn.microsoft.com/en-us/library/… Функция с именем strlen находится в kernel32.dll. А при чем тут дельфя?
0
Nakilon #
Я имею ввиду логику автора, который вместо того, чтобы искать в конце ноль, выбрал именно такой способ. Просто он мыслил делфей.
0
vilgeforce #
А... Хм, не задумывался об этом. Хотя, это может быть довольно распространенной ошибкой: for (i=0;i
0
vilgeforce #
Тьфу, lstrlen, конечно! Но ссылка верная.
0
blasto #
Товарисч, я нихрена не понял, но вы просто ГУРУ. )
0
vilgeforce #
Да не гуру я. Троян простой, да и не до конца расковырял. Для меня есть много тем в это области, в которых я "ни в зуб ногой". Гуру - они куда как более серьезными вещами занимаются.
0
VYBGSS #
Круто. Не часто встретишь настолько продуманный троян. Защита от дебага (само-модифицирующийся код), защита от ВМВейр и.т.д... А также не часто встретишь настолько хорошего специалиста =).
0
vilgeforce #
Да обычный троян. Разве что написан понятно. Кстати, тут НЕТ самомодификации кода, только противодействие отладке и ВМвари. Из самомодифицирующегося кода сразу вспоминается какой-то упаковщик, он в коде 1 байт правил, после чего переходил на начало себя, проверял этот байт и выполнялась уже другая его ветвь.
0
EugeneDest #
Ну, не скромничайте ;)
0
vilgeforce #
Я довольно объективно оцениваю свои способности. У нас на работе ТАКИЕ монстры есть, что для них это - детский лепет :-)
Сейчас разбираю ftp34.dll, которую этот троян дропает. Вот там - действительно интересно!
0
AntiDot #
В очередной раз интересно и увлекательно. Спасибо!
0
vladon #
А защита от VMWare срабатывает на MS VirtualPC/MS Virtual Server? Просто интересно.
0
vilgeforce #
Не должна. Фишка с VMXh - специфична для VMWare.
0
lgar #
очень интересно было прочитать, теперь примерно представляю как антивирусные лаборатории разбирают всякие трояны и др. вредоносные программы. Спасибо.
0
vilgeforce #
Ну, как Каспер их разбирает - мне неведомо. Ибо НАСТОЛЬКО неверное имя дать - это умудриться надо было :-)
Обычно, кстати, такой детальный анализ я не провожу, функционал примерно ясен по поведению и/или по строкам в файле.
+1
skitels #
залупко, как мило)
0
Captcha #
Интересно, хотя мало что понятно =)
А если юзать не WmWare, а Virtual PC, например?
0
vilgeforce #
Не знаю, не пробовал. Проще пропатчить вмварь, тогда такой очевидный способ перестанет работать, но останутся другие, о которых ничего определенного сказать не могу.
0
teitan #
интересно сколько времени заняло написание этого трояна и сколько времени ушло на его детальное понимание? интересно соотношение времени пишущих и копающих :)
0
vilgeforce #
Хм... Ну настолько детальное понимание съело около 2 часов на работе. Дома повторный анализ занял 4 часа, потому как у меня не ВМ, пришлось дважды с образов восстанавливаться. Да и неудобно с одной машины на другую материалы гонять - я на одной машине ковырялся, на второй описалово писал :-)
Сколько у создателей ушло - не знаю, но думаю что не меньше тех же 4 часов.
0
IDDQD #
Прикольно :)
0
niazique #
Хороший логотип и нейминг!
0
vilgeforce #
Да URL для списка файлов тоже хорош: manda.php :-D
0
0xE0 #
Не понял только зачем нужно было метать какашку в огород делфи.
0
vilgeforce #
Никто и не метал. Я констатировал 2 факта: код, аналогичный приведенному на дельфи будет занимать пару страниц, то есть в несколько раз больше. И второй факт - я не люблю дельфи.
+1
0xE0 #
Врёте.

program SXor;

uses
Windows;

Var S:String;
I:Dword;
begin
S:='AsdfgsdfgsdfFdsgfhfhgjfukik';
for I:= 1 to Length(S) do S[I]:=CHR(ORD(S[I]) XOR 15);
Writeln(S);
end.

004040D9 . BA 5C414000 mov edx, SXor.0040415C ; ASCII "AsdfgsdfgsdfFdsgfhfhgjfukik"
004040DE . E8 D9F9FFFF call SXor.00403ABC
004040E3 . A1 F0874000 mov eax, dword ptr [4087F0]
004040E8 . 85C0 test eax, eax
004040EA . 74 05 je short SXor.004040F1
004040EC . 83E8 04 sub eax, 4
004040EF . 8B00 mov eax, dword ptr [eax]
004040F1 > 8BF0 mov esi, eax
004040F3 . 85F6 test esi, esi
004040F5 . 76 25 jbe short SXor.0040411C
004040F7 . BB 01000000 mov ebx, 1
004040FC > B8 F0874000 mov eax, SXor.004087F0
00404101 . E8 6AFAFFFF call SXor.00403B70
00404106 . 8B15 F0874000 mov edx, dword ptr [4087F0]
0040410C . 0FB6541A FF movzx edx, byte ptr [edx+ebx-1]
00404111 . 80F2 0F xor dl, 0F
00404114 . 885418 FF mov byte ptr [eax+ebx-1], dl
00404118 . 43 inc ebx
00404119 . 4E dec esi
0040411A .^ 75 E0 jnz short SXor.004040FC
0040411C > A1 94574000 mov eax, dword ptr [405794]
00404121 . 8B15 F0874000 mov edx, dword ptr [4087F0]
00404127 . E8 4CFAFFFF call SXor.00403B78
0040412C . E8 CFEFFFFF call SXor.00403100
0
vilgeforce #
Если ваш код короткий, это еще не говорит о том, что он не может быть длинным. Циклы XOR видел и существенно длиннее.
0
0xE0 #
Просто я считаю что дело не совсем в компиляторе, даже если он далеко не образцовый ;)
0
vilgeforce #
Да компилятор-то, черт с ним... А вот постоянные Call'ы к библиотечным функциям, огромный размер библиотечного кода (даже в элементарных проектах) - вот это не есть гуд. Был бы под рукой Banker какой - смог бы показать соотношение либ к юзерскому коду. Да и Delphi нет, на примере Hello World тоже не покажу.
0
0xE0 #
Соглашусь, но это если использовать делфи таким, каким его продают.
0
sol1tude #
Отличный дизайн лого.
+2
neperap #
Артемий?
0
dva #
Душевно, подробно и читаемо. Почти профессионально. Общее впечатление сильно портит эпатаж про Delphi - пионэрский и неуместный.
0
0xE0 #
Обещаю, больше не буду.
0
superman #
интересно
0
alexbig #
спасибо, в который раз увлекаете своими разборами.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.