Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #85, ЯНВАРЬ 2006 г.

Капитуляция защитных механизмов

Крис Касперски ака мыщъх

Хакер, номер #085, стр. 085-110-2


Экран дизассемблера должен выглядеть приблизительно так:

LOAD:00200008 start proc near

LOAD:00200008 mov bl,2Ah ; заслать в регистр BL значение 2Ah

LOAD:0020000A jmp loc_200040 ; прыгнуть на loc_200040

...

LOAD:002002F0 sub_2002F0 proc near ; CODE XREF: start:loc_200046p

LOAD:002002F0 nop ; процедура расшифровщика

LOAD:002002F1 mov eax,offset loc_20004B ; начало шифроблока

LOAD:002002F6 mov esi,eax ; устанавливаем источник на начало

LOAD:002002F8 mov edi,esi ; устанавливаем приемник на начало

LOAD:002002FA mov ecx,2A5h ; длина шифроблока в байтах

LOAD:002002FF shr ecx,2 ; переводим байты в двойные слова

LOAD:00200302

LOAD:00200302 loc_200302: ; CODE XREF: sub_2002F0+19j

LOAD:00200302 lodsd ; извлекает очередное двойное слово

LOAD:00200303 xor eax,3F5479F1h ; шифруем его

LOAD:00200308 stosd ; помещаем обратно

LOAD:00200309 loop loc_200302 ; мотаем цикл расшифровки

LOAD:0020030B retn ; выходим из процедуры

Точка входа (start), расположенная по адресу 200008h, выглядит нетипично и сразу же притягивает к себе внимание. Нормальные ELF-файлы начинаются с адреса 08048000h (см. статью «Секреты покорения эльфов»), а этот разлегся, понимаешь, в области стека и лежит себе. Ну и пускай лежит! Он же никому не мешает! Такой прием вполне законен, и все нормально работает. Отладчиков это, похоже, ничуть не смущает, да и дизассемблеры тоже. Это совсем не антиотладочный прием, а просто хитрый выкрутас создателя крэкмиса. Ладно, идем дальше.

Выполнение программы начинается с команды «mov bl,2A», загоняющий в регистр BL значение 2Ah. Нигде по ходу программы оно не используется, так что это явный мусор. Или все-таки нет? В ASCII-представлении команда выглядит как «?*», и, возможно, внесена умышлено, но вот расшифровать ее смысл мыщъху так и не удалось, поэтому он через серию прыжков типа jmp loc_200040 -> jmp loc_200046 -> call sub_2002F0 добирается до «заветной» процедуры sub_2002F0. Это практически единственная процедура в программе, а все остальное содержимое, как легко видеть, зашифровано. Логично предположить, что это и есть расшифровщик!

Расшифровка кода в дизассемблере всегда представляла большую проблему. Дизассемблер не может дизассемблировать упакованный/зашифрованный код, и его надо как-то расшифровать. А как это сделать? Одни хакеры предпочитают снимать с работающей программы дамп, другие - создают специальный скрипт, расшифровывающий файл прямо в дизассемблере. Первый путь проще, второй надежнее. Если программа использует различные антиотладочные приемы, то она сможет подсунуть нам испорченный дамп, если вообще позволит дотронуться до него. Лучше расшифруем программу вручную, заодно познакомившись со скриптами IDA Pro, но для этого нам потребуется проанализировать алгоритм работы процедуры расшифровщики. Это легко!

Назад на стр. 085-110-1  Содержание  Вперед на стр. 085-110-3