• XSS.stack #1 – первый литературный журнал от юзеров форума

CrackMe Crackme Ice9 от TripleTordo. (writeup)

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Всем привет. В этот туториале рассмотрим крекми (кейгенми) от TripleTordo под названием Ice9. Вот что автор пишет про свой крекми-кейгенми.

Дата релиза: 3 июля 2009 г.

Компилятор: Масм

Язык: чистый win32ASM

Уровень: 1/10

Привет!, это мой первый крекми (кейгенми), он очень простой, для новичков. Я надеюсь, вам он понравится.

Правила:

- Внесение патчей запрещено.

- Разрешен риппинг кода

Просто: найдите схему защиты (алгоритм создания серийного номера), объясните его и сделайте туториал и свой собственный кейген.

Это кейген-ми. Разрешены только кейгены. Он очень простой, никакой защиты/шифрования, только одна маленькая хитрость. Удачи.

Надеюсь, вам он понравится, а если вы не сможете найти правильное решение, надеюсь, вы чему-нибудь да научитесь.


Прикольное описание. Надеюсь мы тоже чему-нибудь да научимся :) Сложность 1 из 10. И нельзя патчить приложение. Но мы все же его сначала пропатчим, чтобы взломать, а затем разберем алгоритм генерации ключей.

Для начала запустим его и посмотрим на его внешний вид.

1697794512260.png

То есть нам нужно ввести имя и серийный нрмеп, нажать кнопочку чек и проверить правильность наших догадок.

Давайте загрузим наш крекми в наш дизассемблер IDA PRO. Я буду использовать версию 6.8. Так как она установлена на ПК.

1697794522868.png


Нам загружается следующее представление, которое не очень удобно.

1697794531350.png


Давайте нажмем на спейсбар и переключимся на классический вид.

1697794539305.png


Это наша точка входа. Давайте посмотрим, что у нас тут есть.

1697794547501.png


Всего 3 функции, функция для получения дескриптора модуля, создание диалога и выход для процесса. Но если посмотрим внимательно у диалога есть смещение в виде функции. Давайте дважды кликнем правой кнопкой мыши и перейдем в обработчик.

1697794557735.png


Вот как выглядит вся функции.

1697794565850.png


Чтобы сделать такой вид, я зажимая [Ctrl] и кручу колесико мыши увеличивая или уменьшая вид. Попробуем найти здесь функцию, по считыванию данных с поля ввода. Она называется

GetDlgItemTextA

Переходим налево на функции и выбираем эту функцию.

1697794584704.png


Также видно, что у нас есть 5 функций. Одну мы уже рассмотрели. Это функция диалога. Остальные четыре нам не известны.

Попадаем сюда.

1697794596554.png


На GetDlgItemTextA нажимаем [Х] и появляется окошко с перекрестными ссылками.

1697794602042.png


Видно, что эта функция вызывается два раза. Давайте перейдем на первую через Л.К.М.

Попадем сюда.

1697794610412.png


Чуть ниже есть проверка на длину символов. Длина должна быть равна 4 или больше. То есть здесь вводиться логин.

1697794618703.png


Ещё чуть ниже ещё одна проверка, то есть логин должен быть не больше 10 знаков.

1697794626255.png


Иначе мы попадем на следующий мессадж бокс.

1697794632955.png


Также есть ещё один мессадж бокс, если мы забыли ввести серийный номер.

1697794640749.png


И затем идет следующий вызов.

1697794650231.png


Я переименую его в CHECK через клавишу [N].

1697794655943.png


Заходим в функцию и попадаем сюда.

1697794663693.png


Сразу посмотрим через [F5] насколько сложна функция.

1697794677338.png


Функция сложноватая, плюс к этому вызывается ещё две функции из неё.

1697794689910.png


Скорее всего нам потребуется отладка. Сейчас же давайте запустим отладчик через [F9] и попробуем взломать программу, хотя нам это не разрешали. Хе-хе.

Но отладчик не загружается. Виной тому функция IsDebuggerPresent.

1697794742653.png


Сейчас я запускаю Олли, и патчу этот переход, чтобы нам было легче работать.

1697794748050.png


Меняем JNZ на JZ.

1697794754827.png


Нажимаю П.К.М и выбираю пункт All modification.

1697794761113.png


1697794766293.png


После этого в новом окне выбираю Save File и сохраняю под новым именем.

1697794777577.png


Теперь этот новый файл загрузим в нашу Иду и попробуем выполнить через [F9].

Файл загружается. Теперь попробуем найти в этом блоке БэдБой и ГудБой.

Вот они слева направо.

1697794799608.png


Также есть один оторванный джамп. Я держа клавишу [Ctrl] выбираю первый и второй джамп, нажимая Л.К.М. и группирую блоки через соответствующее меню.

1697794807581.png


Также чуть выше есть два джампа, я их также группирую, чтобы они не мешались.

1697794817865.png


Получается так.

1697794825209.png


Теперь, что нам нужно пропатчить, чтобы крекми запустился с любым серийный номером?

Нам нужно исправить эту инструкцию на противоположную.

1697794835839.png


Её адрес 401206. Идем в олли и меняем переход.

1697794845228.png


1697794850386.png


