Решение Maxwellkill - Crackmaxme 2

Сложность: 2 – Needs a little brain (or luck)
Платформа: Windows
Язык: Borland Delphi
Дано: Crackmaxme 2

Hi. This is my second crackme.
Patch file crackmaxme2.exe or find algritm key generation and write keygen.
Patching rules:
1. Remove the dependence of the stub.exe
2. Remove anti-patch protection

Good luck.

Решение (автор bike)
опубликовано 15.04.2012

Согласно задания – решением будет либо найти способ пропатчить программу так, чтобы убрать зависимость от stub.exe и сопутствующие проверки, либо написать кейген. Самый простой способ – патч.

Инструменты: IDA, Ollydbg

Дано: сам crackme - crackmaxme2.exe и некий stub.exe. Программки написаны на Delphi, обфускации кода нет, антиотладки нет. При запуске сначала появляется триальное окно с предупреждением, что надо указать регистрационные данные (причем ведется счетчик – сколько раз запускали crackme):

image00.jpg

По кнопке «Enter code» вводим регистрационные данные. Что забавно: поля имени и ключа вообще можно оставить пустыми при вводе – никакой проверки нет вообще; введенные данные сохраняются в файле cmm2.dat в папке, где лежит crackme; есть досадная ошибка в коде - при проверки существования cmm2.dat функция IOResult (вызов по адресу 00454DC6) всегда возвращает код 103 (файл не открыт, причина, скорее всего, ), независимо от того, создан ли файл, или его нет. Да, и все-таки, если задуматься о создании кейгена, то выясниться (при анализе кода), что имя никак не связано с ключом. Имя само по себе, а ключ создается на базе несложных предопределенных значений.

image01.jpg

Цель crackme: при правильном ключе разблокировать кнопку «Go».

image02.jpg

Патч. Убираем зависимость от stub.exe

Можно заметить, что по адресу 00454D97 crackmaxme2.exe проверяет, существует ли файл "stub.exe". Если вызываемая функция по адресу 00454D92 (анализ сигнатур указывает на Sysutils::FileExists) возвращает 0, то stub.exe не существует и приложение завершается. Поэтому, изменив команду перехода по адресу 00454D99 с JZ на JMP, будет всегда срабатывать переход, даже если файл не существует.



Патч. Убираем дополнительные проверки.

Функция проверки ключа (вызов по адресу 00454E63) возвращает 1 в случае правильных данных регистрации.



Самый простой способ регистрации заключается в использовании двух NOP (90 90) вместо JZ (74 09) по адресу 00454E6A. Но если сделать этот патч, сохранить и запустить программу, увидим, что она тут же прекращает работу. Значит, есть что-то препятствующее патчу. И точно. Вот псевдокод начала работы crackme:
1) 00454C8B – сначала программа копирует сама себя под именем "(1)crackmaxme2.exe"
2) 00454CE0 – открываем файл "(1)crackmaxme2.exe" на чтение
3) 00454D03 – устанавливаем указатель в файле на смещение 005426A (виртуальный адрес 00454E6A)
4) 00454D11 – читаем 1 байт по заданному смещению
5) 00454D16 – сверяем прочитанный байт со значением 74h (JZ)

Пункт 5 в коде выглядит так:



Патч. Итоги.



Кейген. Шаблон ключа.

Регистрационные данные хранятся в файле «cmm2.dat» (309 байт). Имя может быть любое. А по ключу приведу шаблон, потому что весь ключ строится на константах.

CRCMXM0054222EC40000000035A4E9001A7DAF1C000000696E2458E5CA9D0BD813E99E62574E058C

«CRCMXM» - константа
«00» – любое значение (ASCII символ)
«54222EC4» – константа (число, удовлетворяющее условию 0xAB4 < число / 0x7536F <= 0xB7C)
«00000000» – любое значение из алфавита [0-9a-fA-F] (условие: число < 0xA1C30FB1 или число > 0xA1C40FB1)
«35A4E900» – константа, корень квадратный из этого числа должен быть равен 30000 (десятичное число)
«1A7DAF1C» - это 444444444, где сумма цифр, составляющих число, >= 35
«00000069» – это результат операции (0x1A7DAF1C » 0x16)
6E2458E5CA9D0BD813E99E62574E058C – это MD5 хэш строки «CONTERSTRIKEFOREVER»

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License