реєстраційний ключ
погляд крекерів
Завдання крекеру майже завжди зводиться до того, щоб змусити програму працювати без необхідності турбувати розробника на рахунок приобритения ліцензії (і відповідно не платити неї). Хоча методи соц. інженерії ніхто не відміняв. І найбільш красивий метод злому - генератор реєстраційних ключів, кейген. Саме тому розробники прагнуть зробити ключі складніше, застосовуючи наступну тактику:
- Ключ повинен бути не надто короткий для виключення можливості його підбору
- Ключ може містити кодові значення, критичні для правильної роботи програми
- Алгоритм перевірки ключа розділяється на базову перевірку і невеликі перевірки розкидані по коду програми (див. Тайм-бомби)
- Ключ захищається електронним цифровим підписом - протидія створенню генераторів ключів
- Використання електронних ключів - донгла
- Перевірка ключа на сервері по базі відомих покупців
Ці пункти ускладнюють злом програми, але є кілька проблем (проблем для розробників).
погляд розробників
Розробники не сильно відрізняються оригінальністю. Як зробити реєстраційний ключ, при цьому прив'язавши його до імені користувача? У кожній другій програмі можна побачити підрахунок ASCII-кодів символів реєстраційного імені, реверс рядки і використання підрахунку довжини рядка для отримання параметра ключа, використання хеш-функцій (а це майже завжди провал - хеш-функції без додаткового захисту їх коду і констант відразу локалізуються в програмі і прискорюють злом). При використанні хеш-функцій часто додають у відкрите повідомлення фіксовану рядок - назва програми або якусь фразу, щоб збільшити повідомлення перед хешем (навіщо ви це робите?). Однією з головних частих помилок розробників є вбудовування коду генеруючого серійний номер в програму або ж кілька фіксованих серійних номерів в коді програми. Варіант останньої помилки - блек-лист серійних номерів. Не робіть цього ніколи! Якщо є потреба додати ключ в чорний список, візьміть його частина, додайте до нього рядок (якщо є реєстраційне ім'я і прив'язка до обладнання - їх теж) і скористайтеся безпечної хеш-функцією - зберігати в програмі безпечно тільки хеші вкрадених ключів. По-перше, це виключає можливість злому патчем - змінивши кілька байт в серійному номері і перерахувавши контрольну суму (якщо є), серійний номер можна використовувати знову. По-друге, зломщик дізнається формат ваших ключів, а саме такі важливі параметри як довжину, набір символів, секретні частини серійного номера (якщо є) - це не тільки в рази збільшить швидкість створення ліків, але і допоможе протестувати генератор ключів.
Використання криптографії
Найбільш частою помилкою в захисті ПО є непродумана і неперевірена криптографічний схема. Якщо програма містить шифрування коду, реєстраційний ключ зберігає в собі симетричний ключ. У разі використання автоматизованої захисту (протектор або використання відомої реалізації криптоалгоритму, що генерує ключ), в ній можуть бути знайдені вразливості, що дозволяють згенерувати секретний ключ, на чому злом зазвичай закінчується. До таких уязвимостям відносяться мала довжина ключа (32 біта - це мало), помилки в ГСЧ (коли частина ентропії можна бути вгадана, наприклад, в разі прямої залежності від часу генерації ключа або малому значенні ініціюючого значення) і, нарешті, можливість здійснення криптоанализа з допомогою дизассемблера довжин і калькулятора ентропії (в разі використання вдалого алгоритму, одним з яких є AES стійкість проти цієї атаки буде занадто високою).
Команда tPORt спільно з іншими командами і незалежними експертами і помічниками неодноразово ламала схеми з RSA -512 і вище. Розподілені обчислення це ще один ефективний спосіб злому ПО. Чад Нельсон стверджував, що ЕЦП крекери не під силу. При цьому в захисті його компанії були допущені дві помилки, які дозволяли зламати ECDSA -113 без використання паралельних обчислень. Паралельними обчисленнями займаються і інші команди, але інформації про їхню діяльність в публічному доступі немає.
Black-листи
Black-листи (англ. Black list, чорний список) - один із способів вирішення проблеми витоку ключів в публічний доступ. Ключ або його ідентифікаційна інформація (найчастіше використовується хешування) додаються на сайт розробника або безпосередньо потрапляють в дистрибутив програми (як правило в Гланом виконуваний файл). Спроба зареєструвати програму ключем з чорного списку не призведе до її реєстрації. Крекери боряться з чорними списками шляхом патчів або створенням генераторів ключів.
White-листи
White-листи (англ. White list, білий список) навпроти, служать для зберігання про ліцензування легальних користувачів, які не порушували умови ліцензійної угоди. Знову таки програма перевіряє ключ або через сайт (онлайн-перевірка), або білий список "зашитий" безпосередньо в неї. Щоб обійти білі списки необхідно або пропатчити програму, або обдурити (в разі онлайн перевірки поправити файл hosts, або зробити лоадер який буде перехоплювати перевірку ключа на сервері), або зробити BruteForce-атаки, якщо вона здійсненна стосовно жертві злому. Також часто бувають диваки розробники, які просто зберігають ключ у відкритому вигляді в програмі. Такий ключ можна отримати навіть не відкриваючи дизассемблер або відладчик.
Приклади реєстраційних ключів
Ось кілька прикладів реєстраційних ключів. Ці приклади можна використовувати, щоб по ключу швидко припустити, який захист використовувалася.
- ASProtect SKE (в цьому захисті дефіси розставляються зліва направо, розділяючи серійний номер на блоки по 5 символів)
- Armadillo: Unsigned key
- Armadillo: V2Key Level 1
- Armadillo: V3Key Level 9
- Armadillo: ShortV3Key Level 1
- Armadillo: ShortV3Key Level 10 (провідні нулі в Armadillo служать вирівнюванням, перша значуща цифра 1 - маркер рівня 10)
- Obsidium 1.4 short keys medium
- VMProtect Ultimate
Програма для реєстрації просить ввести код. Як зламати?
Я тільки почав займатися reversing 'ом, і є питання. Програма для реєстрації просить ввести код. Як спіймати місце, коли вона його буде зчитувати, щоб потім можна було дізнатися, що вона робить з введенням кодом, і де йде перевірка.
Потрібно спробувати поставити брейкпоінт на функції GetWindowTextA. GetDlgItemTextA. Якщо вони не спрацюють, то спробуйте поставити брейкпоінт на функцію hmemcpy / memcpy. Хоча часто виявляється простіше шукати за повідомленням про помилку, тобто шукати в дизассемблера посилання на рядок-повідомлення про помилку. Адже не обов'язково, що програма буде використовувати будь-яку з цих API функцій. наприклад якщо програма написана на VB або Clarion.