Регистрационный ключ

eXeL@B DVD

Материал из Справочник исследователя программ

Перейти к: навигация, поиск

Регистрационный ключ - последовательность печатных символов (как правило, цифры, латинские литеры, дефисы-разделители, также часто строка в формате base32/base64), либо ключевой файл. Применяются для управления механизмом защиты программы, который искусственно ограничивает функционал программы, чтоб только авторизованный пользователь (оплативший лицензию или имеющий право использования), указав регистрационный ключ как доказательство своего права на использование в соответствующей форме, мог получить полную или менее ограниченную функциональность, предоставляемую ее разработчиком.

Некоторые программы не открывают свой функционал без ключа вообще. Всё зависит от выбранной разработчиком программы схемы ее распространения/продажи. Shareware-программы распространяются по принципу "try before buy" - попробуй перед покупкой. Разработчик выбирает набор возможностей, которые позволяют оценить программу, пользоваться же ей не получится - важные функции, например, печать или сохранение результатов работы отключены. После применения регистрационного ключа открываются все оплаченные возможности. Некоторые разработчики выдают ключи бесплатно, регистрацию заставляют делать исключительно для того, чтобы знать какое число человек использует программы и с какой целью. В отличие от пароля, регистрационный ключ ограничивает функциональность с целью контроля оплаты проделанной разработчиком работы.

Содержание

Взгляд крекеров

Задача крекера почти всегда сводится к тому, чтобы заставить программу работать без необходимости беспокоить разработчика на счет приобритения лицензии (и соответственно не платить нее). Хотя методы соц. инженерии никто не отменял. И наиболее красивый метод взлома - генератор регистрационных ключей, кейген. Именно поэтому разработчики стремятся сделать ключи сложнее, применяя следующую тактику:

  1. Ключ должен быть не слишком короткий для исключения возможности его подбора
  2. Ключ может содержать кодовые значения, критичные для правильной работы программы
  3. Алгоритм проверки ключа разделяется на базовую проверку и небольшие проверки разбросанные по коду программы (см. тайм-бомбы)
  4. Ключ защищается электронной цифровой подписью - противодействие созданию генераторов ключей
  5. Использование электронных ключей - донглов
  6. Проверка ключа на сервере по базе известных покупателей

Эти пункты усложняют взлом программы, но есть несколько проблем (проблем для разработчиков).

  • Во-первых, не знакомый с технологиями крекеров разработчик не всегда понимает каким должен быть код, проверяющий ключи. Алгоритмы за частую можно найти за 5 минут анализа. В ход идут анализаторы, криптоанализаторы, API-шпионы и API-хуки. Благодаря ним часто даже в 5-ти мегабайтах кода можно быстро локализовать место для нанесения удара. Одно здесь можно сказать уверенно - ЭЦП сильное припятствие. Если программа не использует проверку через интернет, защиту электронным ключом или ЭЦП, то есть все необходимые условия для взлома программы путем создания генератора ключей. Достаточное условие - программа должна быть интересной, чтобы на нее потратили время для создания кейгена.
  • Во-вторых, криптография сложная математическая наука, уровень преподования ее в университетах слабый. А сильный криптограф вряд ли будет писать 15-долларовый софт. Это основная причина, почему кейгены создавались и для программ с ЭЦП - одна маленькая уязвимость в алгоритме проверки и опытный крекер сможет обойти и ЭЦП. Особо ценятся релизы кейгенов для протекторов - взломав схему один раз, можно создать много кейгенов для разных программ, и, более того, автоматизировать процесс донельзя, что и было сделано многими командами и независимыми крекерами, например, для Armadillo. Даже прочитав статью на википедии, внимательно прочитав и соблюдая все пункты при написании кода, можно создать схему с уязвимостью. Мест, где можно ошибиться слишком много. Стоит также отметить, что можно пропатчить место проверки ЭЦП и сделать взлом связкой патч+кейген. Подробнее об атаках на ЭЦП смотрите в основной статье.
  • В-третьих, проверки через интернет часто обходятся патчами, донглы эмуляторами.

Взгляд разработчиков

Разработчики не сильно отличаются оригинальностью. Как сделать регистрационный ключ, при этом привязав его к имени пользователя? В каждой второй программе можно увидеть подсчет ASCII-кодов символов регистрационного имени, реверс строки и использование подсчета длины строки для получения параметра ключа, использованию хэш-функций (а это почти всегда провал - хэш-функции без дополнительной защиты их кода и констант сразу локализуются в программе и ускоряют взлом). При использовании хэш-функций часто добавляют в открытое сообщение фиксированную строку - название программы или какую-нибудь фразу, дабы увеличить сообщение перед хэшированием (зачем вы это делаете?). Одной из главных частых ошибок разработчиков является встраивание кода генерирующего серийный номер в программу или же несколько фиксированных серийных номеров в коде программы. Вариант последней ошибки - блэк-лист серийных номеров. Не делайте этого никогда! Если есть потребность добавить ключ в блэклист, возьмите его часть, добавьте к нему строку (если есть регистрационное имя и привязка к оборудованию - их тоже) и воспользуйтесь безопасной хэш-функцией - хранить в программе безопасно только хэши украденных ключей. Во-первых, это исключает возможность взлома патчем - изменив несколько байт в серийном номере и пересчитав контрольную сумму (если есть), серийный номер можно использовать снова. Во-вторых, взломщик узнает формат ваших ключей, а именно такие важные параметры как длину, набор символов, секретные части серийного номера (если есть) - это не только в разы увеличит скорость создания лекарства, но и поможет протестировать генератор ключей.

