Всем привет. В этот туториале рассмотрим крекми (кейгенми) от TripleTordo под названием Ice9. Вот что автор пишет про свой крекми-кейгенми.
Дата релиза: 3 июля 2009 г.
Компилятор: Масм
Язык: чистый win32ASM
Уровень: 1/10
Привет!, это мой первый крекми (кейгенми), он очень простой, для новичков. Я надеюсь, вам он понравится.
Правила:
- Внесение патчей запрещено.
- Разрешен риппинг кода
Просто: найдите схему защиты (алгоритм создания серийного номера), объясните его и сделайте туториал и свой собственный кейген.
Это кейген-ми. Разрешены только кейгены. Он очень простой, никакой защиты/шифрования, только одна маленькая хитрость. Удачи.
Надеюсь, вам он понравится, а если вы не сможете найти правильное решение, надеюсь, вы чему-нибудь да научитесь.
Прикольное описание. Надеюсь мы тоже чему-нибудь да научимся
Сложность 1 из 10. И нельзя патчить приложение. Но мы все же его сначала пропатчим, чтобы взломать, а затем разберем алгоритм генерации ключей.
Для начала запустим его и посмотрим на его внешний вид.
То есть нам нужно ввести имя и серийный нрмеп, нажать кнопочку чек и проверить правильность наших догадок.
Давайте загрузим наш крекми в наш дизассемблер IDA PRO. Я буду использовать версию 6.8. Так как она установлена на ПК.
Нам загружается следующее представление, которое не очень удобно.
Давайте нажмем на спейсбар и переключимся на классический вид.
Это наша точка входа. Давайте посмотрим, что у нас тут есть.
Всего 3 функции, функция для получения дескриптора модуля, создание диалога и выход для процесса. Но если посмотрим внимательно у диалога есть смещение в виде функции. Давайте дважды кликнем правой кнопкой мыши и перейдем в обработчик.
Вот как выглядит вся функции.
Чтобы сделать такой вид, я зажимая [Ctrl] и кручу колесико мыши увеличивая или уменьшая вид. Попробуем найти здесь функцию, по считыванию данных с поля ввода. Она называется
GetDlgItemTextA
Переходим налево на функции и выбираем эту функцию.
Также видно, что у нас есть 5 функций. Одну мы уже рассмотрели. Это функция диалога. Остальные четыре нам не известны.
Попадаем сюда.
На GetDlgItemTextA нажимаем [Х] и появляется окошко с перекрестными ссылками.
Видно, что эта функция вызывается два раза. Давайте перейдем на первую через Л.К.М.
Попадем сюда.
Чуть ниже есть проверка на длину символов. Длина должна быть равна 4 или больше. То есть здесь вводиться логин.
Ещё чуть ниже ещё одна проверка, то есть логин должен быть не больше 10 знаков.
Иначе мы попадем на следующий мессадж бокс.
Также есть ещё один мессадж бокс, если мы забыли ввести серийный номер.
И затем идет следующий вызов.
Я переименую его в CHECK через клавишу [N].
Заходим в функцию и попадаем сюда.
Сразу посмотрим через [F5] насколько сложна функция.
Функция сложноватая, плюс к этому вызывается ещё две функции из неё.
Скорее всего нам потребуется отладка. Сейчас же давайте запустим отладчик через [F9] и попробуем взломать программу, хотя нам это не разрешали. Хе-хе.
Но отладчик не загружается. Виной тому функция IsDebuggerPresent.
Сейчас я запускаю Олли, и патчу этот переход, чтобы нам было легче работать.
Меняем JNZ на JZ.
Нажимаю П.К.М и выбираю пункт All modification.
После этого в новом окне выбираю Save File и сохраняю под новым именем.
Теперь этот новый файл загрузим в нашу Иду и попробуем выполнить через [F9].
Файл загружается. Теперь попробуем найти в этом блоке БэдБой и ГудБой.
Вот они слева направо.
Также есть один оторванный джамп. Я держа клавишу [Ctrl] выбираю первый и второй джамп, нажимая Л.К.М. и группирую блоки через соответствующее меню.
Также чуть выше есть два джампа, я их также группирую, чтобы они не мешались.
Получается так.
Теперь, что нам нужно пропатчить, чтобы крекми запустился с любым серийный номером?
Нам нужно исправить эту инструкцию на противоположную.
Её адрес 401206. Идем в олли и меняем переход.
Теперь пробуем запустить креми и ввести цифры 1234-1234.
Итак. Первую часть мы прошли. Теперь давайте будем разбираться с алгоритмом.
Я буду оставлять комментарии по блокам.
Здесь у нас происходит инициализация. Сохраняется EBP, потом ESP перемещается в EBP, вызывается функция подсчета длины строки для введенного нашего имени. В EDX помещается адрес 40316A. Далее в 40316A помещается длина строки. В EDI хранится адрес нашего имени, в ESI адрес 403119. Далее обнуляются четыре регистра. Снова в EDX помещается 40316A. И в этот адрес кладется длина строки. Сейчас я переименую эту переменную.
Получится вот так.
Далее так
Сразу увеличивается EBX на один. Сранивается с EDX и если не равно идем сюда.
Здесь у нас числа в хексе. Я буду менять их на десятичные.
Считывается очередной символ из EDI и сравнивается с символом Z. Если меньше или равно, то идем ниже.
Здесь сравнивается текущий символ с символом A. Если больше или равно идем ниже
Присваиваем AL значение 44.
Здесь в ECX идет накопление, того что было в EAX, идет увеличение EDI, то есть переход к следующем символу и джамп на начало цикла.
Теперь мы можем объединить все эти блоки в один и написать наш псевдокод. У меня получилось вот так
Заметим, что код цикла выполняется на один раз меньше чем количество символом в имени ввиду того, что сразу в начале цикла идет ADD EBX,1.
Псевдокод такой.
for letter in username[:-1]:
temp = temp + ord(letter)
if 65 <= ord(letter) <= 90:
temp = temp + 44
Далее у нас такой код.
Поменяем хекс на десятичные цифры.
Напоминаю, что в ECX у нас хранится результат от предыдущей операции.
К ECX прибавляется 666, затем умножается на 12345, вычитается 23 и умножается на 9. Затем EBX = 0, EAX присваивается ECX, а ECX присваивается 10.
Псевдокод такой.
temp = temp + 666
temp = temp * 12345
temp = temp - 23
temp = temp * 9
Дальше у нас следующий цикл.
EDX присваивается 0, затем идет деление EAX на 10, так как ECX равен А. В DL у нас находится остаток от деления и к этому значению прибавляется 48. DL сохраняется в адрес памяти на который указывает регистр ESI. Я назвал его ZERO, так как вначале он содержал нули. EBX увеличивается на 1 и идет проверка EAX на ноль. Если равно 0 то идем дальше, иначе повторяем цикл. В ESI теперь находится наш предварительно подговленный серийный номер, пока ещё неверный.
Псведокод для этой функции такой.
while temp:
serial = serial + chr(temp % 10 + 48)
temp = temp // 10
Я объединяю также эти два блока в один.
Получилось вот так.
Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник: https://xss.pro/threads/100501/
В следующем блоке в EDI помещается указатель на серийный номер, пока тоже не правильный, но я назвал его так, потому, что он уже почти похож на правильный.
Следующий блок тоже очень интересный.
Берется самый крайний символ из массива ZERO и помещается в массив SERIAL. Далее EDI увеличивается, а EBX наоборот уменьшается. И идет проверка на ноль. То есть тут у нас идет инверсия строки.
На входе.
На выходе.
Это можно заменить псевдокодом
serial = serial[::-1]
И у нас остался последний блок.
MOV завершает строку нулем. В EDI помещается адрес нашего имени. Потом идет какой-то неизвестный адрес. Если посмотрим перекрёстную ссылку, то увидим следующее.
То есть адрес до этого нигде не использовался. Что же это такое и как мы его назовем? Давайте перейдем на него во время отладки. Видим что он хранит четвертый символ нашего имени.
Сейчас я собрал строку через клавишу [А].
Давайте посмотрим как изменится наш код.
То есть в кол передается адрес на строку 45 и на серийный номер.
Давайте не будем заходить в кол, а остановимся на функции lstrcmpA и посмотрим на уже заполненные переменные.
То есть все это время ответ у нас был под носом и мы даже не подозревали об этом
Последнюю функцию я переименую в СONCAT, так как тут и ежу понятно, что она делает. Берется строка начиная с четвертого символа и присоединяется к нашему серийнику.
Попробуйте сами разобрать её алгоритм. Итого мы имеем следующее.
Мы победили очередной крекми!!! Надеюсь Вам понравился этот урок. Напоминаю, что он рассчитан на новичков. До встрече в следующем уроке.
Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник: https://xss.pro/threads/100501/
База и файлы
Дата релиза: 3 июля 2009 г.
Компилятор: Масм
Язык: чистый win32ASM
Уровень: 1/10
Привет!, это мой первый крекми (кейгенми), он очень простой, для новичков. Я надеюсь, вам он понравится.
Правила:
- Внесение патчей запрещено.
- Разрешен риппинг кода
Просто: найдите схему защиты (алгоритм создания серийного номера), объясните его и сделайте туториал и свой собственный кейген.
Это кейген-ми. Разрешены только кейгены. Он очень простой, никакой защиты/шифрования, только одна маленькая хитрость. Удачи.
Надеюсь, вам он понравится, а если вы не сможете найти правильное решение, надеюсь, вы чему-нибудь да научитесь.
Прикольное описание. Надеюсь мы тоже чему-нибудь да научимся
Для начала запустим его и посмотрим на его внешний вид.
То есть нам нужно ввести имя и серийный нрмеп, нажать кнопочку чек и проверить правильность наших догадок.
Давайте загрузим наш крекми в наш дизассемблер IDA PRO. Я буду использовать версию 6.8. Так как она установлена на ПК.
Нам загружается следующее представление, которое не очень удобно.
Давайте нажмем на спейсбар и переключимся на классический вид.
Это наша точка входа. Давайте посмотрим, что у нас тут есть.
Всего 3 функции, функция для получения дескриптора модуля, создание диалога и выход для процесса. Но если посмотрим внимательно у диалога есть смещение в виде функции. Давайте дважды кликнем правой кнопкой мыши и перейдем в обработчик.
Вот как выглядит вся функции.
Чтобы сделать такой вид, я зажимая [Ctrl] и кручу колесико мыши увеличивая или уменьшая вид. Попробуем найти здесь функцию, по считыванию данных с поля ввода. Она называется
GetDlgItemTextA
Переходим налево на функции и выбираем эту функцию.
Также видно, что у нас есть 5 функций. Одну мы уже рассмотрели. Это функция диалога. Остальные четыре нам не известны.
Попадаем сюда.
На GetDlgItemTextA нажимаем [Х] и появляется окошко с перекрестными ссылками.
Видно, что эта функция вызывается два раза. Давайте перейдем на первую через Л.К.М.
Попадем сюда.
Чуть ниже есть проверка на длину символов. Длина должна быть равна 4 или больше. То есть здесь вводиться логин.
Ещё чуть ниже ещё одна проверка, то есть логин должен быть не больше 10 знаков.
Иначе мы попадем на следующий мессадж бокс.
Также есть ещё один мессадж бокс, если мы забыли ввести серийный номер.
И затем идет следующий вызов.
Я переименую его в CHECK через клавишу [N].
Заходим в функцию и попадаем сюда.
Сразу посмотрим через [F5] насколько сложна функция.
Функция сложноватая, плюс к этому вызывается ещё две функции из неё.
Скорее всего нам потребуется отладка. Сейчас же давайте запустим отладчик через [F9] и попробуем взломать программу, хотя нам это не разрешали. Хе-хе.
Но отладчик не загружается. Виной тому функция IsDebuggerPresent.
Сейчас я запускаю Олли, и патчу этот переход, чтобы нам было легче работать.
Меняем JNZ на JZ.
Нажимаю П.К.М и выбираю пункт All modification.
После этого в новом окне выбираю Save File и сохраняю под новым именем.
Теперь этот новый файл загрузим в нашу Иду и попробуем выполнить через [F9].
Файл загружается. Теперь попробуем найти в этом блоке БэдБой и ГудБой.
Вот они слева направо.
Также есть один оторванный джамп. Я держа клавишу [Ctrl] выбираю первый и второй джамп, нажимая Л.К.М. и группирую блоки через соответствующее меню.
Также чуть выше есть два джампа, я их также группирую, чтобы они не мешались.
Получается так.
Теперь, что нам нужно пропатчить, чтобы крекми запустился с любым серийный номером?
Нам нужно исправить эту инструкцию на противоположную.
Её адрес 401206. Идем в олли и меняем переход.
Теперь пробуем запустить креми и ввести цифры 1234-1234.
Итак. Первую часть мы прошли. Теперь давайте будем разбираться с алгоритмом.
Я буду оставлять комментарии по блокам.
Здесь у нас происходит инициализация. Сохраняется EBP, потом ESP перемещается в EBP, вызывается функция подсчета длины строки для введенного нашего имени. В EDX помещается адрес 40316A. Далее в 40316A помещается длина строки. В EDI хранится адрес нашего имени, в ESI адрес 403119. Далее обнуляются четыре регистра. Снова в EDX помещается 40316A. И в этот адрес кладется длина строки. Сейчас я переименую эту переменную.
Получится вот так.
Далее так
Сразу увеличивается EBX на один. Сранивается с EDX и если не равно идем сюда.
Здесь у нас числа в хексе. Я буду менять их на десятичные.
Считывается очередной символ из EDI и сравнивается с символом Z. Если меньше или равно, то идем ниже.
Здесь сравнивается текущий символ с символом A. Если больше или равно идем ниже
Присваиваем AL значение 44.
Здесь в ECX идет накопление, того что было в EAX, идет увеличение EDI, то есть переход к следующем символу и джамп на начало цикла.
Теперь мы можем объединить все эти блоки в один и написать наш псевдокод. У меня получилось вот так
Заметим, что код цикла выполняется на один раз меньше чем количество символом в имени ввиду того, что сразу в начале цикла идет ADD EBX,1.
Псевдокод такой.
for letter in username[:-1]:
temp = temp + ord(letter)
if 65 <= ord(letter) <= 90:
temp = temp + 44
Далее у нас такой код.
Поменяем хекс на десятичные цифры.
Напоминаю, что в ECX у нас хранится результат от предыдущей операции.
К ECX прибавляется 666, затем умножается на 12345, вычитается 23 и умножается на 9. Затем EBX = 0, EAX присваивается ECX, а ECX присваивается 10.
Псевдокод такой.
temp = temp + 666
temp = temp * 12345
temp = temp - 23
temp = temp * 9
Дальше у нас следующий цикл.
EDX присваивается 0, затем идет деление EAX на 10, так как ECX равен А. В DL у нас находится остаток от деления и к этому значению прибавляется 48. DL сохраняется в адрес памяти на который указывает регистр ESI. Я назвал его ZERO, так как вначале он содержал нули. EBX увеличивается на 1 и идет проверка EAX на ноль. Если равно 0 то идем дальше, иначе повторяем цикл. В ESI теперь находится наш предварительно подговленный серийный номер, пока ещё неверный.
Псведокод для этой функции такой.
while temp:
serial = serial + chr(temp % 10 + 48)
temp = temp // 10
Я объединяю также эти два блока в один.
Получилось вот так.
Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник: https://xss.pro/threads/100501/
В следующем блоке в EDI помещается указатель на серийный номер, пока тоже не правильный, но я назвал его так, потому, что он уже почти похож на правильный.
Следующий блок тоже очень интересный.
Берется самый крайний символ из массива ZERO и помещается в массив SERIAL. Далее EDI увеличивается, а EBX наоборот уменьшается. И идет проверка на ноль. То есть тут у нас идет инверсия строки.
На входе.
На выходе.
Это можно заменить псевдокодом
serial = serial[::-1]
И у нас остался последний блок.
MOV завершает строку нулем. В EDI помещается адрес нашего имени. Потом идет какой-то неизвестный адрес. Если посмотрим перекрёстную ссылку, то увидим следующее.
То есть адрес до этого нигде не использовался. Что же это такое и как мы его назовем? Давайте перейдем на него во время отладки. Видим что он хранит четвертый символ нашего имени.
Сейчас я собрал строку через клавишу [А].
Давайте посмотрим как изменится наш код.
То есть в кол передается адрес на строку 45 и на серийный номер.
Давайте не будем заходить в кол, а остановимся на функции lstrcmpA и посмотрим на уже заполненные переменные.
То есть все это время ответ у нас был под носом и мы даже не подозревали об этом
Последнюю функцию я переименую в СONCAT, так как тут и ежу понятно, что она делает. Берется строка начиная с четвертого символа и присоединяется к нашему серийнику.
Попробуйте сами разобрать её алгоритм. Итого мы имеем следующее.
Мы победили очередной крекми!!! Надеюсь Вам понравился этот урок. Напоминаю, что он рассчитан на новичков. До встрече в следующем уроке.
Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник: https://xss.pro/threads/100501/
База и файлы
Вложения
Последнее редактирование: