Разбор простого crackme: логика проверки
Применяем всё вместе на учебной задаче, созданной для тренировки.
Crackme — программа, специально написанная как головоломка для практики реверса; разбирать её абсолютно легально.
Этический контекст
Мы разбираем учебный crackme — он создан автором именно для того, чтобы его анализировали. Это не чужое защищённое ПО. Те же приёмы НЕЛЬЗЯ применять к реальным программам с целью обхода их лицензий.
Как обычно устроена проверка
Простейший crackme спрашивает пароль и сравнивает его с эталоном. На C логика выглядела бы так:
char *input = read_line();
if (strcmp(input, "S3cr3t!") == 0)
puts("Access granted");
else
puts("Wrong password");
В таком случае эталон S3cr3t! часто прямо виден в строках бинаря — задача решается одной командой strings.
Чуть сложнее: проверка по частям
Более интересный crackme не хранит пароль целиком, а проверяет свойства ввода. Логику можно смоделировать на Python и реально запустить:
def check(s):
if len(s) != 6:
return False
if s[0] != 'K':
return False
total = 0
for ch in s:
total += ord(ch)
return total == 500
# Реверсер читает ассемблер и восстанавливает ИМЕННО такие условия,
# а затем подбирает ввод, который их удовлетворяет.
print(check("Wrong"))
print(check("Kpqrst"))
Вывод:
False False
Здесь нет готового пароля в строках: проверяются длина, первый символ и сумма кодов. Реверсер по ассемблеру восстанавливает эти условия (как мы это делали в разделе про чтение ассемблера), а затем рассуждает, какой ввод их удовлетворит.
Как работает под капотом
В дизассемблере такая проверка выглядит как: вызов функции ввода → cmp длины → серия сравнений символов или цикл с накоплением суммы → финальный cmp с константой и переход на «granted»/«wrong». Узнав конструкции из прошлого раздела (циклы, условия, строки), вы соберёте картину.
Частые ошибки
- Искать «один пароль», когда проверка идёт по свойствам ввода.
- Не замечать преобразования (XOR, сложение) перед сравнением.
- Забывать про этику: crackme — да, чужие лицензии — нет.
Итог
- Crackme — легальная учебная головоломка для практики реверса.
- Простая проверка хранит эталон (видно в strings), сложная проверяет свойства ввода.
- Задача реверсера — восстановить условия по ассемблеру.