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

Невидимая война

Ara (ara@cracklab.ru)

Хакер, номер #085, стр. 085-064-3


Так как ошибка появляется после сплеш-формы и до открытия основного окна, то поставим в отладчике бряк на TForm1.FormCreate. Адрес 0091E050 нам подскажет DeDe. Запустив программу под отладчиком и остановившись в нужном нам месте, немного потрейсим код до появления ошибки, попутно отмечая, что делает программа, но не вдаваясь в подробности. Кажется, что программа делает совершенно не нужные ей действия: считывает серийные номера дисков, дату и версию BIOS, читает наш введенный код из файла сheckSum.dat и даже проверяет наличие отладчика SoftIce.

[код, расшифровываемый во время выполнения]

0091EBF6 6A 00 PUSH 0

0091EBF8 68 80000000 PUSH 80

0091EBFD 6A 03 PUSH 3

0091EBFF 6A 00 PUSH 0

0091EC01 6A 03 PUSH 3

0091EC03 68 000000C0 PUSH

0091EC08 A1 18569300 MOV EAX,DWORD PTR DS:[935618]

0091EC0D 50 PUSH EAX

0091EC0E E8 1586EEFF CALL <JMP.&kernel32.CreateFileA>

Что интересно, этот кусок кода расшифровывается во время выполнения программы, если посмотреть листинг в IDA, то там будет совершенно другой код.

На рисунке в левой части код ДО запуска программы, в правой - ПОСЛЕ запуска. Разница очевидна. Значит, мы на верном пути, если автор решил эту часть скрыть. Поэтому придется запустить программу, чтобы раскриптовались все участки и использовать функцию DeDe «Дампить активный процесс». Отметим, что ошибка вылетает при вызове процедуры по адресу 91F201:

[код, на котором вылетает ошибка]

0091F201 MOV EAX,DWORD PTR SS:[EBP-128]

0091F207 CALL SuperSol.0091DF30

0091F20C MOV ECX,DWORD PTR DS:[9378F8]

0091F212 CMP EDX,DWORD PTR DS:[ECX+4];\

0091F215 JNZ SHORT SuperSol.0091F219; ключевые сравнения

0091F217 CMP EAX,DWORD PTR DS:[ECX]; /

0091F219 JE SHORT SuperSol.0091F220

0091F21B CALL <SuperSol.@System@@Halt0$qqrv (00E4: C3)>

0091F220 MOV EDX,DWORD PTR SS:[EBP-8]

0091F223 MOV EAX,DWORD PTR SS:[EBP-4]

0091F226 MOV EAX,DWORD PTR DS:[EAX+628]

0091F22C CALL SuperSol.0092E640

0091F231 JMP SHORT SuperSol.0091F23D

[железный бряк]

В ЕАХ лежит указатель на наш введенный неправильный код. Если посмотреть чуть ниже, станет очевидно, что программа нормально запустится, если успешно выполнить сравнения по адресам 91F212 и 91F219. Скорее всего, это просто сравниваются два 64-битных числа. Ставим hardware breakpoint на адрес 0091F201, так как обычный breakpoint по F2 поставить не получится - код-то распаковывается во время выполнения. Встречаются такие защиты, точнее методы противодействия отладки: обычный бряк - это не что иное, как команда int3, вставляемая по адресу устанавливаемого бряка. При выполнении этой команды отладчик соответствующим образом ее обработает, заменит на оригинальную команду и остановится - бряк сработает. В нашем же случае код расшифровывается динамически, то есть вставленная отладчиком команда int3 будет просто затерта.

Перезапустим теперь программу с установленным hardware breakpoint и после останова можем спокойно ставить бряк на адрес 0091F20C (следующая команда после найденной процедуры), чтобы посмотреть, что за числа сравнивает программа перед выходом. Одним из тех двух чисел оказывается код ЭВМ, а второе, очевидно, декодируется из ответного кода. Не зря же он передается в процедуру перед сравнением. Поэтому посмотрим на эту самую процедуру. При заходе в нее сразу бросаются в глаза строки 14162795658430266512815 и 188013097933370886974627. Первая мысль при их виде - RSA. Заглянув внутрь процедуры 885A2C, все сомнения исчезли. Это старая добрая реализация RSA из какого-то популярного среди программистов-шароварщиков делфи-компонента. Описание алгоритма шифрования RSA приведено в соответствующей врезке, настоятельно рекомендую тебе ознакомиться с ним, это нужно для понимания того, о чем я буду говорить. А мы сейчас продолжим взлом программы.

Назад на стр. 085-064-2  Содержание  Вперед на стр. 085-064-4