Статья Reverse crackme для начинающих [0x03]

🖐 Приветствую всех читателей Codeby.net 🖐

Это продолжение статьи " ". В этой статье мы разберёмся, как работает метод активации , а ещё, как нам активировать его. Это последняя версия из этой серии программ.
Рекомендую , а затем читать статьи про реверс-инжиниринг. Вам будет понятнее.

1621515315860.png


Нам понадобятся:

  • Интерактивный дизассемблер IDA
  • или ( инструменты для статического исследования файлов )
  • (Или любой другой hex-редактор)

Осмотр crackme


Открываем crackme в любой удобной программе для получения информации о файле. Используем PPEE или PEstudio.

PEstudio.png


PPEE.png


Разрядность этого crackme - x86.

Нажимая на кнопку File, появляется Exit, а нажимая на кнопку Help, мы видим About.

Crackme_help.png


Crackme_about.png


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




Изучаем crackme в IDA

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


Откроем crackme в IDA. Поставим точку останова в начало функции srart и запустим отладчик. Выполним функцию CreateFile. Если файл CRACKME3.KEY существует в одной директории с crackme, то в eax будет 0x200. Если файла не существует, то в eax будет 0xFFFFFFFF, и программа считается без активации.

IDA_CHECK_FILE.png




Создадим файл CRACKME3.KEY и запустим программу под отладчиком. Проверка файла прошла успешно. Далее программа проверяет количество символов. Если их количество не равно 18, то crackme в любом случае считается без активации.

IDA_CHECK_LEN_KEY.png


Чтобы не создавать одеяло из статьи, мы используем корректный файл и изучим алгоритм работы 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. Зайдём в неё и изучим содержимое.

IDA_DIS_XOR_SUM.png


IDA_DIS_sub_401311.png


Эта функция выполняет операцию 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.

IDA_DIS_XOR_SUM.png

Доходим до функции sub_40133C. Зайдём в неё.

IDA_DIS_sub_40133C.png


Эта функция берёт коды последних четырёх символов ключа и перемещает в eax. Выходим из этой функции.
Далее crackme сравнивает последние байты ключа из eax и значение SUM. Если они равны, то программа продолжает работу.


Переходим в функции sub_401346. Эта функция изменяет строку "CrackMe v3.0" на "CrackMe v3.0 - Cracked!!".

IDA_DIS_Good_or_Bad.png


IDA_DIS_sub_401346.png



Переходим к функции следующему блоку кода. В нём находятся функции LoadIconA, LoadCursorA , RegistrClassA, CreateWindowsExA, ShowWindows и UpdateWindows. Эти функции работают с графикой. Они не сильно нам интересны.

IDA_DIS_Menu_Work.png


После всех этих функций идёт следующий блок с кодом. В нём находится sub_401362.


IDA_DIS_To_sub_401362.png


IDA_DIS_sub_401362.png


Она добавляет имя, взятое из начала ключа, к строке "Cracked by: ". К новой строке также добавляется предложение "Now try the next crackme!". В итоге получилось сообщение:

Код:
Cracked by: KEKC!
Now try the next crackme!

В конце start находится функции для работы с сообщениями и для выхода из программы. Последняя работает, если нажать Exit в Crackme.

IDA_DIS_Message_work_or_exit.png



А как получить корректный ключ?


Первый метод. Изменение файла ручками.



Чтобы получить корректный ключ, мы обозначим главные моменты:

1 - Проверка между последними четырьмя байтами и числом после операции xor ( SUM и 0x12345678 ).

IDA_DIS_XOR_SUM.png


2 - Получение из начала ключа имени пользователя, решившего crackme.


IDA_DIS_To_sub_401362.png


IDA_DIS_sub_401362.png


Разберёмся с именем пользователя. Оно получается в цикле, при котором происходит операция 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.


IDA_DIS_XOR_SUM.png


В этот момент времени в 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.

IDA_Decomp.png
 
Последнее редактирование:
Отличная статья. Буду ждать пополнений!
 
  • Нравится
Реакции: ROP
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!