Пакер: WinLicense
SHA1:
- 73ba54f9272468fbec8b1d0920b3284a197b3915 (davapi.dll, x86)
- d6f2a7f09d406b4f239efb2d9334551f16b4de16 (davapi.dll, x64)
Описание
Является одним из компонентов троянца Belonard. Оригинальное имя — kernel32.dll (x86), kernel.dll (x64). Имеет один экспорт "x", который принимает аргументом указатель на структуру SERVICE_STATUS сервиса, в котором работает WinDHCP.dll. Создается троянцем Mssv16.asi (Trojan.Belonard.3). Скачивает и запускает wmcodecs.dll (Trojan.Belonard.8), ssdp32.dll (Trojan.Belonard.9) и davapi.dll (Trojan.Belonard.6).
Принцип действия
Подготовка
Троянец читает в реестре параметры "Tag" и "Data" службы WinDHCP. В "Data" должен находиться AES-ключ. Если его нет, троянец генерирует через OpenSSL 32 случайных байта. Полученными данными инициализируется AES-CFB. После чего троянец читает параметры "Info", "Scheme" службы WinDHCP. В "Scheme" хранится 4 параметра в зашифрованном с помощью AES виде. В "Info" хранится SHA256 хэш от списка установленных программ.
Затем троянец загружает библиотеку wmcodecs.dll и вызывает ее экспорт "y". Аргументом передается указатель, проинициализированный указателем на контейнер, который содержит информацию об именах файлов и соответствующих им SHA256-хэшам. При этом имя библиотеки хранится в зашифрованном виде.
Скрипт расшифровки:
s = ''
c = ord(d[0])
for i in range(len(d)-1):
c = (ord(d[i+1]) + 0xe1*c - ord(d[i])*0x19 - 0x0b) & 0xff
s += chr(c)
Троянец расшифровывает адрес управляющего сервера — oihcyenw.valve-ms[.]ru, после чего запускает со случайно сгенерированным интервалом три функции.
- Поиск запущенных клиентов Counter-Strike. Период запуска находится в интервале от 30 до 90 секунд.
- Запуск ssdp32.dll происходит в интервале от 30 до 90 минут.
- Обращение к управляющему серверу. Происходит раз в 2-3 часа.
Диапазоны периодов могут быть изменены при получении соответствующей команды от управляющего сервера. При этом раз в секунду троянец заносит в реестр параметры службы WinDHCP.
Поиск клиентов Counter-Strike
Данная функция запускается только при наличии загруженной wmcodecs.dll. Чтобы найти процесс Counter-Strike, троянец перебирает все процессы. После чего в каталоге с исполняемым файлом процесса он ищет папки и файлы, характерные для клиента Counter-Strike 1.6.
Троянец также умеет идентифицировать официальный клиент. Для этого он проверяет, заканчивается ли путь до исполняемого файла процесса на steamapps\common\Half-Life, а также наличие файла Steam.dll в каталоге, содержащем указанный относительный путь.
При нахождении клиента троянец сверяет файлы и их SHA256-хэши с информацией, полученной из экспорта "y" wmcodecs.dll. Если найдено несоответствие, вызывает экспорт "x" библиотеки wmcodecs.dll, передавая аргументом путь до исполняемого файла процесса.
Запуск ssdp32.dll
Если в %WINDIR%\System32 есть файл ssdp32.dll, троянец перебирает все процессы, где исполняемым файлом является rundll32.exe. Если в списке загруженных модулей процесса есть модуль «ssdp32.dll», троянец завершает этот процесс. После проверки всех процессов через rundll32.exe запускается экспорт «x» файла «ssdp32.dll».
Обращение к управляющему серверу
Троянец собирает информацию о системе:
#pragma pack(push,1)
struct st_info
{
_DWORD dword0; // 0x05
_BYTE byte4; // 0x00
_DWORD svc_dhcp_scheme_wmcodecs_ver;
_BYTE bIsWmcodecsDllLoaded;
_DWORD dwProductVersionMS;
_WORD ProductVersionLS; // (dwProductVersionLS & 0xffff0000) >> 16
_WORD DefaultUILang;
_DWORD TotalMemory; // in Mb
_DWORD dwNumberOfProcessors;
_WORD wProcessorArchitecture;
_WORD wProcessorLevel;
_WORD wProcessorRevision;
_QWORD ticks;
}
#pragma pack(pop)
Затем он составляет список установленных программ, а SHA256 от этого списка сохраняет в параметре "Info" сервиса WinDHCP. Затем троянец упаковывает список в XZ архив и формирует структуру st_packet:
struct st_packet
{
st_info info;
_BYTE svc_dhcp_data[0x20];
_DWORD svc_dhcp_scheme_dword0;
_DWORD installed_programs_length;
_BYTE aeskey2[0x20]; // absent if size of resulting st_packet structure is less than 342 bytes
_BYTE aeskey1[0x20];
_BYTE installed_programs_sha256[0x20];
_BYTE byte1; // 0x01
_DWORD xz_arc_size;
char xz_arc_data[size];
_BYTE byte2; // 0x02
_BYTE bSsdp32DllExists; // 0x01 - exists & hash computed, 0xff - doesn't exist, 0xfe - failed to compute sha256 hash
_BYTE Ssdp32Dll_sha256[0x20]; // absent if bSsdp32DllExists != 0x01
}
Полученная структура зашифровывается публичным RSA-ключом, зашитым в троянца. Только первые 342 байта данных шифруются RSA, остальное (при наличии) шифруется с помощью AES в режиме CFB с размером блока 128 бит, где ключ получается из st_packet->aeskey2. В начало зашифрованных данных дописывается нулевой байт, после чего они отправляются на управляющий сервер.
Первым делом троянец пробует установить соединение с одним из известных ему серверов. Если ни с одним из них установить соединение не получилось, троянец использует встроенный алгоритм генерации доменов и пробует соединиться с одним из полученных доменов.
После отправки зашифрованных данных троянец принимает данные от сервера. Для расшифровки используется AES в режиме CFB с размером блока 128 бит. Ключ получается из st_packet->aeskey1. Сначала расшифровываются первые 36 байт данных, из них последний DWORD - это реальный размер полезной нагрузки с заголовком. К AES-ключу добавляется DWORD и хэшируется SHA256. Полученный хэш должен совпасть с первыми 32 расшифрованными байтами. Далее расшифровываются остальные принятые данные. Первые 32 байта - это SHA256-хэш от st_packet->aeskey1 и последующих данных. Последовательно анализирует буфер, который может содержать более одной команды за раз.
| id | Struct | desc |
|---|---|---|
| 0x00 | struct st_cmd0 { _BYTE opcode; // 0x00 _DWORD size; _BYTE payload[size]; } | davapi.dll или spwinres.dll в зависимости от значения параметра "Tag" сервиса WinDHCP. |
| 0x01 | struct st_cmd1 { _BYTE opcode; // 0x01 _DWORD version; _DWORD size; _BYTE payload[size]; } | XZ архив с wmcodecs.dll. |
| 0x02 | struct st_cmd2 { _BYTE opcode; // 0x02 _DWORD callhome_period_low; _DWORD callhome_period_high; _DWORD callhome_connect_attempts_max; _DWORD callhome_dga_period_low; _DWORD callhome_dga_period_high; _DWORD findcsclients_period_low; _DWORD findcsclients_period_high; _DWORD main_loop_step; _DWORD runssdp32dll_period_low; _DWORD runssdp32dll_period_high; _DWORD ssdp32_proc_instances; _DWORD ssdp32_proc_pause; _DWORD ssdp32_proc_postkill_pause; }; | Параметры работы троянца. |
| 0x03 | struct st_cmd3 { _BYTE opcode; // 0x03 _DWORD size; _BYTE payload[size]; } | ssdp32.dll |
Буфер может содержать одну или несколько структур, но только по одной каждого типа.
После этого троянец перебирает все процессы с исполняемым файлом rundll32.exe и останавливает те, у которых в списке загруженных модулей есть ssdp32.dll. Затем сохраняет в %WINDIR%\System32\ модули, которые прислал сервер (при наличии), и задает им скопированное у kernel32.dll время создания, модификации и доступа.
