Решаем crackme часть 1
Я начал свое исследование с простого crackme написанного [Cruehead / MiB] скачать его можно по ссылке: https://github.com/sebastiendamaye/public/tree/master/crackme
md5: 66f573036f8b99863d75743eff84f15d
sha1: 5470e76fffe91a100bf83f6a6bca0737918400cf
sha256: 0c7cdfdb6d4c8876e9c5bae906fcf1cbf174f019ef45d518954885856501a0be
Запускаем:
Вводим произвольные данные:

Ошибка, как мы и ожидали


Сразу перейдем к строковым значениям, тут уже интересно, переходим в функцию где использоваться Good work:

Весь основной функционал происходит тут:

Вызываются две функции, и затем сравнение двух регистров:
0040122D call sub_40137E <- Проверка Name
00401238 call sub_4013D8 <- Проверка Serial
cmp eax, ebx <- вероятнее всего тут происходит сравнение данных, данные должны быть одинаковые, чтобы вызвать call ShowGood *
Посмотрим, что происходит с Name:
Здесь проверяется входит ли символ в диапазон A..Z

и в случае если символ меньше числа символа "Z" переводит его в UpperCase:
004013D2 sub al, 20h <- Отнимая от числа 32(DEC) ---Вот таким образом
Почему это делается, для того чтобы легче это понять нужно посмотреть на таблицу ASCII символов, и сразу станет понятно, что символы Uppercase номером меньше чем lowercase, поэтому и отнимается значение:

Затем все значения суммируются и ксорятся (XOR) с значением: 22136(DEC)
004013A2 xor edi, 5678h <- Вот таким образом
Далее смотрим код проверки Serial:

Значения переводятся в числа:
CODE:004013EA sub, bl, 30h <- char to byte
Затем ксорятся(XOR) c значением 1234h
На Python примерный код такой:
sum = 0
for x in _name:
sum = sum + int(ord(x))
sum = sum ^ 22136 #5678h
t = 0
for x in _serial:
t = t * 10
t = t + (ord(x) - 48)
t = t ^ 4660 #1234h
Затем данные сравниваются из двух регистров:
CODE:00401241 cmp eax, ebx <---в eax значения name в ebx serial
Если данные совпадают, то отображается окно с текстом о правильном Serial
Решение:
Для этого creackme подойдет операция ксорирование (XOR) значения name c значением из serial так как два XOR одного и тоже значения возвратят его исходное значения в алгоритме, пример на python:
def keygen(name):
s = 0
for x in name:
s = s + ord(x)
return s ^ 22136 ^ 4660 #5678h Name && 1234h Serial

Вот такое окно:

md5: 66f573036f8b99863d75743eff84f15d
sha1: 5470e76fffe91a100bf83f6a6bca0737918400cf
sha256: 0c7cdfdb6d4c8876e9c5bae906fcf1cbf174f019ef45d518954885856501a0be
Запускаем:
Вводим произвольные данные:
Ошибка, как мы и ожидали
Посмотрим, не упаковал ли файл, ничем не упакован, написан на ASM:
Сразу перейдем к строковым значениям, тут уже интересно, переходим в функцию где использоваться Good work:
Весь основной функционал происходит тут:
Вызываются две функции, и затем сравнение двух регистров:
0040122D call sub_40137E <- Проверка Name
00401238 call sub_4013D8 <- Проверка Serial
cmp eax, ebx <- вероятнее всего тут происходит сравнение данных, данные должны быть одинаковые, чтобы вызвать call ShowGood *
Посмотрим, что происходит с Name:
Здесь проверяется входит ли символ в диапазон A..Z
и в случае если символ меньше числа символа "Z" переводит его в UpperCase:
004013D2 sub al, 20h <- Отнимая от числа 32(DEC) ---Вот таким образом
Почему это делается, для того чтобы легче это понять нужно посмотреть на таблицу ASCII символов, и сразу станет понятно, что символы Uppercase номером меньше чем lowercase, поэтому и отнимается значение:

Затем все значения суммируются и ксорятся (XOR) с значением: 22136(DEC)
004013A2 xor edi, 5678h <- Вот таким образом
Далее смотрим код проверки Serial:
Значения переводятся в числа:
CODE:004013EA sub, bl, 30h <- char to byte
Затем ксорятся(XOR) c значением 1234h
На Python примерный код такой:
sum = 0
for x in _name:
sum = sum + int(ord(x))
sum = sum ^ 22136 #5678h
t = 0
for x in _serial:
t = t * 10
t = t + (ord(x) - 48)
t = t ^ 4660 #1234h
Затем данные сравниваются из двух регистров:
CODE:00401241 cmp eax, ebx <---в eax значения name в ebx serial
Если данные совпадают, то отображается окно с текстом о правильном Serial
Решение:
Для этого creackme подойдет операция ксорирование (XOR) значения name c значением из serial так как два XOR одного и тоже значения возвратят его исходное значения в алгоритме, пример на python:
def keygen(name):
s = 0
for x in name:
s = s + ord(x)
return s ^ 22136 ^ 4660 #5678h Name && 1234h Serial
Вот такое окно:
Красава! Всё доступно и понятно! Python - ruleZ!!!
ОтветитьУдалить