Буткит на исследование

Ar3s

Старожил форума
Легенда
Регистрация
30.12.2004
Сообщения
3 357
Реакции
1 404
01285_01.gif

Это не совсем обзор, но может быть многим интересно!


Итак, имеется буткит "маячек".
Защита dll довольно серьезная.
Уважаемый steklo согласился для дамаги сделать реверс, и вот что из этого вышло:

Библиотека динамической компоновки(DLL) "d3videomx.dll". Размер 49152 байт.
PE32(GUI)DLL. Версия компоновщика 6.0. Содержит зашифрованную DLL библиотеку.
Единственным назначением этой программы является расшифровка и самостоятельное отображение библиотеки в память без помещения на диск. Программа расшифровывает шелкод который выполняет отображение и все необходимые действия для обеспечения инициализации и работы библиотеки. В дальнейшем вызовы (DLL_PROCESS_ATTACH,...) полученные программой предаются на точку входа отображенной библиотеки. Так же во время работы программа подсчитывает время выполнения отдельных участков кода с целью противостоять отладке. Расшифрованная библиотека находится рядом с отчётом и называется "IntMayak.dll" так как это её внутренее имя.

Библиотека динамической компоновки(DLL) "IntMayak.dll". Размер 20480 байт.
PE32(GUI)DLL. Версия компоновщика 10.0. Является главным модулем программы и реагирует только на вызов "DLL_THREAD_ATTACH". Программа проявляет активность в процессе к которому она подгружена только если он имеет одно из следующих имён:
"iexplore.exe","opera.exe","firefox.exe","safari.exe","chrome.exe" другие имена установить не удалось так как программа не содержит образцы строк а использует контрольные суммы строк которые сравнивает с контрольной суммой имени текущего процесса. Всего в программе имеется семь образцов контрольной суммы разных имён процессов которые принадлежат распространнённым браузерам. При сходстве имени с одним из образцов имени программой выполняется перехват процедур "recv","send", "WSASend","WSARecv","closesocket","WSASocketW","connect","WSAConnect","select", "WSAGetOverlappedResult","WSAAsyncSelect","ioctlsocket","WSAEnumNetworkEvents", "WSAEventSelect" и создание файла конфигурации в "%APPDATA%". Файл конфигурации заполняется данными которые зашифрованы сгенерированным программой ключом. Таким образом программа получает возможность подменять входящие или исходящие данные.
Расшифрованный файл конфигурации находяится рядом с отчётом и называется "CFG". Его содержимое в более читабельной форме находится в файле "cfg.txt". (Вместо %? предполагается наличие строк которые пока не определены)

P.S. Если бы не защита то реверсить было бы совсем нечего.

Времени потерял прилично, так как достаточно сложная защита

Скачать материалы можно тут
Пароль: reverse1
 
Ниразу не обзор, по ссылке сверху более подробное описалово.
Народ хотел услышать про работу буткита а услышал про сухое описание размера
дллок и используемые апишки.

КГ\АМ

PS С наступающим!
 
// offset: ImageBase + 0x32c3
signed int __cdecl protection1()
{
int v0;
signed int result;
unsigned __int32 v2;
unsigned __int32 v3;
signed int v4;
struct _FILETIME SystemTimeAsFileTime;
LARGE_INTEGER PerformanceCount;

v0 = dword_1000B24C;
if ( !dword_1000B248 || dword_1000B24C != 47936 )
{
GetSystemTimeAsFileTime(&SystemTimeAsFileTime);
v2 = SystemTimeAsFileTime.dwLowDateTime ^ SystemTimeAsFileTime.dwHighDateTime ^ GetCurrentProcessId();
v3 = v2 ^ GetCurrentThreadId();
GetTickCount();
dword_1000B248 = SystemTimeAsFileTime.dwLowDateTime;
v0 = LOWORD(PerformanceCount.HighPart) ^ (unsigned __int16)v3 ^ (unsigned __int16)PerformanceCount.LowPart;
if ( !(LOWORD(PerformanceCount.HighPart) ^ (unsigned __int16)((_WORD)v3 ^ (_WORD)PerformanceCount.LowPart)) )
{
v0 = 47936;
}
QueryPerformanceCounter(&PerformanceCount);
}
v4 = ~v0;
result = v4;
dword_1000B24C = v4 | 1;
return result;
}

// offset: ImageBase + 0x4bbc
int __cdecl protection2()
{
int result;
int v1;
int v2;

result = dword_1000B2D4;
v1 = *(_DWORD *)(dword_1000B2D4 + 40);
if ( v1 )
{
v2 = dword_1000B2E8 + v1;
dword_1000B2D0 = v2;
result = ((int (__stdcall *)(int, signed int, _DWORD))v2)(dword_1000B2E8, 2, 0);
}
return result;
}

Нопим все процедуры, далее ставим брэйкпоинт на
offset:ImageBase + 0x1ccd
и прослеживаем за работой свежезагруженной либы :)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх