Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Распаковка исполняемых файлов — одна из задач, возникающих при реверсе. И если наш объект — это малварь, то зачастую приходится сталкиваться с кастомными упаковщиками. В этой статье я покажу, как справиться с защитными механизмами банкера GootKit, который постоянно развивается и апгрейдится, к тому же использует разные методы сопротивления отладке.
В прошлой статье мы пробежались по азам вскрытия кастомных пакеров, взяв для примера вымогатель GlobeImposter 2.0. Он практически не сопротивлялся распаковке и кое-чем даже помогал в этом деле.
Из инструментария мы будем использовать отладчик x64dbg (его 32-битную версию x32dbg), интерактивный дизассемблер IDA, шестнадцатеричный редактор HxD и детектор пакеров и протекторов DiE. Мы будем противостоять антиотладке при помощи мьютексов и разберемся с нестандартными параметрами функции CreateFileA
.
Все описанные в статье действия выполнялись внутри виртуальной машины, которая была изолирована от сети. Повторение действий на основном компьютере может привести к заражению банкером GootKit, способным похитить твои данные.
Для начала давай посмотрим на GootKit через программу Detect it Easy.
Детектор не определяет никакой навесной защиты, зато энтропия файла зашкаливает.
Загружаем файл в дизассемблер для более интимного знакомства. Видим, что при входе у нас сразу идет вызов подпрограммы. Прыгаем в него и наблюдаем достаточно интересный код.
На стек помещаются значения, инициализируются переменные, далее идут вызовы. Разумеется, это похоже на динамический вызов функций.
Чтобы самостоятельно убедиться в этом, можешь скомпилировать и посмотреть в IDA простую программу, которая использует эту технику вызовов. Конечно, код будет более «чистый» и понятный, но общая суть очевидна.
int main()
{
typedef NTSTATUS(WINAPI *pNtQueryInformationProcess)(HANDLE, UINT, PVOID, ULONG, PULONG);
ULONG dProcessInformationLength = 0;
PVOID DbgPort;
pNtQueryInformationProcess pNtQueryInfoProcess = (pNtQueryInformationProcess)GetProcAddress(LoadLibrary(L"ntdll.dll"), "NtQueryInformationProcess");
NTSTATUS Status = pNtQueryInfoProcess(GetCurrentProcess(),7,&DbgPort,dProcessInformationLength,NULL);
if (Status == 0x00000000) return 0;
return 0;
}
Давай переключимся в псевдокод, нажав кнопку F5, так будет еще очевиднее.
Инициализация и вызов функций выглядит таким образом:
v3 = v1(byte_41F00C, byte_41F0F8);
v33 = (void (__stdcall *)(char *, char *))v2(v3);
v4 = v1(byte_41F00C, byte_41F0EC);
v32 = (int (__stdcall *)(char *))v2(v4);
v5 = v1(byte_41F0A4, byte_41F0B0);
И тем не менее код кажется странным, хоть и очевидно, как он работает и что делает. Посмотрим перекрестные ссылки на буферах, которые передаются в функции. Вот один из буферов.
Очевидно, применяется шифрование строк при помощи XOR по ключу 89798798798g79er$
. Видим шифротекст byte_41F000[edi]
.
Псевдокод этого алгоритма такой:
do
{
byte_41F000[v30] ^= a89798798798g79[v30 % v29];
++v30;
}
while ( v30 < 11 );
v31 = strlen(a89798798798g79);
Зная ключ, попробуем расшифровать содержимое буфера средствами Python, который встроен в IDA. Набираем
x = idc.GetManyBytes(0x41F0EC, 0x0B)
Пишем байты по адресу 0x41F0EC
в количестве 0x0B
в переменную encrypt. Проверим, просто введя имя переменной и нажав Enter:
Python>encrypt = idc.GetManyBytes(0x41F000, 0x9)
Python>encrypt
hJVIQl]T[
Все верно: это именно то, что мы видели в IDA. Теперь присвоим переменной y
известный нам пароль и зададим переменную decrypt
для выходных данных:
Python>y = "89798798798g79er$"
Python>decrypt = ""
Теперь приступим к циклу дешифровки.
|
|