Добренького времени суток Вам дорогие друзья!
Сарафанное радио снова на связи. Хочется многое рассказать и показать, но время к сожалению ограничено. Наша передача идет в прямом эфире и приходится следовать рамкам сюжета ?
Многие знают что я стал совладельцем лоадера Andromeda. И, по большому счету, не имею уще права писать обзоры. Особенно обзоры других лоадеров. Так сложилось, что этот лоадер попал ко мне на обзор задолго до того как все завертелось. Потом были задержки с моей стороны, потом со стороны автора. В общем за это время многое поменялось. Но перед автором у меня остался долг, который я намерен отдать.
Итак, приступим.
Сегодня будем рассматривать нутро Power Loader.
Если вы приготовились сидеть и смотреть проценты отстука и прочее – я вынужден вас разочаровать. Все меняется и течет своим чередом. Вот и заключительные свои повествование я хочу провести в ином русле.
----===Админка===---
Установка элементарна. Ну ладно. Элементарна для нас с вами. Как оказалось, для амеров это задача. Притом не легкая. (прим. Из личного опыта)
Заливаем файлики на хостинг/сервер, создаем БД. Бережно вбиваем в установочник и … бинго. Нас встречает админка. Приятная, ничего лишнего. !Рис.1
---===Заявленные обходы===---
собственно, хочется сказать вот что. С этим тестом с самого начала как-то не заладилось. Не все из выбранных мной АВ обходило. О чем я непременно сообщил автору. Автор после некоторого пропадания сказал что когда в спешке давал мне билд, что-то там перепутал. И выдал другой. Поэтому пришлось в два этапа. Некоторые тесты по два раза делал.
win7 32 bit, user account
Avast internet security - установка по умолчанию и обновление. - два алерта подряд. В админку не отстучался. !Рис.2 | !Рис.3
Тест2. После апдэйта - два тех же алерта подряд. В админку не отстучался.
Avira internet security - установка по умолчанию и обновление. - полет нормальный.
Comodo internet security - установка по умолчанию и обновление. - запуск автоматом в sandbox, алерт что обнаружены признаки опасного ПО. !Рис.4
Тест2. После апдэйта - алерт, ушло в sandbox. В админку отстучался.
ESET NOD32 Smart Security 5 - установка по умолчанию и обновление. - полет нормальный.
Kaspersky internet security 2013 - установка по умолчанию и обновление. - полет нормальный.
OutpostSecuritySuite - установка по умолчанию. Убрал галочку об участии в анонимной отправке малвари. Выбрал простой режим. Алертов нет. В админку отстучался.
Zone Alarm - установка по умолчанию и обновление. - полет нормальный.
win7 32 bit, admin account
Avast internet security - установка по умолчанию и обновление. Алерт. Потом затуп на 3 минуты и второй алерт. !Рис.5 | !Рис.6
Тест2. После апдэйта - два алерта подряд. В админку не отстучался
Avira internet security - установка по умолчанию и обновление. - полет нормальный.
Comodo internet security - установка по умолчанию и обновление. - запуск автоматом в sandbox, второй алерт не появился. !Рис.7
Тест2. После апдэйта - алерт, ушло в sandbox. В админку отстучался.
ESET NOD32 Smart Security 5 - установка по умолчанию и обновление. - полет нормальный.
Kaspersky internet security 2013 - установка по умолчанию и обновление. - полет нормальный.
OutpostSecuritySuite - установка по умолчанию. Убрал галочку об участии в анонимной отправке малвари. выбрал простой режим. Алертов нет. В админку отстучался.
Zone Alarm - установка по умолчанию и обновление. - полет нормальный.
---===Реверс===---
Для данного обзора очень постарался наш хороший друг и отличный специалист своего дела – Steklo. Данный человек уже неоднократно помогал мне в обзорах и доказывал свои знания общественности. Читаем:
------------------------------------------------------------------------------------------
Поверхностный осмотр
------------------------------------------------------------------------------------------
Исполняемый Файл "dropper.exe.~". Размер 58368 байт. PE32(GUI). Версия компоновщика 10.0.
Имеет таблицу настроек адресов (Relocation Table), таблицу импорта (Import Table) и экспорта
(Export Table).
Исследование
------------------------------------------------------------------------------------------
Содержащаяся в исполняемом файле "dropper.exe.~" (Он же "sdropper32.exe") программа читает
значение "MachineGuid" ветки реестра "HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography".
Полученная строчка используется для генерации имен мьютексов и т.п. Далее осуществляется
проверка на повторный запуск и если она проходит успешно то создается ветка реестра
"HKEY_CURRENT_USER\SOFTWARE\bdebeabcfcdsacfsfdsf" со значением "CurrentPath"
которому присваевается путь к исполняемому файлу.
Затем программа пытается открыть одну из секций которые отображены во всех процессах:
"\BaseNamedObjects\ShimSharedMemory"
"\BaseNamedObjects\windows_shell_global_counters"
"\BaseNamedObjects\MSCTF.Shared.SFM.MIH"
"\BaseNamedObjects\MSCTF.Shared.SFM.AMF"
"\BaseNamedObjects\UrlZonesSM_Administrator"
"\BaseNamedObjects\UrlZonesSM_SYSTEM"
В моем случае открылась "\BaseNamedObjects\ShimSharedMemory".
Изменение памяти в такой секции приводят к изминению этой памяти во всех процессах. Можно
одним действием записать свой код разом во все процессы.
В конец открытой секции дописывается шелл-код адрес начала и конца которого экспортируется
как "InjectedShellCodeStart" и "InjectedShellCodeEnd". А так же адреса некоторых функций с
которыми работает шелл-код и прочие данные необходимые для работы.
32-битный шелл-код (81 байт) находится рядом с отчетом и называется "shellcode.bin".
И вот собственно копия памяти отображенной секции со скопированным программой шелл-кодом и
другими инициализированными данными.
Все размещается в деапазоне 00B00EСF-00B00FEF. Базовый адрес отображения секции: 00B00000.
До того как сдесь поработала программа весь диапазон 00B00EСF-00B00FEF был пуст.
Эта секция в процессе "explorer.exe" отображена по адресу 0AB0000 поэтому значения которые
в списке начинается с 0AB**** это в процессе "explorer.exe" те же адреса которые в
процессе программы начинаются с 0B0****.
Код:
--------------------------------------------------------------------------
Начало связанных с шелл-кодом данных
----------+----------+----------------------------------------------------
Адрес | Значение | Комментарий
----------+----------+----------------------------------------------------
00B00ECF | 00000000 |
00B00ED3 | 00000000 |
00B00ED7 | 00000000 |
00B00EDB | 00000000 |
00B00EDF | 0101177C | explorer.0101177C
00B00EE3 | FFFFFFFF |
00B00EE7 | 7C901934 | ntdll.atan
00B00EEB | 00AB0F9F |
00B00EEF | 00000051 |
00B00EF3 | 00AB0EFF |
00B00EF7 | 7C901934 | ntdll.atan
00B00EFB | 01002080 | explorer.01002080
00B00EFF | 00000000 |
00B00F03 | 00000000 |
00B00F07 | 00AB0F6F |
00B00F0B | 00000000 |
00B00F0F | 00000000 |
00B00F13 | 00000000 |
00B00F17 | 00000000 |
00B00F1B | 00000000 |
00B00F1F | 00000000 |
00B00F23 | 00000000 |
00B00F27 | 00000000 |
00B00F2B | 00000000 |
00B00F2F | 00000000 |
00B00F33 | 7C81C3D6 | kernel32.7C81C3D6
00B00F37 | 00000000 |
00B00F3B | 00000000 |
00B00F3F | 0101177C | explorer.0101177C
00B00F43 | 00000070 |
00B00F47 | 7C9015F8 | ntdll._chkstk
00B00F4B | 7C802213 | kernel32.WriteProcessMemory
00B00F4F | 00AB0F63 |
00B00F53 | 00000000 |
00B00F57 | 00000000 |
00B00F5B | 00000000 |
00B00F5F | 00000000 |
00B00F63 | 7C90E430 | ntdll.KiUserApcDispatcher
00B00F67 | 7C9EE6AE | SHELL32.7C9EE6AE
00B00F6B | 7C94D0CB | ntdll.7C94D0CB
00B00F6F | 7C80BC06 | kernel32.OpenFileMappingA
00B00F73 | 7C80B995 | kernel32.MapViewOfFile
00B00F77 | 7C809BD7 | kernel32.CloseHandle
00B00F7B | 7C8106C7 | kernel32.CreateThread
00B00F7F | 7E37C29D | USER32.SetWindowLongA
00B00F83 | 34646238 | / Имя секции с образом испольяемого
00B00F87 | 65376265 | | файла которая была отображена
00B00F8B | 0000002D | \ в процесс "explorer.exe".
00B00F8F | 010460F8 | explorer.010460F8
00B00F93 | 00140080 |
00B00F97 | 0000417E |
00B00F9B | 00000000 |
----------+----------+----------------------------------------------------
Код:
Непосредственно шелл-код
----------+----------+--------------------------------------+-------------
Адрес | Байт код | Инструкции | Комментарий
----------+----------+--------------------------------------+-------------
00B00F9F | 8BEC | MOV EBP,ESP |
00B00FA1 | 8B7508 | MOV ESI,DWORD PTR SS:[EBP+8] |
00B00FA4 | 33DB | XOR EBX,EBX |
00B00FA6 | 385E2C | CMP BYTE PTR DS:[ESI+2C],BL |
00B00FA9 | 7532 | JNZ SHORT 00B00FDD |
00B00FAB | 8D4614 | LEA EAX,DWORD PTR DS:[ESI+14] |
00B00FAE | 50 | PUSH EAX | / LPCTSTR lpName
00B00FAF | 53 | PUSH EBX | | BOOL bInheritHandle
00B00FB0 | 6A26 | PUSH 26 | | DWORD dwDesiredAccess
00B00FB2 | C6462C01 | MOV BYTE PTR DS:[ESI+2C],1 | |
00B00FB6 | FF16 | CALL DWORD PTR DS:[ESI] | \ kernel32.OpenFileMappingA
00B00FB8 | 8BF8 | MOV EDI,EAX |
00B00FBA | 3BFB | CMP EDI,EBX |
00B00FBC | 741F | JE SHORT 00B00FDD |
00B00FBE | 53 | PUSH EBX | / SIZE_T dwNumberOfBytesToMap
00B00FBF | 53 | PUSH EBX | | DWORD dwFileOffsetLow
00B00FC0 | 53 | PUSH EBX | | DWORD dwFileOffsetHigh
00B00FC1 | 6A26 | PUSH 26 | | DWORD dwDesiredAccess
00B00FC3 | 57 | PUSH EDI | | HANDLE hFileMappingObject
00B00FC4 | FF5604 | CALL DWORD PTR DS:[ESI+4] | \ kernel32.MapViewOfFile
00B00FC7 | 3BC3 | CMP EAX,EBX |
00B00FC9 | 740E | JE SHORT 00B00FD9 |
00B00FCB | 8B4E28 | MOV ECX,DWORD PTR DS:[ESI+28] |
00B00FCE | 53 | PUSH EBX | / LPDWORD lpThreadId
00B00FCF | 53 | PUSH EBX | | DWORD dwCreationFlags
00B00FD0 | 50 | PUSH EAX | | LPVOID lpParameter
00B00FD1 | 03C8 | ADD ECX,EAX | |
00B00FD3 | 51 | PUSH ECX | | LPTHREAD_START_ROUTINE lpStartAddress
00B00FD4 | 53 | PUSH EBX | | SIZE_T dwStackSize
00B00FD5 | 53 | PUSH EBX | | LPSECURITY_ATTRIBUTES lpThreadAttributes
00B00FD6 | FF560C | CALL DWORD PTR DS:[ESI+C] | \ kernel32.CreateThread
00B00FD9 | 57 | PUSH EDI | / HANDLE hObject
00B00FDA | FF5608 | CALL DWORD PTR DS:[ESI+8] | \ kernel32.CloseHandle
00B00FDD | FF7620 | PUSH DWORD PTR DS:[ESI+20] | / LONG dwNewLong
00B00FE0 | 53 | PUSH EBX | | int nIndex
00B00FE1 | FF7624 | PUSH DWORD PTR DS:[ESI+24] | | HWND hWnd
00B00FE4 | FF5610 | CALL DWORD PTR DS:[ESI+10] | \ shell32.SetWindowLongA
00B00FE7 | 33C0 | XOR EAX,EAX |
00B00FE9 | 83C454 | ADD ESP,54 |
00B00FEC | 5D | POP EBP |
00B00FED | C21000 | RETN 10 |
----------+----------+--------------------------------------+-------------
Конец шелл-кода и всех прочих связанных с ним данных
--------------------------------------------------------------------------
именем "op_mon.exe" (Outpost User Interface) который может помешать открыть "explorer.exe"
либо оповестит пользователя поэтому в случае его присутствия проделывается такой трюк:
Программа открывает процесс "explorer.exe" с помощью функции "ZwOpenProcess".
ZwOpenProcess (
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL
);
И последний параметр ("ClientId") передает через страницу памяти на которую ставит атрибут
"PAGE_GUARD". Outpost перехватывает "ZwOpenProcess" в нулевом кольце и читает "ClientId"
что бы проверить какой процесс открывает программа. И в этот момент происходит исключение.
Так как установлен атрибут "PAGE_GUARD". Драйвер Outpost в случае исключения автоматически
принимает передаваемые параметры за инвалидные и передает управление дальше в ядро которое
снимает атрибут "PAGE_GUARD" и открывает процесс "explorer.exe".
Если Outpost не установлен то процесс открывается с помощью функции "OpenProcess".
И наоборот если не удалось открыть процесс с помомщью функции "OpenProcess" (Комодо любит
это запрещять) то процесс открывается через "ZwOpenProcess" с "ClientId" в "PAGE_GUARD".
За тем программа сканирует адресное пространство процесса "explorer.exe" с помощью функций
"VirtualQueryEx" и "ReadProcessMemory" с целью найти адрес по которому в этом процессе
отображена общая секция в которую он записал шелл-код. Далее сканируются модули открытого
процесса "explorer.exe" пока не будет найден модуль в одной из секции которого есть байты:
FCh, 3Ch. Которые в коце концов были найдны в модуле "ntdll.dll" открытого "explorer.exe".
После этого программа ищет еще одну последовательность байт: B9h, 94h, 00h, 00h, 00h, F3h,
A5h, 5Fh, 33h, C0h, 5Eh, 5Dh, C2h, 08h, 00h. Они были найдены в "shell32.dll". Напоследок
были найдены байты: FCh, C3h в "kernel32.dll". И последовательности байт: 58h, C3h. И FFh,
E0h в самом модуле "explorer.exe" процесса "explorer.exe". Адреса найденных данных нужны
для реализации обхода и сохраняются в секции с шелл-кодом.
Что же он нашел в чужом процессе?
Код:
--------------------------------------------------------------------------
Первые два байта найденные в "ntdll.dll"
----------+-------------+--------------------+----------------------------
Адрес | Байт код | Инструкции | Комментарий
----------+-------------+--------------------+----------------------------
7C94D0CB | FD | STD |
7C94D0CC | C3 | RETN |
----------+-------------+--------------------+----------------------------
Следующие шестнадцать байт найденные в "shell32.dll"
----------+-------------+--------------------+----------------------------
7C9EE6AE | B994000000 | MOV ECX,94 |
7C9EE6B3 | F3A5 | REP MOVSD |
7C9EE6B5 | 5F | POP EDI |
7C9EE6B6 | 33C0 | XOR EAX,EAX |
7C9EE6B8 | 5E | POP ESI |
7C9EE6B9 | 5D | POP EBP |
7C9EE6BA | C20800 | RETN 8 |
----------+-------------+--------------------+----------------------------
Байты найденные в "kernel32"
----------+-------------+--------------------+----------------------------
7C81C3D6 | FC | CLD |
7C81C3D7 | C3 | RETN |
----------+-------------+--------------------+----------------------------
Байты найденные в "explorer.exe"
----------+-------------+--------------------+----------------------------
0101177C | 58 | POP EAX |
0101177D | C3 | RETN |
----------+-------------+--------------------+----------------------------
01002080 | FFE0 | JMP EAX |
----------+-------------+--------------------+----------------------------
И так все готово для запуска обхода. Программа нашла и открыла одну из общих с процессом
"explorer.exe" секций и записала в нее шелл-код который после этого соотвественно попал и
в "explorer.exe" вместе с данными окружения шелл-кода. К ним относятся и адреса найденных
последовательностей байт. За тем программа находит окно "Shell_TrayWnd" и вызывает функцию
"GetWindowLong" с параметром 0 а в ответ получает адрес переменной в памяти "explorer.exe"
в которой находится адрес обрабочика имеющего отношение к процедуре окна "Shell_TrayWnd" и
этот адрес заменяется с помощью функции "SetWindowLong" с параметром 0 и адресом который
указывает на переменную находящуюся в общей с процессом "explorer.exe" секций в которую
программа записала шелл-код и которая указывает уже на обработчик поставленный программой.
После этого программа создает секцию в которую копирует образ своего исполняемого файла и
посылает сообщение "WM_PAINT" процедуре окна "Shell_TrayWnd". В процессе "exlorer.exe" тут
же срабатывает шелл-код вместо старого обработчика который открывает созданную программой
секцию с образом своего исполняемого файла и отображает ее в память. Потом создается поток
и программа в секции с исполняемым файлом начинает работать. Шелл-код заменяет адрес
своего обработчика на адрес старого обработчика. И все. Код внедрен все подчищено. А сам
процесс программы завершает свою работу.
Что именно происходит после замены адреса переменной указывающей на адрес обраточика с
помощью функции "GetWindowLong" с паметром 0 и хендлом окна "Shell_TrayWnd"?
В процессе "explorer.exe" в процедуре окна "Shell_TrayWnd" в момент получения сообщения
"WM_PAINT" происходит чтение подменненого программой адреса 00B00F4F который указывает на
переменную содержащую адрес 00B00F63 который указывает на адресс "KiUserApcDispatcher". И
за тем происходит вызов "KiUserApcDispatcher". Ниже это показано.
По адресу 00B00F63 находятся несколько адресов подряд которые вызывает процедура окна.
Содежимое памяти с адреса 00B00F63 как и содержимое вызываемых функций можно посмотреть в
таблицах выше. Оно было сконфигурировано программой что бы подсунуть процедуре окна левые
функции которые помогут подменить содержимое стека и запустить шелл-код.
Код:
--------------------------------------------------------------------------
Процедура онка "Shell_TrayWnd"
----------+--------------+--------------------------------------+---------
Адрес | Байт код | Инструкции | Комментарий
----------+--------------+--------------------------------------+---------
01001B1D | 8BFF | MOV EDI,EDI |
01001B1F | 55 | PUSH EBP |
01001B20 | 8BEC | MOV EBP,ESP |
01001B22 | 53 | PUSH EBX |
01001B23 | 56 | PUSH ESI |
01001B24 | 57 | PUSH EDI |
01001B25 | 8B7D0C | MOV EDI,DWORD PTR SS:[EBP+C] |
01001B28 | BB81000000 | MOV EBX,81 |
01001B2D | 3BFB | CMP EDI,EBX |
01001B2F | 0F843A1F0100 | JE explorer.01013A6F |
01001B35 | 8B5D08 | MOV EBX,DWORD PTR SS:[EBP+8] |
01001B38 | 53 | PUSH EBX |
01001B39 | E8A8FFFFFF | CALL explorer.01001AE6 |
01001B3E | 8BF0 | MOV ESI,EAX |
01001B40 | 85F6 | TEST ESI,ESI |
01001B42 | 0F84ED2C0200 | JE explorer.01024835 |
01001B48 | 8B06 | MOV EAX,DWORD PTR DS:[ESI] | EAX = 00B00F63; ESI = 00B00F4F
01001B4A | 56 | PUSH ESI |
01001B4B | FF10 | CALL DWORD PTR DS:[EAX] | EAX = 00B00F63; 00B00F63 + 0 = 00B00F63; ntdll.KiUserApcDispatcher
01001B4D | FF7514 | PUSH DWORD PTR SS:[EBP+14] |
01001B50 | 8B06 | MOV EAX,DWORD PTR DS:[ESI] |
01001B52 | FF7510 | PUSH DWORD PTR SS:[EBP+10] |
01001B55 | 8BCE | MOV ECX,ESI |
01001B57 | 57 | PUSH EDI |
01001B58 | 53 | PUSH EBX |
01001B59 | FF5008 | CALL DWORD PTR DS:[EAX+8] | EAX = 00B00F63; 00B00F63 + 8 = 00B00F6B; ntdll.7C94D0CB
01001B5C | 81FF82000000 | CMP EDI,82 |
01001B62 | 894514 | MOV DWORD PTR SS:[EBP+14],EAX |
01001B65 | 0F84B72C0200 | JE explorer.01024822 |
01001B6B | 8B06 | MOV EAX,DWORD PTR DS:[ESI] |
01001B6D | 56 | PUSH ESI |
01001B6E | FF5004 | CALL DWORD PTR DS:[EAX+4] | EAX = 00B00F63; 00B00F63 + 4 = 00B00F67; SHELL32.7C9EE6AE
01001B71 | 8B4514 | MOV EAX,DWORD PTR SS:[EBP+14] |
01001B74 | 5F | POP EDI |
01001B75 | 5E | POP ESI |
01001B76 | 5B | POP EBX |
01001B77 | 5D | POP EBP |
01001B78 | C21000 | RETN 10 |
----------+--------------+--------------------------------------+---------
таблицах выше. "KiUserApcDispatcher" в данном случае просто выталкивает адрес возврата и
и переходит обратно в код из таблицы выше втолкнув в стек своим call адрес ntdll.7C90E437.
А так же в регистр EDI был помещен указатель на буфер в стеке куда позже будут скопированы
специально тонко подобранные данные из секции с шелл-кодом.
Код:
--------------------------------------------------------------------------
KiUserApcDispatcher
----------+--------------+-------------------------------+----------------
Адрес | Байт код | Инструкции | Комментарий
----------+--------------+-------------------------------+----------------
7C90E430 | 8D7C2410 | LEA EDI,DWORD PTR SS:[ESP+10] |
7C90E434 | 58 | POP EAX |
7C90E435 | FFD0 | CALL EAX |
7C90E437 | 6A01 | PUSH 1 |
7C90E439 | 57 | PUSH EDI |
7C90E43A | E801ECFFFF | CALL ntdll.ZwContinue |
7C90E43F | 90 | NOP |
7C90E440 | 83C404 | ADD ESP,4 |
7C90E443 | 5A | POP EDX |
7C90E444 | 64A118000000 | MOV EAX,DWORD PTR FS:[18] |
7C90E44A | 8B4030 | MOV EAX,DWORD PTR DS:[EAX+30] |
7C90E44D | 8B402C | MOV EAX,DWORD PTR DS:[EAX+2C] |
7C90E450 | FF1490 | CALL DWORD PTR DS:[EAX+EDX*4] |
7C90E453 | 33C9 | XOR ECX,ECX |
7C90E455 | 33D2 | XOR EDX,EDX |
7C90E457 | CD2B | INT 2B |
----------+--------------+-------------------------------+----------------
программа не так давно нашла сама в "ntdll.dll". Она находится по адресу ntdll.7C94D0CB
и просто устанавливает флаг направления(DF). Саму процедуру искать по соотвествующему
адресу в таблицах выше.
Теперь наступает моменты истины. Вызывается функция SHELL32.7C9EE6AE которая копирует
данные из секции с шелл-кодом в стек. Установлен флажок DF поэтому копирование происходит
сверху внизу. В стеке появляется кусок данных из секции с шелл-кодом 00B00ECF - 00B00F4F.
В связи с чем по возврату из функции SHELL32.7C9EE6AE инструкция ret делает переход на
функцию kernel32.7C81C3D6 которая сбразывает флажок DF и вместо возврата попадает на новую
функцию в "explorer.exe" 0101177C. Которая выталкивает параметр и вместо возврата попадает
на ntdll._chkstk которая по окончанию работы опять вместо возварата вызывает функцию
"kernel32.WriteProcessMemory" с соотвествующимим параметрами. Следите по скопированному в
стек куску памяти что бы не запутатся. Все скачки по функциям происходят благодаря тонко
подобранным функциям и данным которые были скопировано в стек. Какждая функция вместо
возврата вызывает новую а стек просто зарание содержит все параметры. Шелл-код был записан
функцией "kernel32.WriteProcessMemory" на место функции "ntdll.atan".
Вот часть данных из таблиц выше которые были скопированы в стек.
Код:
00B00EDF | 0101177C | explorer.0101177C
00B00EE3 | FFFFFFFF |
00B00EE7 | 7C901934 | ntdll.atan
00B00EEB | 00AB0F9F |
00B00EEF | 00000051 |
00B00EF3 | 00AB0EFF |
концов EIP сначало попадает на подобранную функцию которая в очередной раз выталкивает в
EAX очередной подобранный адрес из стека и вместо возврата попадает на адрес 01002080 где
находится JMP EAX и шелл-код запускается.
Сам шелл-код открывает созданную программой секцию в которую она записала образ
исполняемого файла. Отбражает ее в память и создает новый поток. А на последок возвращяет
прежний адрес указывающий на обработчики с помощью функции "SetWindowLong" с параметром 0.
И "explorer.exe" раюботает как и прежде только теперь в его процессе появился новый код и
поток. Затертый код функции "ntdll.atan" востанавливается программой сразу после внедрения
в "explorer.exe".
Исполняемый файл копируется в "Application Data" и ставится на автозагрузку в Run ветку
реестра. Что с учетом обходов пройдет безпалевно. Далее программа начинает парсить свой
конфиг и работает с сетью. Что дальше происходит и так понятно - скачка и запуск файлов.
Подобным образом программа работает на win xp и win 7 вне зависимости от разрядности. Так
как все предусмотренно и под 64-битными системами в "explorer.exe" внедряется 64-битный
вариант исполняемого файла который извлекается из секции ".cfg" 32-битного исполняемого
файла.
Заключение
----------
Основаня задача текста просто теоретически поведать об устройстве программы. Для полного понимания все ровно придется сидеть за отладчиком самостоятельно. Но суть думаю ясна.
Интересно когда наконец люди из АВ компаний прочухаются и закроют прием с "PAGE_GUARD".
Добрый десяток лет ждать не меньше. А Windows в очередной раз укрепила свое альтернатвное название "Решето", а не "Окна", в прочем как на самом деле и любая другая ОС, просто Windows разьебают больше остальных ОС, ну а дыры будут всегда и везде.
-----------------------------------------------------------------------------------------------------
Вышеописанное в полной мере характеризует лоадер. Реверсер постарался на славу и добавлять к этому свое уже не особо хочется. Скажу лишь о том что важно.
1. Автор в беседе со мной сказал, что лоадер просто валялся на винте и нужно было подзаработать продажами. Если такие вещи у него валяются, то я, мягко говоря, шокирован. Но важно то, что долгой поддержки и больших продаж автор не планировал. Я очень сильно тогда обнадежил автора, что выход обзора сильно толкнет продажи. После этого мне ответили, что возможно все и поменяется. Если будут продажи - будет и поддержка и развитие продукта.
2. Второе о чем хочется написать - цена. Неоднократно я слышал возгласы о том, что она чрезмерно высока. Тут сказать однозначно не возможно. Каждый автор сам оценивает свой продукт. И, как известно, рынок сам регулирует цены. Со временем все станет на свои места. И, как мне кажется, цена будет меняться. Но вот в какую сторону... Даже для меня это загадка, которую я уже и не пытаюсь разгадать.
3. Третье - автор вполне себе адекватный человек. Приятный в общении. Толковый, одним словом. Оставил хорошее впечатление. И из-за задержек с обзором мне перед ним ужасно неудобно. Уж пусть он меня простит за это. Но обстоятельства вышли очень уж насыщенные.
4. Крипт автор делает сам. Что очень сильно облегчает жизнь. Спустя месяц после получения криптованного файла имеем 4/35 scan4you
5. Одна из самых большиз плюшек данного лоадера - работа под 32/64 битными версиями windows. Универсальность лоадера на высоте!
Из того что мне не понравилось.
1. В стате нет очистки БД от всех ботов. Простого обнуления всех данных.
2. При просмотре статистики приходится ручками запускать обновление статистики. т.е. запускать cron.php... С одной стороны - это огромный плюс. Нагрузка на БД минимальна. Стата обновляется по крону и всем хорошо. С другой стороны, для меня, как тестера - это было не особо удобно. Хотя, положа руку на сердце - это все же плюс статы и разумного распределения ресурсов сервера.
-------------------------------Благодарности----------------------------------------------------------
Автору - за терпение, за смелость и за потраченное время! Огромное спасибо!
Steklo - за превосходный реверс. Жаль что ты перестал работать в сети. У тебя талант.
Всем кто читает мои записки на полях. Спасибо что заходите к нам на форум. Рад всем вам.
p.s. отвечая на невысказанный ваш вопрос "а где же отстук, живучесть?".
Говорю всем - извините. К сожалению в этом обзоре их не будет. Я вероятно старею. Или руки опускаются уже. Но я их не делал. Устал просить связки, траф и прочее.