Упаковщик: отсутствует
Дата компиляции: 01.12.2016 05:57:59
SHA1-хеш:
- 4c871eae022c8088f6e8d46e17002cd0c0006650
Описание
Бэкдор, написанный на языке С++ и предназначенный для работы в 64-разрядных операционных системах семейства Microsoft Windows. Используется для целевых атак на информационные системы, сбора информации о зараженном устройстве, загрузки функциональных вредоносных модулей, координации их работы и обеспечения взаимодействия с управляющим сервером. В инфицированной системе существует в виде динамической библиотеки и загружается системной службой при помощи метода DLL Hijacking. Далее функционирует в оперативной памяти компьютера.
Принцип действия
Бэкдор представляет собой вредоносную DLL-библиотеку. Имена функций в таблице экспорта образца дублируют экспортируемые функции системной библиотеки apphelp.dll.
На зараженном компьютере файл бэкдора размещался в каталоге C:\Windows\System32\oci.dll. Оригинальное имя файла из таблицы экспорта — dll. Загружался методом DLL Hijacking системной службой MSDTC (Microsoft Distributed Transaction Coordinator Service).
Функционально образец является загрузчиком для основной полезной нагрузки, которую хранит в секции .data в виде DLL, при этом некоторые элементы DOS и PE заголовков равны нулю.
Работа загрузчика
Загрузка выполняется в функции, обозначенной как malmain_3, вызываемой из точки входа DLL через две промежуточные функции-переходника.
Вначале проверяются сигнатуры заголовков. Если они не равны стандартным, то устанавливается значение ошибки ERROR_BAD_EXE_FORMAT, при этом на работу загрузчика данное действие никак не влияет.
Затем происходит выделение памяти для образа в соответствии со значением IMAGE_NT_HEADERS64.OptionalHeader.SizeOfImage, и формируется вспомогательная структура loader_struc.
struct loader_struc
{
IMAGE_NT_HEADERS64 *pPE_header;
LPVOID ImageBase;
HMODULE *p_imported_modules
QWORD number_of_imported_modules
HMODULE (__stdcall *pLoadLibrary)(LPCSTR lpLibFileName);
FARPROC (__stdcall *pGetProcAddress)(HMODULE hModule, LPCSTR lpProcName);
BOOL (__stdcall *pFreeLibrary)(HMODULE hLibModule);
QWORD unk;
};
Далее следует стандартный процесс загрузки PE-модуля в память и вызов точки входа загруженного модуля (DllMain) с аргументом DLL_PROCESS_ATTACH, а после выхода из нее — повторный вызов с DLL_PROCESS_DETACH.
Работа основного модуля
В основном модуле значения всех сигнатур, необходимых для корректной загрузки файла, приравнены к нулю.
- IMAGE_DOS_HEADER.e_magic
- IMAGE_NT_HEADERS64.Signature
- IMAGE_NT_HEADERS64.FileHeader.Magic
Кроме того, TimeDateStamp и имена секций также имеют нулевое значение. Остальные значения корректны, поэтому после ручной правки необходимых сигнатур файл можно загрузить для анализа в виде PE-модуля.
Анализ основного модуля затруднен, так как периодически используются нетипичные способы вызова функций. Для хранения и обработки структур используется библиотека UT hash. Она позволяет преобразовывать стандартные C-структуры в хеш-таблицы путем добавления одного члена типа ut_hash_handle. При этом все функции библиотеки, такие как добавление элементов, поиск, удаление и т. д., реализованы в виде макросов, что приводит к их принудительному разворачиванию и встраиванию (inline) компилятором в код основной (вызывающей) функции.
Для взаимодействия с управляющим сервером используется библиотека mbedtls.
Функция DllMain
В начале исполнения проверяется наличие события Global\\BFE_Notify_Event_{65a097fe-6102-446a-9f9c-55dfc3f45853}, режим исполнения (из конфигурации) и командная строка, затем происходит запуск рабочих потоков.
Модуль имеет встроенную конфигурацию следующей структуры:
struct cfg_c2_block
{
int type;
char field_4[20];
char addr[256];
}
struct cfg_proxy_data
{
DWORD dw;
char str[256];
char proxy_server[256];
char username[64];
char password[32];
char unk[128];
};
struct builtin_config
{
int exec_mode;
char url_C2_req[100];
char hash_id[20];
char string[64];
char field_BC;
cfg_c2_block srv_1;
cfg_c2_block srv_2;
cfg_c2_block srv_3;
cfg_c2_block srv_4;
cfg_proxy_data proxy_1;
cfg_proxy_data proxy_1;
cfg_proxy_data proxy_1;
cfg_proxy_data proxy_1;
int CA_cert_len;
char CA_cert[cert_len];
};
Поле hash содержит некое значение, которое может являться идентификатором. Это значение используется при взаимодействии с управляющим сервером и может быть представлено в виде строки b2e4936936c910319fb3d210bfa55b18765db9cc, которая по длине совпадает с SHA1-хешами.
Поле string содержит строку из одного символа: 1.
CA_cert — сертификат центра сертификации в формате DER. Он используется для установки соединения с управляющим сервером по протоколу TLS 1.2.
Информация о сертификате находится в примечании к описанию.
В функции DllMain предусмотрено создание нескольких рабочих потоков в зависимости от ряда условий.
- Основной поток — thread_1_main
- Поток запроса нового сервера — thread_2_get_new_C2_start_communication
- Поток исполнения зашифрованного модуля — thread_4_execute_encrypted_module
Для выполнения необходимо, чтобы значение параметра builtin_config.exec_mode было ненулевым.
- если значение builtin_config.exec_mode равно 1 или 2, и командная строка процесса содержат подстроку -k netsvcs, то запускаются основной поток и поток получения нового адреса управляющего сервера;
- также, если builtin_config.exec_mode равен 2, то запускается поток, который расшифровывает и запускает хранящийся в системе модуль;
- если значение равно 3, то запускаются основной поток и поток для получения нового адреса управляющего сервера.
В рассматриваемом образце значение параметра exec_mode равно 3.
Основной поток
Вначале бэкдор проверяет версию ОС, затем подготавливает структуру для инициализации функций и структуру для хранения некоторых полей конфигурации. Процедура выглядит искусственно осложненной.
В структуру funcs_struc типа funcs_1 заносятся 3 указателя на функции, которые будут поочередно вызваны внутри функции init_global_funcs_and_allocated_cfg.
В функции set_global_funcs_by_callbacks происходит вызов каждой функции-инициализатора по очереди.
Общий порядок формирования структур выглядит следующим образом:
- каждой функции передаются две структуры: первая содержит указатели на некоторые функции, вторая — пустая;
- каждая функция переносит указатели на функции из одной структуры в другую;
- после вызова функции-инициализатора происходит очередное перемещение указателей на функции из локальной структуры в глобальный массив структур по определенному индексу.
В итоге после всех нестандартных преобразований получается некоторое количество глобальных структур, которые объединены в один массив.
В конечном итоге вызов функций можно представить следующим образом.
Сложные преобразования — копирование локальных структур с функциями и их перенос в глобальные структуры — вероятно, призваны усложнить анализ вредоносного образца.
Затем бэкдор при помощи библиотеки UT hash формирует хеш-таблицу служебных структур, ответственных за хранение контекста сетевого соединения, параметров подключения и т. д.
Фрагмент кода формирования хеш-таблицы.
Стоит отметить, что здесь располагается значение сигнатуры, которое позволяет определить используемую библиотеку: g_p_struc_10->hh.tbl->signature = 0xA0111FE1;.
Для рассматриваемого бэкдора характерно распределение значимых полей и данных по нескольким создаваемым для этого структурам. Эта особенность при анализе затрудняет создание осмысленных имен для структур.
После подготовительных действий переходит к инициализации подключения к управляющему серверу.
Инициализация соединения с управляющим сервером
Примечательно, что в программном коде, связанном с сетевым подключением, присутствуют собственные коды ошибок — помимо тех, что принадлежат библиотеке mbedtls.
Список кодов ошибок, обнаруженных в рассматриваемом образце.
enum ERROR_CODES
{
ERROR_CODE_1392 = 0x1392,
ERROR_BAD_ARGS = 0x5208,
ERROR_CODE_520B = 0x520B,
ERROR_CODE_520D = 0x520D,
ERROR_CODE_59D8 = 0x59D8,
ERROR_CODE_59DB = 0x59DB,
ERROR_CODE_59DC = 0x59DC,
ERROR_INVALID_ARGUMENT = 0x59DE,
ERROR_CODE_59DF = 0x59DF,
ERROR_CODE_61A8 = 0x61A8,
ERROR_BAD_ALLOCATION = 0x61A9,
ERROR_BAD_PACKET_SIGNATURE = 0x61AA,
ERROR_CODE_61AB = 0x61AB,
ERROR_CODE_61AC = 0x61AC,
ERROR_CODE_61AD = 0x61AD,
ERROR_CODE_61AF = 0x61AF,
ERROR_CODE_61B0 = 0x61B0,
ERROR_CODE_61B1 = 0x61B1,
ERROR_BUFFER_NOT_EMPTY = 0x61B2,
ERROR_CODE_6590 = 0x6590,
ERROR_CODE_6592 = 0x6592,
ERROR_BAD_ALLOC = 0x6593,
};
После ряда подготовительных действий бэкдор разрешает хранящийся в конфигурации адрес управляющего сервера и извлекает порт. Адреса в конфигурации хранятся в виде строк: koran.junlper[.]com:80 и koran.junlper[.]com:443. Далее программа создает TCP-сокет для подключения. После этого создает контекст для защищенного соединения и выполняет TLS-рукопожатие.
После установки защищенного соединения бэкдор ожидает от управляющего сервера пакет с командой. Программа оперирует двумя форматами пакетов:
- пакет, полученный после обработки протокола TLS, — «транспортный» пакет»;
- пакет, полученный после обработки транспортного пакета, — «пакет данных». Содержит идентификатор команды и дополнительные данные.
Заголовок транспортного пакета представлен следующей структурой.
struct transport_packet_header
{
DWORD signature;
WORD compressed_len;
WORD uncompressed_len;
};
Данные располагаются после заголовка и упакованы алгоритмом LZ4. Бэкдор проверяет значение поля signature, оно должно быть равно 0x573F0A68.
После распаковки полученный пакет данных имеет заголовок следующего формата.
struct data_packet_header
{
WORD tag;
WORD id;
WORD unk_0;
BYTE update_data;
BYTE id_part;
DWORD unk_1;
DWORD unk_2;
DWORD len;
};
Поля tag и id в совокупности определяют действие бэкдора, то есть обозначают идентификатор команды.
Данные структуры заголовков используются в обоих направлениях взаимодействия.
Порядок обработки команд сервера:
- верификация клиента;
- отправка информации о зараженной системе;
- обработка команд по идентификаторам.
В структуре, отвечающей за взаимодействие с управляющим сервером, есть переменная, которая хранит состояние диалога. В связи с этим перед непосредственным выполнением команд необходимо выполнение первых двух шагов, что можно рассматривать как второе рукопожатие.
Этап верификации
Для выполнения этапа верификации значения полей tag и id в полученном от управляющего сервера первичном пакете должны быть равны 1.
Процесс верификации состоит в следующем:
- Бэкдор формирует буфер из 8-байтного массива, который следует после заголовка пакета и поля hash_id, взятого из конфигурации. Результат можно представить в виде структуры:
struct buff { BYTE packet_data[8]; BYTE hash_id[20]; }
- Вычисляется SHA1-хеш данных в полученном буфере, результат помещается в пакет (после заголовка) и отправляется на сервер.
Отправка информации о системе
Следующий полученный пакет от управляющего сервера должен иметь значения tag, равное 5, и id, равное 3. Данные о системе формируются в виде структуры sysinfo_packet_data.
struct session_info
{
DWORD id;
DWORD State;
DWORD ClientBuildNumber;
BYTE user_name[64];
BYTE client_IPv4[20];
BYTE WinStationName[32];
BYTE domain_name[64];
};
struct sysinfo_block_2
{
WORD field_0;
WORD field_2;
WORD field_4;
WORD system_def_lang_id;
WORD user_def_lang_id;
DWORD timezone_bias;
DWORD process_SessionID;
BYTE user_name[128];
BYTE domain_name[128];
DWORD number_of_sessions;
session_info sessions[number_of_sessions];
};
struct sysinfo_block_1
{
DWORD unk_0; //0
DWORD bot_id_created;
DWORD dw_const_0; //0x101
DWORD os_version;
WORD dw_const_2; //0x200
BYTE cpu_arch;
BYTE field_13;
DWORD main_interface_IP;
BYTE MAC_address[20];
BYTE bot_id[48];
WCHAR computer_name[128];
BYTE cfg_string[64];
WORD w_const; //2
WORD sessions_size;
};
struct sysinfo_packet_data
{
DWORD id;
sysinfo_block_1 block_1;
sysinfo_block_2 block_2;
};
Поле sysinfo_packet_data.id содержит константу — 0x19C0001.
Значение sysinfo_packet_data.block_1.bot_id извлекается из реестра. Бэкдор находит его в параметре instance ключа SOFTWARE\Clients\Mail\Hotmail\backup, который, в свою очередь, в зависимости от привилегий может находиться в разделе HKLM или HKCU.
Если значение отсутствует, то с помощью UuidCreate генерируется случайный GUID, форматируется в виде строки XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX и сохраняется. Если идентификатор уже существовал, то параметру sysinfo_packet_data.block_1.bot_id_created присваивается значение 1, а если идентификатор был создан — значение 2.
Значение параметра sysinfo_packet_data.block_1.cpu_arch:
- 1 — x86
- 2 — x64
Примечателен процесс определения бэкдором значений MAC-адреса и IP-адреса. Вначале программа ищет сетевой интерфейс, через который прошло наибольшее количество пакетов, затем получает его MAC-адрес и далее по нему ищет IP-адрес этого интерфейса.
Версия ОС кодируется значением от 1 до 13 (0, если возникла ошибка), начиная с 5.0 и далее по возрастанию версии.
В поле sysinfo_packet_data.block_1.cfg_string помещается значение string из конфигурации бэкдора, которое равно символу 1.
Обработка команд
После верификации и отправки системной информации BackDoor.Spyder.1 приступает к обработке главных команд. В отличие от большинства бэкдоров, команды которых имеют вполне конкретный характер (забрать файл, создать процесс и т. д.), в данном экземпляре они носят скорее служебный характер и отражают инструкции по хранению и структурированию получаемых данных. Фактически все эти служебные команды нацелены на загрузку новых модулей в PE-формате, их хранение и вызов тех или иных экспортируемых функций. Стоит отметить, что модули и информация о них хранятся в памяти в виде хеш-таблиц с помощью UT-hash.
tag | id | Описание |
---|---|---|
6 | 1 | Отправить на сервер количество полученных модулей. |
2 | Сохранить в памяти параметры получаемого модуля. | |
3 | Сохранить в памяти тело модуля. | |
4 | Загрузить сохраненный ранее модуль. Поиск выполняется в хеш-таблице по идентификатору, полученному в пакете с командой. Модуль загружается в память, вызывается его точка входа, затем получаются адреса 4 экспортируемых функций, которые сохраняются в структуре для дальнейшего вызова. Вызвать экспортируемую функцию № 1. | |
5 | Вызвать экспортируемую функцию № 4 одного из загруженных модулей, затем выгрузить его. | |
6 | Отправить в ответ пакет, состоящий только из заголовка data_packet_header, в котором поле unk_2 равно 0xFFFFFFFF. | |
7 | Вызвать экспортируемую функцию № 2 одного из загруженных модулей. | |
8 | Вызвать экспортируемую функцию № 3 одного из загруженных модулей. | |
5 | 2 | Отправить на сервер информацию о текущих параметрах подключения. |
4 | - | Предположительно экспортируемая функция № 1 может возвращать таблицу указателей на функции, и по этой команде программа вызывает одну из данных функций. |
После обработки каждого полученного от сервера пакета бэкдор проверяет разницу между двумя значениями результата GetTickCount. Если значение превышает заданное контрольное значение, то отправляет на сервер значение сигнатуры 0x573F0A68 без каких-либо дополнительных данных и преобразований.
Поток запроса нового сервера
BackDoor.Spyder.1 может запросить адрес нового сервера, если в конфигурации представлен для этого URL url_C2_req. Для запроса по этому URL программа может использовать как системный, так и представленные в конфигурации HTTP-прокси. Обращение происходит с помощью WinHTTP API InternetOpenUrlA.
Ответ должен представлять собой строку в кодировке Base64 между двумя маркерами: DZKS и DZJS. Следует отметить, что аналогичный алгоритм и маркеры применялись в семействе PlugX (BackDoor.PlugX.28, BackDoor.PlugX.38).
Декодированная строка распаковывается с помощью функции RtlDecompressBuffer, в результате получается адрес нового управляющего сервера и порт для подключения.
Поток исполнения зашифрованного модуля
Если параметр конфигурации exec_mode имеет значение 2 и командная строка содержит -k netsvcs, бэкдор создает отдельный поток для исполнения модуля, хранящегося в файле.
Для этого сначала выполняется поиск файла C:\Windows\System32\1.update. Если такой файл существует, программа считывает его и расшифровывает.
Этот файл содержит путь к зашифрованному файлу, содержащему DLL-модуль, который бэкдор считывает, расшифровывает и загружает.
Особенности версии для x86
Версия бэкдора, предназначенная для работы в 32-разрядных операционных системах Microsoft Windows, детектируется Dr.Web как BackDoor.Spyder.3 (83e47dbe20882513dfd1453c4fcfd99d3bcecc3d). Основное отличие этой модификации — наличие отладочных сообщений.
Сообщения записываются в журнал, расположенный в каталоге %WINDIR%\temp\deskcpl.ttf. В зависимости от параметров инициализации они могут выводиться с помощью OutputDebufStringA, а также шифроваться с помощью простой XOR-операции с байтом 0x62.
Сообщения, касающиеся коммуникации с управляющим сервером и обработки команд, выводятся с помощью функции OutputDebugStringA. Примечательно, что для таких сообщений используется префикс [Spyder].
Примечания
Информация о сертификате CA_cert для установки соединения с управляющим сервером:
SHA1 Fingerprint=BF:46:40:E4:AF:56:DB:E0:D0:86:6E:16:B0:3F:C7:23:77:26:14:31
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = SecureTrust CA, O = SecureTrust Corporation, C = US
Validity
Not Before: Jan 1 00:00:00 2011 GMT
Not After : Dec 31 23:59:59 2025 GMT
Subject: CN = SecureTrust CA, O = SecureTrust Corporation, C = US
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:bd:c3:26:8b:e1:37:7f:f0:fa:0a:0d:83:a7:dd:
22:31:14:83:08:d7:74:3b:31:08:84:ef:25:cf:2d:
44:fc:2d:54:77:0b:17:e2:70:4d:be:2f:c1:fc:ed:
d9:6b:9e:db:60:28:27:c4:1e:6d:15:3d:dd:b9:43:
64:37:58:b4:bd:48:85:fa:d1:d6:f7:5a:33:eb:ec:
b7:86:62:92:1f:89:d7:a4:bd:d3:1f:f3:18:9d:a4:
15:27:16:7b:26:9f:5c:53:87:bd:40:22:d2:5e:cd:
ab:d5:6f:1d:ac:c3:0d:f1:d9:d5:f5:6a:d3:16:76:
58:df:f7:0b:20:0d:ed:7b:97:ae:66:0a:e6:cc:9f:
73:50:fb:ce:16:a6:dc:45:d0:2f:70:3e:c8:c8:59:
4d:c4:62:ec:b0:e9:01:9c:57:92:e4:78:83:4f:a6:
ab:1b:94:45:ff:15:ed:dc:59:95:f3:71:22:9c:06:
38:bb:e6:0f:b3:ec:af:5b:bd:1a:2f:b1:7f:ce:c8:
4d:32:9f:8f:44:9b:ae:fc:e5:72:24:b4:3a:3b:f3:
d0:79:30:79:a2:0e:bd:55:e9:cd:c0:4d:7e:07:fc:
37:b5:7f:69:be:d6:e3:37:ce:9e:ff:d2:05:e4:3c:
59:7e:f0:d4:ab:01:e4:7b:07:f6:a4:f0:e3:c3:7e:
58:07:2d:e8:96:9c:ac:8b:e6:dc:49:6a:51:9a:b3:
b0:62:cf:3c:b4:4a:f9:89:ae:2c:73:17:01:43:63:
ec:e8:2b:7b:1c:3c:81:41:fa:db:93:45:3a:21:1f:
2a:3a:8f:30:d4:52:59:91:03:03:11:b8:18:ca:39:
4c:9a:e2:57:33:e6:bc:c5:4a:8e:76:79:50:fd:bd:
32:78:9c:79:58:4f:b9:d3:bb:05:eb:39:43:db:3e:
b5:2d:51:18:ed:ee:9d:31:3a:2e:6b:37:37:34:28:
4a:89:cb:65:b4:7d:bf:be:a1:67:cb:5c:71:9c:be:
c3:3b:f7:a7:df:37:4d:0f:c7:57:f5:5b:d2:db:54:
2c:91:5b:3b:7f:ec:1f:45:e4:7b:a5:0d:a1:c2:1f:
64:af:51:cd:32:3a:83:25:9c:90:ac:77:66:4d:12:
23:f5:5b:3c:90:b5:41:1b:54:55:a4:24:66:e6:e9:
65:46:95:ff:ef:67:f5:a6:80:f6:d5:e6:3f:2f:c2:
7b:25:d8:b3:b4:4d:f4:b8:7c:38:cc:de:3e:4f:43:
9a:ca:be:c1:66:95:2d:2c:16:a9:56:9b:68:5d:8c:
78:90:84:d4:86:51:10:f1:9b:14:23:43:bb:91:1e:
02:01:ee:11:63:c4:f2:81:7f:83:68:5e:86:bd:8a:
88:7c:2d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE, pathlen:0
X509v3 Subject Key Identifier:
E0:63:19:89:FA:AD:19:5D:E3:B3:A5:E2:85:D2:2F:87:B1:55:76:1B
X509v3 Authority Key Identifier:
keyid:E0:63:19:89:FA:AD:19:5D:E3:B3:A5:E2:85:D2:2F:87:B1:55:76:1B
X509v3 Key Usage: critical
Digital Signature, Key Agreement, Certificate Sign, CRL Sign
Netscape Cert Type:
SSL Client, SSL Server, Object Signing, SSL CA, Object Signing CA
Signature Algorithm: sha256WithRSAEncryption
08:33:53:e4:be:95:0a:1b:d7:6e:44:6b:2d:42:2a:45:7f:8b:
89:fd:fb:d0:cf:5f:8f:83:77:5d:3b:2c:11:46:9f:44:3b:69:
f2:e2:e7:fe:4e:c9:43:5c:89:5f:e2:e2:5a:5e:4c:4d:39:ed:
ce:2d:63:d4:a1:93:ff:ff:3f:b0:77:86:e8:f1:5e:a3:4d:d3:
ba:eb:41:0f:85:0c:04:fb:6c:42:19:bc:2b:d1:db:c6:51:e3:
97:cd:5b:e5:d5:b4:1f:43:e7:7c:eb:86:08:16:86:0b:46:23:
9d:f4:e9:18:b6:ce:e5:f4:96:7b:ee:5f:f5:8d:ff:dd:65:29:
b9:12:94:f7:da:d3:c0:64:53:e6:2b:36:ec:6f:d3:26:3c:c2:
ab:ba:10:cd:d8:39:43:8b:21:fe:68:ab:48:25:34:07:a6:cc:
cc:b5:70:60:c4:ae:91:73:19:ff:9d:ff:82:ca:4a:9c:8e:70:
94:96:5f:7c:b3:e8:f7:e4:3e:cc:af:41:7e:24:47:fe:ad:d5:
a7:80:32:80:9c:7f:0c:00:3b:92:4c:ec:8e:ef:93:fb:8a:1f:
ff:be:f0:ab:33:c7:4b:2b:5d:fc:31:e6:bf:f4:1d:c0:e3:d0:
c5:94:a9:21:b1:8c:26:4b:c2:82:51:cf:1b:63:09:b1:ec:45:
31:49:ba:51:42:22:7a:41:90:2f:28:0e:40:76:91:3c:33:34:
84:66:b9:7e:0e:68:5a:37:38:01:b1:92:64:a5:a8:9c:34:84:
6a:c6:01:d0:30:f8:d5:52:0f:6e:3e:40:06:a2:b8:4c:b1:69:
4d:16:8f:d0:c4:72:b6:0e:09:57:6c:5e:cd:bc:ab:e3:ce:80:
ae:a7:6c:3d:3c:01:a5:a3:4f:4d:e0:52:36:12:cc:7a:e2:5e:
f3:d7:22:a7:6c:7c:60:d4:fd:f4:37:94:70:dd:4c:9b:00:cd:
7d:9d:42:f7:e7:b2:25:f6:63:06:1e:4d:dc:4b:ef:5c:45:5d:
a7:b9:b7:33:21:4e:91:40:ba:ca:ec:70:d0:a5:f7:0c:0a:ea:
97:11:fa:47:8b:dd:24:b0:c2:98:ff:94:4f:f6:c8:0f:e9:a5:
2d:bf:b6:7c:f4:45:f3:cb:5a:fd:a0:38:ce:ca:60:24:34:74:
77:ea:91:bc:dc:68:90:53:5f:0a:f4:40:13:69:68:2e:31:f9:
df:7d:07:05:53:42:8a:8b:e0:49:75:ee:04:94:9e:87:1a:25:
9e:82:16:87:a2:69:dd:eb:44:21:4c:98:1d:72:8b:46:74:5c:
33:24:5c:c2:ab:7b:1f:c4:d4:d5:9a:40:77:15:73:d3:53:62:
60:da:5d:7c:2a:9e:12:25
-----BEGIN CERTIFICATE-----
MIIFgTCCA2mgAwIBAgIBATANBgkqhkiG9w0BAQsFADBIMRcwFQYDVQQDEw5TZWN1
cmVUcnVzdCBDQTEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xCzAJ
BgNVBAYTAlVTMB4XDTExMDEwMTAwMDAwMFoXDTI1MTIzMTIzNTk1OVowSDEXMBUG
A1UEAxMOU2VjdXJlVHJ1c3QgQ0ExIDAeBgNVBAoTF1NlY3VyZVRydXN0IENvcnBv
cmF0aW9uMQswCQYDVQQGEwJVUzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
ggIBAL3DJovhN3/w+goNg6fdIjEUgwjXdDsxCITvJc8tRPwtVHcLF+JwTb4vwfzt
2Wue22AoJ8QebRU93blDZDdYtL1IhfrR1vdaM+vst4Zikh+J16S90x/zGJ2kFScW
eyafXFOHvUAi0l7Nq9VvHazDDfHZ1fVq0xZ2WN/3CyAN7XuXrmYK5syfc1D7zham
3EXQL3A+yMhZTcRi7LDpAZxXkuR4g0+mqxuURf8V7dxZlfNxIpwGOLvmD7Psr1u9
Gi+xf87ITTKfj0SbrvzlciS0Ojvz0HkweaIOvVXpzcBNfgf8N7V/ab7W4zfOnv/S
BeQ8WX7w1KsB5HsH9qTw48N+WAct6JacrIvm3ElqUZqzsGLPPLRK+YmuLHMXAUNj
7Ogrexw8gUH625NFOiEfKjqPMNRSWZEDAxG4GMo5TJriVzPmvMVKjnZ5UP29Mnic
eVhPudO7Bes5Q9s+tS1RGO3unTE6Lms3NzQoSonLZbR9v76hZ8tccZy+wzv3p983
TQ/HV/Vb0ttULJFbO3/sH0Xke6UNocIfZK9RzTI6gyWckKx3Zk0SI/VbPJC1QRtU
VaQkZubpZUaV/+9n9aaA9tXmPy/CeyXYs7RN9Lh8OMzePk9Dmsq+wWaVLSwWqVab
aF2MeJCE1IZREPGbFCNDu5EeAgHuEWPE8oF/g2hehr2KiHwtAgMBAAGjdjB0MA8G
A1UdEwQIMAYBAf8CAQAwHQYDVR0OBBYEFOBjGYn6rRld47Ol4oXSL4exVXYbMB8G
A1UdIwQYMBaAFOBjGYn6rRld47Ol4oXSL4exVXYbMA4GA1UdDwEB/wQEAwIBjjAR
BglghkgBhvhCAQEEBAMCANUwDQYJKoZIhvcNAQELBQADggIBAAgzU+S+lQob125E
ay1CKkV/i4n9+9DPX4+Dd107LBFGn0Q7afLi5/5OyUNciV/i4lpeTE057c4tY9Sh
k///P7B3hujxXqNN07rrQQ+FDAT7bEIZvCvR28ZR45fNW+XVtB9D53zrhggWhgtG
I5306Ri2zuX0lnvuX/WN/91lKbkSlPfa08BkU+YrNuxv0yY8wqu6EM3YOUOLIf5o
q0glNAemzMy1cGDErpFzGf+d/4LKSpyOcJSWX3yz6PfkPsyvQX4kR/6t1aeAMoCc
fwwAO5JM7I7vk/uKH/++8Kszx0srXfwx5r/0HcDj0MWUqSGxjCZLwoJRzxtjCbHs
RTFJulFCInpBkC8oDkB2kTwzNIRmuX4OaFo3OAGxkmSlqJw0hGrGAdAw+NVSD24+
QAaiuEyxaU0Wj9DEcrYOCVdsXs28q+POgK6nbD08AaWjT03gUjYSzHriXvPXIqds
fGDU/fQ3lHDdTJsAzX2dQvfnsiX2YwYeTdxL71xFXae5tzMhTpFAusrscNCl9wwK
6pcR+keL3SSwwpj/lE/2yA/ppS2/tnz0RfPLWv2gOM7KYCQ0dHfqkbzcaJBTXwr0
QBNpaC4x+d99BwVTQoqL4El17gSUnocaJZ6CFoeiad3rRCFMmB1yi0Z0XDMkXMKr
ex/E1NWaQHcVc9NTYmDaXXwqnhIl
-----END CERTIFICATE-----
Список отладочных сообщений 32-битной модификации бэкдора:
[work]cmdline:%s
[work]dwDataLen=%d buf_temp=%d
[work]%s no exist
[work]get work err5
[aut]begin tid=%d.
[update_thread]begin tid=%d.
[update_thread]work=%s
[update_thread]get_work ret=%d
[update_thread]wait for work thread exit...
[update_thread]work thread exit ok
[update_thread]load work failed
[pt]proxy_thread begin tid=%d.
[]dwMajorVersion=%d dwMinorVersion=%d
[]rtlVer.dwMinorVersion=%d
[work]DllMain
[work] DLL
[work] VBR/SRV
[wk]RtlGetCurrentUserToken ok
[wk]ImpersonateLoggedOnUser ok
[wk]OpenURL %s Ret=%d
[wk]Err1
[wk]Err4
[wk]GetConfigStrFromURL err
[wk]DecodeStrBuffer err
[wk]DecodeLen err
[wk]RevertToSelf
[]IsProxyEnable Ret=%d
[aut]GetConfigStrFromURL PROXY_NO Ret=%d
[aut]GetConfigStrFromURL PROXY_USER Ret=%d
[aut]JmpAddClientConfig %s with address: %s.
[aut]GetRandom=%d
[aut]szWebURL Not Set
[aut]address_update_thread Exit.
[update_thread]get_work_path ret=%d
[pt]Using IE proxy setting.
[pt]IE proxy NOT setup.
[pt]SmpGetRegProxy Counts=%d
[pt]IE proxy type = %u NOT support, address: %s.
[pt]IE proxy type = %u, address: %s found.
[pt]Add proxy config %s, address=%s.
[work_thread]begin tid=%d
[wt]JmpAddClientConfig %s with address: %s.
[wt]JmpAddProxyConfig %s.
[wt]Proxy:%s
[wt]start Jumper error = %u.
[wt]Jumper start success!
[wt]JmpShutdown
[wt]JmpShutdown=%d
[wt]JmpTeardown=%d
[wt]tid=%d Exit
[Spyder] client module init error = %d.
[Spyder] register mod %d error = %u.
[spyder] alloc mem for ca cert failed.
[spyder] server address already exists in conf list.
[Spyder] alloc client error = %d.
[Spyder] ALLOC client uid = %u.
[Spyder] set ca for client id=%u error=%d
[Spyder] proxy setting exists, srv=%s
[spyder] use proxy [%s] to connect [%s] res = %u.
[Spyder] direct connect to %s error = %u.
[Spyder] connect to %s result = %u, protcol=%u.
[jmp] big packet: recv new big pkt while previous one not handled, old=%u, new=%u.
[jmp] packet size exceed limit = %#X, id=%u.
[jmp] failed to realloc packet buffer, error = %u, pkt id=%u.
[jmp] big packet recv completed, id=%u, size=%u, ext id=%u.
[Spyder] PAUSE ext = %u Before.
[Spyder] PAUSE ext = %u After.
[Spyder] UNINIT ext = %u Before.
[Spyder] UNINIT ext = %u After.
duplicate session id for ext type id = %u.
[Spyder] can't find recv item for type id = %u.
[Spyder] ext type id = %u recved = %u, new recv = %u, but total size = %u
[Spyder] ext type id = %u recv completed, total size = %u.
[Spyder] find ext with same type id = %u while updating, free old ext.
[Spyder] alloc mem for completed ext error = %u.
[Spyder] ext recv %s, free tem buffer, type id = %u.
[Spyder] ext type = %u already loaded, unlaod now for updating.
[Spyder] failed to unload ext from memory.
[Spyder] load ext id = %u into memory error.
[Spyder] MOD LOAD AT %p, size=%u.
[Spyder] alloc mem for loaded item failed, unload ext type id = %u.
[Spyder] inint module type = %u begin.
[Spyder] inint module type = %u end.
[Spyder] alloc mem for mod_pfn error = %u.
[Spyder] unlaod ext id = %u error.
[Spyder] unload_and_free_all_exts.
[Spyder] UNLOAD ext = %u BEFORE.
[Spyder] UNLOAD ext = %u AFTER.
[Spyder] FREE ext = %u AFTER.
[Spyder] free ext cache = %u .
[Spyder] free ext mem = %u .
[Spyder] link setup Result=%d, local = %#X:%u, remote = %#X:%u, uid=%u.
[Spyder] connected callback at %02u:%02u:%02u, id = %u.
[Spyder] Link disconnected at %02u:%02u:%02u, id = %u.
[Spyder] recv data size = %u invalid, from uid=%u.
[Spyder] receive challenge = %I64X.
[Spyder] failed to get host info.
[Spyder] send host info error = %u.
[jmp] LOGIN SUCCESS, link id = %u.
[jmp] internal data process error.
[jmp] unknown state = %u.
[jmp] core process data error, close link = %u.
[Spyder] ext summary size error = %u.
[Spyder] ext recv prepare failed.
[Spyder] EXTENSION recv BEGIN, type = %u.
[Spyder] dll payload recv error.
[Spyder] ext active begin.
[Spyder] ext active result = %s.
[Spyder] ext free cmd not handled.
[Spyder] unhandled ext sub cmd = %u.
[Spyder] call ext failed = %d, sub=%u.
[spyder] unhandled subcmd=%u in tunnel cmd.
[Spyder] unhandled main cmd = %u, sub cmd = %u.
[Spyder] Can't get link id for ext data delevery.
[Spyder] SEND_DATA via link id=%u error = %d.
[Spyder] client link disconnect id = %u.
[Spyder] client send data error = %#X, id = %u.
[Spyder] enum session error = %u.
[Spyder] get Host info error.
[Spyder] save sn value error = %u.
[Spyder] gszUniqueSN=%s
[Spyder] create guid error = %d.
[jmp] Get adapter info error = %u.
[jmp] adapters info buf size=%u, count=%u.
Alloc buf for adapter info error = %u.
get adapter info with buf error = %u.
[jmp] IP=%s not match preset mac address, desc=%s.
[jmp] master adapter FOUND! IP = [%s], desc=%s.
[jmp] master adapter has more than one ip: %s.