🖐 Приветствую всех читателей Codeby.net 🖐
Это продолжение статьи "
Рекомендую
Нам понадобятся:
Открываем crackme в любой удобной программе для получения информации о файле. Используем PPEE или PEstudio.
Разрядность этого crackme - x86.
Нажимая на кнопку File, появляется Exit, а нажимая на кнопку Help, мы видим About.
Поля для ввода ключа отсутствуют. Нужно узнать, что находится внутри программы.
Откроем crackme в IDA. Поставим точку останова в начало функции
Создадим файл CRACKME3.KEY и запустим программу под отладчиком. Проверка файла прошла успешно. Далее программа проверяет количество символов. Если их количество не равно 18, то crackme в любом случае считается без активации.
Чтобы не создавать одеяло из статьи, мы используем корректный файл и изучим алгоритм работы crackme.
Поставим точку останова на вызов функции
Эта функция выполняет операцию xor для байтов ключа и кодами символов букв.
Программа берёт байт ключа и байт "R" (Начальное значение: 0x41).
Применяет операцию xor и перезаписывает байт ключа на новый.
Код нового символа, полученного в результате операции xor, добавляется в "SUM".
Значение байта "R" увеличивается на 1.
Так происходит до тех пор, пока значение байта после операции xor не будет равен 0 или байт "R" не будет равен 0x4F.
В процессе действий, описанных выше, программа узнаёт длину ключа до символа 0. Это длина имени. Выходим из функции
Программа узнала сумму новых символов после операции xor. Затем, происходит xor для суммы новых символов (SUM) и числа 0x12345678. Полученный результат перезаписывает значение в SUM.
Доходим до функции
Эта функция берёт коды последних четырёх символов ключа и перемещает в eax. Выходим из этой функции.
Далее crackme сравнивает последние байты ключа из eax и значение SUM. Если они равны, то программа продолжает работу.
Переходим в функции
Переходим к функции следующему блоку кода. В нём находятся функции
После всех этих функций идёт следующий блок с кодом. В нём находится
Она добавляет имя, взятое из начала ключа, к строке "Cracked by: ". К новой строке также добавляется предложение "Now try the next crackme!". В итоге получилось сообщение:
В конце
Чтобы получить корректный ключ, мы обозначим главные моменты:
1 - Проверка между последними четырьмя байтами и числом после операции xor ( SUM и 0x12345678 ).
2 - Получение из начала ключа имени пользователя, решившего crackme.
Разберёмся с именем пользователя. Оно получается в цикле, при котором происходит операция xor между байтами ключа и кодами символов.
Результат операции xor можно вернуть в изначальное значение, если известен ключ.
Для ключа используем имя "BEAR".
Это будут первые 5 байт. Следующие 9 байт любые. Напишем нули.
Теперь, мы поставим точку останова на инструкции
В этот момент времени в SUM будут лежать правильные байты: 0x62573412 (
У нас получился файл с таким содержимым.
Решая этот crackme, я не писал keygen. Но он был найден на сайте
Keygen для python2. Он создаёт корректный файл лицензии для этого Crackme. Я добавил комментарии в код от себя код.
Запустим этот Crackme:
Корректный файл будет создан, и напечатается строка "
Эти три Crackme очень простые. Они написаны для архитектуры x86. А ведь существуют программы для архитектуры x64. Не стоит забывать о приложениях написанных на C#, JAVA, где используется
При изучении программ мы не использовали декомпилятор для IDA. Но нужно знать о его существовании. Он сильно помогает вам в понимании программы. Особенно, если в программе огромное количество кода. Декомпилятор активируется нажатием клавиши F5.
Это продолжение статьи "
Ссылка скрыта от гостей
". В этой статье мы разберёмся, как работает метод активации
Ссылка скрыта от гостей
, а ещё, как нам активировать его. Это последняя версия из этой серии программ.Рекомендую
Ссылка скрыта от гостей
, а затем читать статьи про реверс-инжиниринг. Вам будет понятнее.Нам понадобятся:
- Интерактивный дизассемблер IDA
-
Ссылка скрыта от гостей
-
Ссылка скрыта от гостейилиСсылка скрыта от гостей( инструменты для статического исследования файлов )
-
Ссылка скрыта от гостей(Или любой другой hex-редактор)
Осмотр crackme
Открываем crackme в любой удобной программе для получения информации о файле. Используем PPEE или PEstudio.
Разрядность этого crackme - x86.
Нажимая на кнопку File, появляется Exit, а нажимая на кнопку Help, мы видим About.
Поля для ввода ключа отсутствуют. Нужно узнать, что находится внутри программы.
Изучаем crackme в IDA
В видео будут отображаться нажатые клавиши. В IDA для переключения в режим графом, нажмите "пробел".Откроем crackme в IDA. Поставим точку останова в начало функции
srart
и запустим отладчик. Выполним функцию CreateFile
. Если файл CRACKME3.KEY
существует в одной директории с crackme, то в eax будет 0x200. Если файла не существует, то в eax будет 0xFFFFFFFF, и программа считается без активации.Создадим файл CRACKME3.KEY и запустим программу под отладчиком. Проверка файла прошла успешно. Далее программа проверяет количество символов. Если их количество не равно 18, то crackme в любом случае считается без активации.
Чтобы не создавать одеяло из статьи, мы используем корректный файл и изучим алгоритм работы crackme.
Ссылка скрыта от гостей
Код:
00000000 0a 07 08 07 45 46 47 48 49 4a 4b 4c 4d 4e 66 57 |....EFGHIJKLMNfW|
00000010 34 12 |4.|
00000012
Поставим точку останова на вызов функции
sub_401311
. Зайдём в неё и изучим содержимое.Эта функция выполняет операцию xor для байтов ключа и кодами символов букв.
Программа берёт байт ключа и байт "R" (Начальное значение: 0x41).
Применяет операцию xor и перезаписывает байт ключа на новый.
Код нового символа, полученного в результате операции xor, добавляется в "SUM".
Значение байта "R" увеличивается на 1.
Так происходит до тех пор, пока значение байта после операции xor не будет равен 0 или байт "R" не будет равен 0x4F.
Код:
Первый символ:
0xA xor 0x41 = 0x4B
Второй символ:
0x7 xor 0x42 = 0x45
Третий символ:
0x8 xor 0x43 = 0x4B
И так далее...
В процессе действий, описанных выше, программа узнаёт длину ключа до символа 0. Это длина имени. Выходим из функции
sub_401311
.Программа узнала сумму новых символов после операции xor. Затем, происходит xor для суммы новых символов (SUM) и числа 0x12345678. Полученный результат перезаписывает значение в SUM.
Доходим до функции
sub_40133C
. Зайдём в неё.Эта функция берёт коды последних четырёх символов ключа и перемещает в eax. Выходим из этой функции.
Далее crackme сравнивает последние байты ключа из eax и значение SUM. Если они равны, то программа продолжает работу.
Переходим в функции
sub_401346
. Эта функция изменяет строку "CrackMe v3.0" на "CrackMe v3.0 - Cracked!!".Переходим к функции следующему блоку кода. В нём находятся функции
LoadIconA
, LoadCursorA
, RegistrClassA
, CreateWindowsExA
, ShowWindows
и UpdateWindows
. Эти функции работают с графикой. Они не сильно нам интересны.После всех этих функций идёт следующий блок с кодом. В нём находится
sub_401362
. Она добавляет имя, взятое из начала ключа, к строке "Cracked by: ". К новой строке также добавляется предложение "Now try the next crackme!". В итоге получилось сообщение:
Код:
Cracked by: KEKC!
Now try the next crackme!
В конце
start
находится функции для работы с сообщениями и для выхода из программы. Последняя работает, если нажать Exit
в Crackme.А как получить корректный ключ?
Первый метод. Изменение файла ручками.
Чтобы получить корректный ключ, мы обозначим главные моменты:
1 - Проверка между последними четырьмя байтами и числом после операции xor ( SUM и 0x12345678 ).
2 - Получение из начала ключа имени пользователя, решившего crackme.
Разберёмся с именем пользователя. Оно получается в цикле, при котором происходит операция xor между байтами ключа и кодами символов.
Результат операции xor можно вернуть в изначальное значение, если известен ключ.
Для ключа используем имя "BEAR".
Код:
0x42 (B) xor 0x41 (A) = 0x3
0x45 (E) xor 0x42 (B) = 0x7
0x41 (A) xor 0x43 (C) = 0x2
0x52 (R) xor 0x44 (D) = 0x16
0x0 xor 0x45 (E) = 0x45 (E) (Программа считывает имя пользователя до байта 0x0)
Это будут первые 5 байт. Следующие 9 байт любые. Напишем нули.
Теперь, мы поставим точку останова на инструкции
cmp eax, ds:SUM
.В этот момент времени в SUM будут лежать правильные байты: 0x62573412 (
Ссылка скрыта от гостей
). В
Ссылка скрыта от гостей
это будет 0x12345763. Запишем их в порядке Little-Endian, так как это наиболее распространённый порядок байт в программах, а также crackme написан для архитектуры x86.Little-Endian принят в памяти персональных компьютеров с процессорами архитектуры x86, в связи с чем иногда его называют интеловским порядком байтов (по названию компании-создателя архитектуры x86).
У нас получился файл с таким содержимым.
Код:
00000000 03 07 02 16 45 00 00 00 00 00 00 00 00 00 62 57 |....E.........bW|
00000010 34 12 |4.|
00000012
Второй метод. Keygen.
Решая этот crackme, я не писал keygen. Но он был найден на сайте
Ссылка скрыта от гостей
. Спасибо автору Keygen для python2. Он создаёт корректный файл лицензии для этого Crackme. Я добавил комментарии в код от себя код.
Python:
#!/usr/bin/env python
#coding=utf-8
import sys
'''Возьмём готовый файл CRACKME3.KEY. Имя: BEAR
HexDump для этого файла:
00000000 03 07 02 16 45 46 47 48 49 4a 4b 4c 4d 4e 62 57 |....EFGHIJKLMNbW|
00000010 34 12 |4.|
00000012
После функций будет показано состояние массива, где находятся байты ключа. (Имя: BEAR)[/FONT][/FONT][/FONT][/FONT]
[FONT=verdana][FONT=verdana][FONT=verdana][FONT=verdana]'''
def splitNumber (num):
"""
Code taken from following source
http://stackoverflow.com/questions/20955543/python-writing-binary
"""
lst = []
while num > 0:
lst.append(num & 0xFF)
num >>= 8
#return lst[::-1]
# Если имя - BEAR, то массив:
# [3, 7, 2, 22, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 98, 87, 52, 18] (Десятичная система)
# [03, 07, 02, 16, 45, 46, 47, 48, 49, 4a, 4b, 4c, 4d, 4e, 62, 57, 34, 12] (Шестнадцатеричная система)
return lst
def make_serial(username):
b = [] # ключ для файла = []
# XOR serial
checksum = 0
key = 0x41
for i in username:
b.append(ord(i) ^ key)
checksum += ord(i)
key += 1
# Если имя - BEAR, то массив:
# [3, 7, 2, 22] (Десятичная система)
# [03, 07, 02, 16] (Шестнадцатеричная система)
# padding (will only apply if len(username) < 14)
for i in range(14 - len(username)):
b.append(0x41 + len(username) + i)
# Если имя - BEAR, то массив:
# [3, 7, 2, 22, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78] (Десятичная система)
# [03, 07, 02, 16, 45, 46, 47, 48, 49, 4a, 4b, 4c, 4d, 4e] (Шестнадцатеричная система)
# Generate file
with open('CRACKME3.KEY', 'wb') as f:
f.write(bytearray(i for i in b))
# checksum
f.write(bytearray(i for i in splitNumber(checksum ^ 0x12345678)))
# Запись имени в файл.
if __name__ == '__main__':
if len(sys.argv) < 2:
print "Usage: %s <username>" % sys.argv[0]
sys.exit(1)
if len(sys.argv[1]) > 14:
print "Max length: 14"
sys.exit(2)
make_serial(sys.argv[1])
print "CRACKME3.KEY generated"
Запустим этот Crackme:
python2 keygen_3_python2.py KEKC
Корректный файл будет создан, и напечатается строка "
CRACKME3.KEY generated
".
Про декомпилятор и другие crackme
Эти три Crackme очень простые. Они написаны для архитектуры x86. А ведь существуют программы для архитектуры x64. Не стоит забывать о приложениях написанных на C#, JAVA, где используется
Ссылка скрыта от гостей
. Не забудем некоторые популярные методы защиты: обфускация кода, упаковщики, протекторы. Всё описанное может сделать программу очень сложной для понимания и реверс-инжиниринга. Скачать разные crackme можно на
Ссылка скрыта от гостей
или других похожих сайтов.При изучении программ мы не использовали декомпилятор для IDA. Но нужно знать о его существовании. Он сильно помогает вам в понимании программы. Особенно, если в программе огромное количество кода. Декомпилятор активируется нажатием клавиши F5.
Последнее редактирование: