Reverse engineering тестового crackme від Лабораторії Касперського

Вітаю спільноту! Давним давно, в 2013 році на Хабре був опублікований пост «Reverse engineering на співбесіді: як ми наймаємо на роботу». У ньому було запропоновано тестовий crackme для претендентів на позицію вірусного аналітика. Переконавшись, що повного розбору тестового файлу в інтернеті немає, я вирішив написати свій розбір. І так, приступимо. Crackme 64-розрядний. Запустимо його в IDA Pro.

image

Бачимо зліва в списку функцій три функції: start — функція, з якої починається виконання програми, DialogFunc — ця функція спілкується з нами і деяка функція sub_140001000. Розглянемо діалогову функцію. Декомпіліруем її Hex Rays-ом.

image
В очі кидається розгалуження умов, згідно з яким, якщо деяка функція sub_140001000 поверне TRUE, то з'явиться повідомлення, що інформує нас про відмінно виконану роботу, інакше невірно. Розберемо нашу заповітну функцію sub_140001000. Якщо ми пропустимо її через декомпілятор, то побачимо, що в якості аргументу передається покажчик всього на одне значення. Ймовірно, це значення береться з діалогового вікна і є вводиться ключем. Тепер розглянемо асемблерний лістинг. Є перша перевірка умови вірності введених даних. Якщо умова виконується, то програма виповнюється далі, якщо не виконується, то йде повернення з підпрограми.

image
Запустимо наш crackme під відладчиком. Скористаємося x64dbg. Поставимо breakpoint на нашій першій перевірці. В якості вводиться ключа використовуємо набір цифр 1234567.

image
Як видно, відбувається перевірка значення регістра edx і числа 13h (в десятковій системі числення це 19). Ймовірно, це перевірка на кількість введених символів ключа (у нас їх 7 і в регістрі edx число 7). Спробуємо ввести інша кількість символів. Запустимо відладчик заново. Введемо 9 цифр 123456789.

image
Схоже, що так воно і є. Значить наш ключ повинен містити 19 символів. Вводимо 19 символів 1234567890123456789 і переходимо до наступного етапу перевірки.

image
На цьому етапі здійснюється перевірка кожного п'ятого символу ключа на рівність значенням 2Dh. Справа в тому, що число 2Dh — це шістнадцятковий код символу "-". тобто наш ключ повинен мати вигляд xxxx-xxxx-xxxx-xxxx. Використовуємо в якості ключа 1234-5678-9012-3456 та переходимо до наступного кроку.

image
А на наступному кроці відбувається перевірка символів на числову приналежність. Порядок перевірки такий: береться символ ключа (в рахунок не йдуть кожен п'ятий символ ключа) і до його шестнадцатиричному кодом додається -30 і отриманий результат порівнюється з числом 9. Якщо менше, то на перевірку береться наступний символ ключа, якщо більше, то виводиться повідомлення, що ключ невірний. Йдемо далі.

image
На цьому етапі здійснюється перевірка того, щоб суми чисел в блоках були рівні. На малюнку вище виділений блок коду, який виробляє підрахунок суми чисел і область стека, куди ці суми заносяться. Паралельно суми блоків сумуються між собою і заносяться в регістр r10. Далі йде поділ результату в регістрі r10 на 4 (shr r10d,2 — зсув на 2 байти рівносильний поділу на 4) і порівняння значення з регістра r10 з раніше занесеними значення в стеку. Відмінно. Робимо так, щоб суми цифр кожного блоку ключа були рівні (наприклад 1122-0123-2112-0006) і рухаємося далі на наступний крок перевірки.

image
Ділянка коду, виділений на малюнку вище, перевіряє, щоб розташування символів у кожному наступному блоці ключа не збігалося з попереднім. У підсумку наш ключ має вигляд 1478-7814-1478-7814. Перевіряємо.

image
image
Відмінна робота!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.