Упаковщик: отсутствует
Даты компиляции:
- 17.11.2017 11:54:18 (версия для архитектуры x86)
- 17.11.2017 11:54:15 (версия для архитектуры x64)
SHA1-хеши:
- e4e365cc14eeeba5921d385b991e22dea48a1d75 (x86)
- b07568ef80462faac7da92f4556d5b50591ca28d (x64)
Описание
Троянская библиотека, написанная на C и предназначенная для работы в среде 32- и 64-битных операционных систем семейства Microsoft Windows. Является одним из компонентов семейства Trojan.XPath и устанавливается в целевую систему вредоносной программой Trojan.XPath.1. Основное предназначение этой библиотеки — внедрение в процесс svhost.exe полезной нагрузки, которая сохранена в реестре.
Принцип действия
Trojan.XPath.3 имеет следующие экспортируемые функции:
DllCanUnloadNow
DllGetClassObject
DllGetVersion
DllInstall
DllRegisterServer
DllUnregisterServer
Троян получает необходимые импортируемые функции через WinAPI LoadLibraryA/GetProcAddress, при этом имена требуемых функций в его коде не зашифрованы.
Если троян работает в контексте процесса explorer.exe, то он проверяет, в какой версии ОС он запущен.
Для систем младше Windows Vista Trojan.XPath.3 получает экспорты функций из themeui.dll:
DllCanUnloadNow
DllGetClassObject
DllInstall
DllRegisterServer
DllUnregisterServer
Для систем начиная с Windows Vista и старше получает экспорты функций из ExplorerFrame.dll:
DllCanUnloadNow
DllGetClassObject
DllGetVersion
0x6E
0x6F
0x86
Адреса этих функций нужны трояну для того, чтобы вызывать соответствующие функции, когда будет вызван одноименный экспорт троянской библиотеки.
С помощью мьютекса Global\\RunThreadOfWinDDK8O98 Trojan.XPath.3 проверяет, что работает только один его экземпляр.
Через ZwQuerySystemInformation троян считает количество запущенных в системе процессов. Он ожидает, пока их количество превысит 7, после чего запускает процесс %WINDIR%\\system32\\svchost.exe с флагом CREATE_SUSPENDED.
Trojan.XPath.3 считывает параметр DirectShow из ветви реестра [HKLM\\SOFTWARE\\Microsoft\\LoginInfo] или [HKCU\\SOFTWARE\\Microsoft\\LoginInfo], где содержится полезная нагрузка, и распаковывает ее библиотекой APLib.
Затем троян выделяет блок памяти размером 0xC80F0 байт. В начале блока он формирует следующую структуру:
#pragma pack(push,1)
struct mod
{
char char0[128];
_QWORD LdrLoadDll;
_QWORD LdrGetProcedureAddress;
_QWORD ZwProtectVirtualMemory;
_QWORD ZwCreateSection;
_QWORD ZwMapViewOfSection;
_QWORD qwordA8;
_QWORD NtTerminateThread;
_QWORD qwordB8;
_QWORD qwordc0;
_QWORD is_x64;
_QWORD payload_size;
_QWORD qwordd8;
_BYTE payload[payload_size];
};
#pragma pack(pop)
При этом в исследованном образце значение char0 является константой asdsad11111222333.
Троян выделяет в запущенном ранее процессе svchost.exe блок памяти размером 0xD80F0 байт и копирует в него весь регион размером 0xC80F0 байт.
Далее Trojan.XPath.3 ищет константу 0x12345688 в зашитом в него шелл-коде и заменяет ее на адрес ранее выделенного в процессе svchost.exe участка памяти. После этого он копирует данный шелл-код в этот выделенный блок по смещению 0xC90F0.
Для ОС младше Windows 8 троян получает CONTEXT потока в процессе svchost.exe и выполняет патч RIP/EIP-регистра на адрес шелл-кода с добавлением к нему 8 байт. Для более поздних версий ОС Windows Trojan.XPath.3 запускает поток через NtCreateThreadEx.
Артефакты
Следы отладочной информации в троянской библиотеке позволяют узнать имя файла с исходным кодом трояна:
PayloadDll.c
Различные отладочные сообщения, которые содержатся в библиотеке:
os ver:%d,%d,%d
payload_%04d-%02d-%02d_%02d-%02d-%02d.dmp
get target api address false\n
depack get packed size error:%d\n
depack false\n
Alloc Mem in target process false!!!\n
writing info to target process false!!!,%d,%d,%x
get magic false\n
writing stub to same architecture process:%p\n
writing payload to target process false!!!,%d
GetProcessEntryPoint is:%x\n
!OpenProcessToken,%d\n
!DuplicateTokenEx,%d\n
get TokenInformation,%d\n
!SetTokenInformation,%d\n
!pCreateEnvironmentBlock,%d\n
!xOpenProcess \n
loader path:%s\n
Creaet Process All Failed ERROR=%d\n
try gen info\n
gen info ok\n
WritePayloadToRemote false\n
write info ok\n
error thread
GetThreadContext Error\n
GetThreadContext eip:%p\n
set thread context error\n
SetThreadContext eip:%p\n
create thread ok\n
get func error in payload\n
get lib error in payload\n
try runthread in payload\n
in payload\n