Пакер: VMProtect
Дата компиляции: 21.10.2018, 14:53:39
SHA1:
- 75ec1a47404193c1a6a0b1fb61a414b7a2269d08 (Mp3enc.asi)
Описание
Является одним из компонентов троянца Belonard. Попадает на устройство за счет Trojan.Belonard.1. Загружает и исполняет Trojan.Belonard.3.
Принцип действия
В DllMain проверяет имя процесса, куда загружена dll. Если это не rundll32.exe, тогда создает поток, а в нем – ключ [HKCU\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers] '<путь до исполняемого файла процесса>, которому присваивает значение "RUNASADMIN". Библиотека также имеет экспорт "xW", в котором сразу переходит к выполнению основного функционала.
Если у диска, на котором располагается троянец, не выставлен флаг FILE_READ_ONLY_VOLUME, тогда удаляет файл Mssv24.asi. Если удалить не получилось, переименовывает его в файл со случайным именем и расширением .dat, после чего удаляет. Создает мьютекс "qfincshmkhftobll".
Кроме того, программа пытается прочесть содержимое файла platform\Servers\DialogGameName.res. Если найти файл не получилось, троянец создает его и записывает в него 16 случайных байт. После этого троянец меняет время создания/модификации/доступа файла, копируя эти данные у Mssv12.asi, Mssv29.asi, Mss32.dll или hl.exe.
Троянец собирает данные о системе и формирует из них следующую структуру:
#pragma pack(push, 1)
struct st_info
{
_BYTE byte0; // 0x01
_BYTE bIsWow64Process;
_BYTE DialogGameNameResData[0x10];
_DWORD dwProductVersionMS;
_WORD ProductVersionLS; // (dwProductVersionLS & 0xffff0000) >> 16
_WORD DefaultUILang;
_DWORD TotalMemory; // in Mb
_DWORD dwNumberOfProcessors;
_WORD wProcessorArchitecture;
_WORD wProcessorLevel;
_WORD wProcessorRevision;
_QWORD ticks;
_BYTE IsTokenElevated;
_BYTE IsWinDHCPServiceRunning;
_BYTE IsWinDHCPDllExists;
_BYTE IsDavapiDllExists;
_BYTE IsSpwinresDllExists;
_BYTE IsWmcodecsDllExists;
_BYTE IsSsdp32DllExists;
char szSystemDir[];
char szSysWow64Dir[]; // absent for x86 OS
char szMp3encAsiPath[];
char szProcessExePath[];
char szCurrentDir[];
_BYTE IsMssv24AsiExists;
_BYTE IsDialogServerNameResExists;
_BYTE DialogServerNameResData[0x0e];
_BYTE IsCstrikeSaveFolderExists;
_DWORD dwCstrikeSaveFilesCount;
_BYTE IsSteamClient;
_BYTE ModSHA256[32];
}
#pragma pack(pop)
При наличии файла platform\Servers\DialogGamePage.res читает из него информацию о ранее загруженной полезной нагрузке и добавляет эту информацию к st_info.
Собранные данные оборачиваются в структуру:
#pragma pack(push,1)
struct st_packet
{
_BYTE byte0; //0x00
_BYTE aeskey2[0x20]; // absent if size of resulting st_packet structure is less to 342 bytes
_BYTE aeskey[0x20];
_DWORD size;
_BYTE data[size]; // st_info struct
}
#pragma pack(pop)
После чего данные шифруются публичным RSA-ключом, зашитым в троянца. Только первые 342 байта данных шифруются RSA, остальное (при наличии) шифруется AES-ом в режиме CFB с размером блока 128 бит, где ключ получается из st_packet->aeskey2, вызовом EVP_BytesToKey(cipher, md_sha256, 0, &st_packet->aeskey2, 32, 5, key, iv).
В начало зашифрованных данных дописывается нулевой байт, после чего они отправляются на управляющий сервер: wcnclfbi.valve-ms[.]ru:28748. В ответ сервер отдает зашифрованные данные следующей структуры:
struct st_payload
{
_BYTE hash1[32];
_DWORD totalsize;
_BYTE hash2[32];
_DWORD dword44;
_DWORD dword48;
_DWORD dword4c;
_WORD word50;
char payload_name[];
_BYTE payload_sha256[32];
_DWORD payload_size;
_BYTE payload_data[payload_size];
}
Для расшифровки используется AES в режиме CFB с размером блока 128 бит. Ключ получается из st_packet->aeskey, как было описано выше. Сначала расшифровываются первые 36 байт данных, из них последний DWORD - это реальный размер полезной нагрузки и заголовка. К AES-ключу добавляется DWORD и хэшируется SHA256. Полученный хэш должен совпасть с первыми 32 расшифрованными байтами. После этого расшифровываются остальные принятые данные. Следующие 36 байт используются аналогично, но DWORD по смещению 0x44 больше не является размером полезной нагрузки, а используется просто для хэширования. В заголовке пакета есть имя, с которым сохраняется полезная нагрузка, ее размер и sha256-хэш.
Троянец записывает в platform\Servers\DialogGamePage.res зашифрованную структуру:
struct gamepage
{
_BYTE byte0; // 0x01
char modname[];
_BYTE modsha256[32];
_BYTE byte1; // 0x03
_DWORD dword2;
_QWORD qword3;
}
Алгоритмы шифрования/дешифровки аналогичны троянцу Trojan.Belonard.1:
def encbuf(data):
c = random.randint(11, 245)
d = random.randint(11, 245)
e = random.randint(11, 245)
f = random.randint(11, 245)
enc_r = ''
y = c
z = c
for i in range(len(data)):
y = (ord(data[i]) + f*z + e*y + d)&0xff
z = ord(data[i])
enc_r += chr(y & 0xff)
enc_r = '%c%c%c%c%s' % (d,f,e,c,enc_r)
return f,e,d,enc_r
def decbuf(f,e,d,enc):
y = ord(enc[0])
dec = ''
for i in range(1,len(enc)):
y = (ord(enc[i]) - e*ord(enc[i-1]) - f*y - d)&0xff
dec += chr(y)
return dec
Троянец сохраняет полученную полезную нагрузку в файл Mssv16.asi(Trojan.Belonard.3) и запускает его экспорт "x" через rundll32.exe.
Некоторые строки программы зашифрованы. Алгоритм дешифровки:
def decrypt(d):
s = ''
c = ord(d[0])
for i in range(len(d)-1):
c = (ord(d[i+1]) + 0xe2*c - 0x2f*ord(d[i]) - 0x58) & 0xff
s += chr(c)
return s