Всем привет. В этот туториале будем рассматривать крекми 3 в одном под названием Splish от +cuPegasus[REN] и Crudd. Первую версию этого крекми уже разбирал Рикардо Нарваха в своем курсе — Введение в крекинг с нуля, почитать про который можно например тут — https://wasm.in/blogs/vvedenie-v-krehking-s-nulja-ispolzuja-ollydbg-glava-15.481/ .
Давайте запустим наш крекми и посмотрим на его внешний вид, чтобы понять почему он называется 3 в одном.
Нам показывается следующее окно.
И ничего дальше не грузится. Не работает ни правая, ни левая кнопка мыши. Но если посмотрим на панель задач, увидим следующую подсказку.
Крекми просит сделать на нем двойной щелчок. Давайте так и сделаем.
Нам загружается диалоговое окно и мы видим, что перед нами два задания. Но где же третье?
Для этого нажмем на кнопку О программе и прочитаем послание от создателя.
1. Удалите НАГ (диалог появившийся в начале)
2. Найдите вшитый серийник
3. Найдите комбинацию имя и серийника для своего имени
4. Напишите кейген на асме или на чистом С++ (не консольное приложение ------ че эт вдруг
)
5. Напишите детальный туториал для задач 1-4
Давайте начнем с первого пункта, что логично. Загрузим наш файл в IDA PRO. Я буду использовать версию 6.8, так как она установлена у меня на ПК. Будем отталкиваться от того что нужно сделать двойной клик на наге.
Нам загружается следующее представление, которое мне не очень удобно.
Давайте переключимся в классический вид нажав спейсбар.
Видим, что у нас очень много Апи функций, а родных всего шесть.
Сейчас нам нужно найти обработчик двойного нажатия мыши. Но какой у него код? Это можно посмотреть в Олли. Я загружаю файл, нажимаю [F9], нажимаю кнопку W
и нам показывается окно, но пустое.
Такое бывает. Чтобы элементы появились в окне нажимаем П.К.М и выбираем Actualize.
Теперь наше окно заполнено.
После этого нажмем на любом элементе П.К.М, появится следующее меню.
Нужный нам пункт называется Message breakpoint on ClassProc. Его и выбираем.
Нам появляется окошко. Видим, что есть пункт Messages с выпадающим списком. Давайте будем искать там наш двойной щелчок.
Ага. То есть его код равен 203 в хексе.
Теперь возвращаемся в нашу Иду, и идем в Search→ Text…
Будем искать строку 203, что логично.
Когда поиск завершен, мы попадаем сюда.
Поднимемся в начало функции.
Выберем текст sub_401263. Сейчас мы будем искать обратный вызов. Для этого нажимаем [X].
Переходим по этому адресу и попадаем сюда.
Переименуем этот вызов в WndProc через клавишу [N]. У меня получилось вот так.
Теперь станем на вызов sub_40117A и как ранее через [Х] найдем обратный вызов.
Мы попадаем на функцию START. Для себе я переименую этот вызов sub_40117А в NAG.
У меня получилось вот так.
Но наше задание — избавиться от нага. Для этого перейдем в олли.
Давайте просто занопаем помеченные строки. На первом PUSH 0A я нажимаю пробел.
Ввожу NOP, а потом Assemble, пока не затрутся 4 пуша и 1 кол.
У меня получается вот так.
Теперь пробуем запустить нашу программу через [F9].
Сразу загружается главное окно без нага, то есть первую часть мы победили. Переходим ко второй, поиску защитого номера. Для этого нажимаем кнопку Check the hardcoded serial, но ничего не происходит. Странно. Давайте попробуем что-нибудь ввести, например единицу. У нас появляется следующее окно
Будем также отталкиваться от этой строки. Если она не зашифрована мы её найдем.
В Иде переходим в View→ Open subviewes → Strings и поищем нужные строку.
Да, она здесь есть. Делаем Л.К.М. на ней и попадаем сюда.
Здесь нажимаем [Х] и по перекрестной строке попадаем в следующую функцию
Сразу видно, что это BadBoy, а рядом правее находится GoodBoy. Я их перекрашу в соответствующие цвета светофора.
У меня получилось вот так.
Чтобы узнать как мы пришли к этому вызову нажимаем на соответствующую стрелочку.
Попадаем сюда. Здесь видно, что сравниваются символы друг с другом.
Чуть выше и правее у нас такой код.
Проверка текущего символа на ноль.
Перейдем ещё правее и увидим следующий код.
Неужели, это и есть захардкоженная строка? Сейчас проверим. Вставляем её в наш крекми и нажимаем кнопку проверки.
Нас поздравляют с успехом. Мы прошли вторую часть крекми.
Переходим к третьей части, которая здесь самая сложная. Также как и во втором случае с захардкоженным номером вводим Name, Serial и нажимаем Check. Нам появляется следующее окно.
Нам говорят, что введенная комбинация полный гуан. Будем также отталкиваться от этой строки. Снова идем в наши строки. Переходим в View→ Open subviewes → Strings и поищем нужную строку.
Делаем левый щелчок мышью и попадаем сюда.
А затем смотрим, где эта строка используется через [Х].
Попадаем сюда.
Видно, что это BadBoy, а рядом находится GoodBoy. Я их раскрашу в соответствующие цвета.
Весь алгоритм теперь выглядит так.
Давайте теперь пойдем от плохого блока вверх. Если последовательно будем поднимать по блокам выше придем в следующий блок.
В двордах сохраняется длина символов имени и серийника. Также нам нужно знать где здесь имя, а где пароль. Я запускаю крекми, заполняю соответствующие поля и смотрю на подсказку, после чего переименовываю переменные. Наведя на байт мне показывается следующая подсказка.
Но так не понятно имя это или сериал, поэтому перейдем в этот байт.
И соберем его через клавишу [А].
То есть первый вызов это имя. Теперь переименуем соответствующие переменные. У меня получилось вот так.
Теперь будем идти вниз по алгоритму делая соответствующие комментарии.
Размер строки сравнивается с нулем, и если размер строки равен нулю, то идем на выход.
Сохраняются все регистры в стек, ЕАХ и EBX присваивается ноль. В ESI кладется адрес имени. В ECX помещается длина имени. То есть тут у нас идет инициализация.
Далее в AL помещается рассчитанное выражение — количество символов в имени - 1 + текущий символ.
Следующий код такой.
Увеличивается на 1 EBX, он у нас в начале равен нулю. Происходит операция XOR между EAX и EBX и идет сравнение с символом D. Если меньше то повторяем цикл.
Далее код такой.
Символ сравнивается с M и если он больше то идем на начало цикла. Иначе выходим.
Далее следующий блок.
Я покрасил весь алгоритм в розовый, поэтому весь алгоритм получился вот таким.
Желтым выделен алгоритм проверки захардкоженного номера. Но вернемся к нашему боку
Текущий символ помещается в количество символов в имени - 1 + текущий символ.
Из него вычитается значение 20. Уменьшается на 1 значение ECX и сравнивается с нулем. Если ECX выше то цикл повторяется, то есть Наше имя перебирается от большего к меньшему.
То есть весь наш код можно заменить на следующий на си.
Далее попадаем сюда.
Здесь у нас очередной цикл, в нем идет сравнивание значения из поля Name с полем Serial. То есть правильный сериал все это время хранился в поле Name. Чтобы его увидеть, давайте поставим бряк на бэдбой.
Запускам программу и водим следующие данные.
Теперь смотрим что у нас в поле Name.
Соберем это значение через [A] .
То есть для имени 1234567890 серийник равен 1230646180. Давайте проверим нашу догадку.
Мы победили третий этап и очередной крекми.
Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник:
СплишСплэш
Давайте запустим наш крекми и посмотрим на его внешний вид, чтобы понять почему он называется 3 в одном.
Нам показывается следующее окно.
И ничего дальше не грузится. Не работает ни правая, ни левая кнопка мыши. Но если посмотрим на панель задач, увидим следующую подсказку.
Крекми просит сделать на нем двойной щелчок. Давайте так и сделаем.
Нам загружается диалоговое окно и мы видим, что перед нами два задания. Но где же третье?
Для этого нажмем на кнопку О программе и прочитаем послание от создателя.
1. Удалите НАГ (диалог появившийся в начале)
2. Найдите вшитый серийник
3. Найдите комбинацию имя и серийника для своего имени
4. Напишите кейген на асме или на чистом С++ (не консольное приложение ------ че эт вдруг
5. Напишите детальный туториал для задач 1-4
Давайте начнем с первого пункта, что логично. Загрузим наш файл в IDA PRO. Я буду использовать версию 6.8, так как она установлена у меня на ПК. Будем отталкиваться от того что нужно сделать двойной клик на наге.
Нам загружается следующее представление, которое мне не очень удобно.
Давайте переключимся в классический вид нажав спейсбар.
Видим, что у нас очень много Апи функций, а родных всего шесть.
Сейчас нам нужно найти обработчик двойного нажатия мыши. Но какой у него код? Это можно посмотреть в Олли. Я загружаю файл, нажимаю [F9], нажимаю кнопку W
и нам показывается окно, но пустое.
Такое бывает. Чтобы элементы появились в окне нажимаем П.К.М и выбираем Actualize.
Теперь наше окно заполнено.
После этого нажмем на любом элементе П.К.М, появится следующее меню.
Нужный нам пункт называется Message breakpoint on ClassProc. Его и выбираем.
Нам появляется окошко. Видим, что есть пункт Messages с выпадающим списком. Давайте будем искать там наш двойной щелчок.
Ага. То есть его код равен 203 в хексе.
Теперь возвращаемся в нашу Иду, и идем в Search→ Text…
Будем искать строку 203, что логично.
Когда поиск завершен, мы попадаем сюда.
Поднимемся в начало функции.
Выберем текст sub_401263. Сейчас мы будем искать обратный вызов. Для этого нажимаем [X].
Переходим по этому адресу и попадаем сюда.
Переименуем этот вызов в WndProc через клавишу [N]. У меня получилось вот так.
Теперь станем на вызов sub_40117A и как ранее через [Х] найдем обратный вызов.
Мы попадаем на функцию START. Для себе я переименую этот вызов sub_40117А в NAG.
У меня получилось вот так.
Но наше задание — избавиться от нага. Для этого перейдем в олли.
Давайте просто занопаем помеченные строки. На первом PUSH 0A я нажимаю пробел.
Ввожу NOP, а потом Assemble, пока не затрутся 4 пуша и 1 кол.
У меня получается вот так.
Теперь пробуем запустить нашу программу через [F9].
Сразу загружается главное окно без нага, то есть первую часть мы победили. Переходим ко второй, поиску защитого номера. Для этого нажимаем кнопку Check the hardcoded serial, но ничего не происходит. Странно. Давайте попробуем что-нибудь ввести, например единицу. У нас появляется следующее окно
Будем также отталкиваться от этой строки. Если она не зашифрована мы её найдем.
В Иде переходим в View→ Open subviewes → Strings и поищем нужные строку.
Да, она здесь есть. Делаем Л.К.М. на ней и попадаем сюда.
Здесь нажимаем [Х] и по перекрестной строке попадаем в следующую функцию
Сразу видно, что это BadBoy, а рядом правее находится GoodBoy. Я их перекрашу в соответствующие цвета светофора.
У меня получилось вот так.
Чтобы узнать как мы пришли к этому вызову нажимаем на соответствующую стрелочку.
Попадаем сюда. Здесь видно, что сравниваются символы друг с другом.
Чуть выше и правее у нас такой код.
Проверка текущего символа на ноль.
Перейдем ещё правее и увидим следующий код.
Неужели, это и есть захардкоженная строка? Сейчас проверим. Вставляем её в наш крекми и нажимаем кнопку проверки.
Нас поздравляют с успехом. Мы прошли вторую часть крекми.
Переходим к третьей части, которая здесь самая сложная. Также как и во втором случае с захардкоженным номером вводим Name, Serial и нажимаем Check. Нам появляется следующее окно.
Нам говорят, что введенная комбинация полный гуан. Будем также отталкиваться от этой строки. Снова идем в наши строки. Переходим в View→ Open subviewes → Strings и поищем нужную строку.
Делаем левый щелчок мышью и попадаем сюда.
А затем смотрим, где эта строка используется через [Х].
Попадаем сюда.
Видно, что это BadBoy, а рядом находится GoodBoy. Я их раскрашу в соответствующие цвета.
Весь алгоритм теперь выглядит так.
Давайте теперь пойдем от плохого блока вверх. Если последовательно будем поднимать по блокам выше придем в следующий блок.
В двордах сохраняется длина символов имени и серийника. Также нам нужно знать где здесь имя, а где пароль. Я запускаю крекми, заполняю соответствующие поля и смотрю на подсказку, после чего переименовываю переменные. Наведя на байт мне показывается следующая подсказка.
Но так не понятно имя это или сериал, поэтому перейдем в этот байт.
И соберем его через клавишу [А].
То есть первый вызов это имя. Теперь переименуем соответствующие переменные. У меня получилось вот так.
Теперь будем идти вниз по алгоритму делая соответствующие комментарии.
Размер строки сравнивается с нулем, и если размер строки равен нулю, то идем на выход.
Сохраняются все регистры в стек, ЕАХ и EBX присваивается ноль. В ESI кладется адрес имени. В ECX помещается длина имени. То есть тут у нас идет инициализация.
Далее в AL помещается рассчитанное выражение — количество символов в имени - 1 + текущий символ.
Следующий код такой.
Увеличивается на 1 EBX, он у нас в начале равен нулю. Происходит операция XOR между EAX и EBX и идет сравнение с символом D. Если меньше то повторяем цикл.
Далее код такой.
Символ сравнивается с M и если он больше то идем на начало цикла. Иначе выходим.
Далее следующий блок.
Я покрасил весь алгоритм в розовый, поэтому весь алгоритм получился вот таким.
Желтым выделен алгоритм проверки захардкоженного номера. Но вернемся к нашему боку
Текущий символ помещается в количество символов в имени - 1 + текущий символ.
Из него вычитается значение 20. Уменьшается на 1 значение ECX и сравнивается с нулем. Если ECX выше то цикл повторяется, то есть Наше имя перебирается от большего к меньшему.
То есть весь наш код можно заменить на следующий на си.
C:
for(int i = len; i > 0; i--)
{
code = username[i-1];
do
{
b++;
code = code ^ b;
} while(code < 'D' || code > 'M');
code = code - 20;
key[i-1] = code;
}
cout << key;
}
Далее попадаем сюда.
Здесь у нас очередной цикл, в нем идет сравнивание значения из поля Name с полем Serial. То есть правильный сериал все это время хранился в поле Name. Чтобы его увидеть, давайте поставим бряк на бэдбой.
Запускам программу и водим следующие данные.
Теперь смотрим что у нас в поле Name.
Соберем это значение через [A] .
То есть для имени 1234567890 серийник равен 1230646180. Давайте проверим нашу догадку.
Мы победили третий этап и очередной крекми.
Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник:
https://xss.pro/threads/100697/
СплишСплэш