Теперь пробуем запустить креми и ввести цифры 1234-1234.

1697794860631.png


Итак. Первую часть мы прошли. Теперь давайте будем разбираться с алгоритмом.

Я буду оставлять комментарии по блокам.

1697794963127.png


Здесь у нас происходит инициализация. Сохраняется EBP, потом ESP перемещается в EBP, вызывается функция подсчета длины строки для введенного нашего имени. В EDX помещается адрес 40316A. Далее в 40316A помещается длина строки. В EDI хранится адрес нашего имени, в ESI адрес 403119. Далее обнуляются четыре регистра. Снова в EDX помещается 40316A. И в этот адрес кладется длина строки. Сейчас я переименую эту переменную.

Получится вот так.

1697794976158.png


Далее так

1697794984256.png


Сразу увеличивается EBX на один. Сранивается с EDX и если не равно идем сюда.

1697794990932.png


Здесь у нас числа в хексе. Я буду менять их на десятичные.

1697794997283.png


Считывается очередной символ из EDI и сравнивается с символом Z. Если меньше или равно, то идем ниже.

1697795004442.png


Здесь сравнивается текущий символ с символом A. Если больше или равно идем ниже

1697795011761.png


Присваиваем AL значение 44.

1697795018824.png


Здесь в ECX идет накопление, того что было в EAX, идет увеличение EDI, то есть переход к следующем символу и джамп на начало цикла.

1697795035234.png


Теперь мы можем объединить все эти блоки в один и написать наш псевдокод. У меня получилось вот так

1697795043818.png

Заметим, что код цикла выполняется на один раз меньше чем количество символом в имени ввиду того, что сразу в начале цикла идет ADD EBX,1.

Псевдокод такой.

for letter in username[:-1]:

temp = temp + ord(letter)

if 65 <= ord(letter) <= 90:

temp = temp + 44


Далее у нас такой код.

1697795072034.png


Поменяем хекс на десятичные цифры.

1697795078840.png


Напоминаю, что в ECX у нас хранится результат от предыдущей операции.

К ECX прибавляется 666, затем умножается на 12345, вычитается 23 и умножается на 9. Затем EBX = 0, EAX присваивается ECX, а ECX присваивается 10.

Псевдокод такой.

temp = temp + 666

temp = temp * 12345

temp = temp - 23

temp = temp * 9

Дальше у нас следующий цикл.

1697795094207.png


EDX присваивается 0, затем идет деление EAX на 10, так как ECX равен А. В DL у нас находится остаток от деления и к этому значению прибавляется 48. DL сохраняется в адрес памяти на который указывает регистр ESI. Я назвал его ZERO, так как вначале он содержал нули. EBX увеличивается на 1 и идет проверка EAX на ноль. Если равно 0 то идем дальше, иначе повторяем цикл. В ESI теперь находится наш предварительно подговленный серийный номер, пока ещё неверный.

1697795103057.png


Псведокод для этой функции такой.


while temp:

serial = serial + chr(temp % 10 + 48)

temp = temp // 10


Я объединяю также эти два блока в один.

1697795128959.png


Получилось вот так.

1697795137669.png



Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник: https://xss.pro/threads/100501/


В следующем блоке в EDI помещается указатель на серийный номер, пока тоже не правильный, но я назвал его так, потому, что он уже почти похож на правильный.

1697795196329.png


Следующий блок тоже очень интересный.

1697795206750.png


Берется самый крайний символ из массива ZERO и помещается в массив SERIAL. Далее EDI увеличивается, а EBX наоборот уменьшается. И идет проверка на ноль. То есть тут у нас идет инверсия строки.

На входе.

1697795217307.png


На выходе.

1697795230361.png


Это можно заменить псевдокодом

serial = serial[::-1]

И у нас остался последний блок.

1697795245367.png


MOV завершает строку нулем. В EDI помещается адрес нашего имени. Потом идет какой-то неизвестный адрес. Если посмотрим перекрёстную ссылку, то увидим следующее.

1697795259868.png


То есть адрес до этого нигде не использовался. Что же это такое и как мы его назовем? Давайте перейдем на него во время отладки. Видим что он хранит четвертый символ нашего имени.

Сейчас я собрал строку через клавишу [А].

1697795271942.png


Давайте посмотрим как изменится наш код.

1697795282852.png


То есть в кол передается адрес на строку 45 и на серийный номер.

Давайте не будем заходить в кол, а остановимся на функции lstrcmpA и посмотрим на уже заполненные переменные.

То есть все это время ответ у нас был под носом и мы даже не подозревали об этом :)

1697795298401.png


Последнюю функцию я переименую в СONCAT, так как тут и ежу понятно, что она делает. Берется строка начиная с четвертого символа и присоединяется к нашему серийнику.

1697795310468.png

Попробуйте сами разобрать её алгоритм. Итого мы имеем следующее.


1697795322095.png



Мы победили очередной крекми!!! Надеюсь Вам понравился этот урок. Напоминаю, что он рассчитан на новичков. До встрече в следующем уроке.

Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник: https://xss.pro/threads/100501/


База и файлы
 

Вложения

  • Ice9.zip
    37.9 КБ · Просмотры: 5
Последнее редактирование:


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