Использование криптографии

Наиболее частой ошибкой в защите ПО является непродуманная и непроверенная криптографическая схема. Если программа содержит шифрование кода, регистрационный ключ хранит в себе симметричный ключ. В случае использования автоматизированной защиты (протектор или использование известной реализации криптоалгоритма, генерирующего ключ), в ней могут быть найдены уязвимости, позволяющие сгенерировать секретный ключ, на чем взлом обычно заканчивается. К таким уязвимостям относятся малая длина ключа (32 бита - это мало), ошибки в ГСЧ (когда часть энтропии можно быть угадана, например, в случае прямой зависимости от времени генерации ключа или малом значении инициирующего значения) и, наконец, возможность осуществления криптоанализа с помощью дизассемблера длин и калькулятора энтропии (в случае использования хорошего алгоритма, одним из которых является AES стойкость против этой атаки будет слишком высокой).

Команда tPORt совместно с другими командами и независимыми экспертами и помощниками неоднократно взламывала схемы с RSA-512 и выше. Распределенные вычисления это ещё один эффективный способ взлома ПО. Чад Нельсон утверждал, что ЭЦП крекерам не под силу. При этом в защите его компании были допущены две ошибки, позволившие сломать ECDSA-113 без использования параллельных вычислений. Параллельными вычислениями занимаются и другие команды, но информации об их деятельности в публичном доступе нет.

Black-листы

Black-листы (англ. black list, черный список) - один из способов решения проблемы утечки ключей в публичный доступ. Ключ или его идентификационная информация (чаще всего используется хэширование) добавляются на сайт разработчика или непосредственно попадают в дистрибутив программы (как правило в гланый исполняемый файл). Попытка зарегистрировать программу ключом из черного списка не приведет к ее регистрации. Крекеры борятся с черными списками путем патчей или созданием генераторов ключей.

White-листы

White-листы (англ. white list, белый список) напротив, служат для хранения о лицензировании легальных пользователей, не нарушавших условия лицензионного соглашения. Опять таки программа проверяет ключ либо через сайт (онлайн-проверка), либо белый список "зашит" непосредственно в нее. Чтобы обойти белые списки необходимо либо пропатчить программу, либо обмануть (в случае онлайн проверки поправить файл hosts, или сделать лоадер который будет перехватывать проверку ключа на сервере), либо произвести BruteForce-атаку, если она осуществима применительно к жертве взлома. Также часто бывают чудаки разработчики, которые просто сохраняют ключ в открытом виде в программе. Такой ключ можно получить даже не открывая дизассемблер или отладчик.

Примеры регистрационных ключей

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

  • ASProtect SKE (в этой защите дефисы расставляются слева направо, разделяя серийный номер на блоки по 5 символов)
FXDAUPP-BAD9E-W8QH3-WWTCQ-LMVSK-WG4U4-DD36B
  • Armadillo: Unsigned key
1DCB-3A2A-F1CC-31DE
  • Armadillo: V2Key Level 1
37E8-B1AF-C073-B883-0903-A945-E6F9-F499
  • Armadillo: V3Key Level 9
37E8-B1AF-C073-B883-71BB-E437-A06C-6D22-D4D7-2E73-68A7-13E3-D3C2-01B6-1841-7522
  • Armadillo: ShortV3Key Level 1
0000HQ-X2RUZG-3KQ21R-PNKU6N-YVQRKF
  • Armadillo: ShortV3Key Level 10 (ведущие нули в Armadillo служат выравниванием, первая значащая цифра 1 - маркер уровня 10)
000014-KF385Q-R9GWNV-N60ZAY-P436Y4-B2023N-AU8B8Z-XU17QH-9Y4X98-EDAQEX
  • Obsidium 1.4 short keys medium
2QHPQ-PH8PK-R3904-EX32J-HC6C7-W6GEA-MI3EC-BI8SE-84I
  • VMProtect Ultimate
hO0BOD53HeyQxV7TrEUQmJqNFQXlL3cuDp+46jNHooVj9CGTlQLwClZQzCW2EusG3MBxUNaBITv0
QW5oEzgzXvm0/dW3QX4xUZ1pclR8hGDqyF6BdCgOJBJtYTMQvJraYtxGVuGLTZ222VDz8z7t/XIN
4HvBGrClJ+RJ1W0ib0E=


Программа для регистрации просит ввести код. Как сломать?

Я только начал заниматься reversing'ом, и есть вопрос. Программа для регистрации просит ввести код. Как поймать место, когда она его будет считывать, чтобы потом можно было узнать, что она делает с введенным кодом, и где идет проверка.

Нужно попробовать поставить брейкпоинт на функции GetWindowTextA, GetDlgItemTextA. Если они не сработают, то попробуйте поставить брейкпоинт на функцию hmemcpy/memcpy. Хотя часто оказывается проще искать по сообщению об ошибке, т.е. искать в дизассемблере ссылку на строку-сообщение об ошибке. Ведь не обязательно, что программа будет использовать хоть одну из этих API функций: например если программа написана на VB или Clarion.