Лучшее место, чтобы спрятать ключ в реестре Windows? - PullRequest
14 голосов
/ 01 августа 2010

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

Я хочу сохранить черный списокключ в реестре, поэтому, если пользователь пытается ввести его повторно (и он / она не подключен к Интернету), он не будет принят.

Каков наилучший способ скрыть запутанную запись вРеестр Windows?

Спасибо!


Редактировать: У вас там есть несколько хороших ответов, но я чувствую, что мне нужно расширить вопрос.

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

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

Таким образом, теперь приложение будет подключаться к Интернету при запускеи проверьте, есть ли их ключ в черном списке.Если это так, мне нужно отключить доступ.В случае, если они переустанавливают или блокируют доступ в Интернет, мне нужно знать, был ли ключ занесен в черный список.

Таким образом, я думаю, что было бы лучше скрыть его в реестре.Мои пользователи недостаточно разбираются в технологиях, чтобы использовать инструменты реестра для мониторинга реестра, но если я добавлю его в HKLM / Software / MyCompany / MyProgram, некоторые из них могут его найти.Поэтому мне нужно место, где они не смогут найти его потом, чтобы оно было создано.(Никто не будет ожидать этого!)

Есть идеи?

Ответы [ 5 ]

26 голосов
/ 01 августа 2010

Самый простой способ скрыть ключ или значение - создать ключ / значение, имеющее '\ 0' внутри имени. Вы можете сделать это с уважением к собственным функциям NtCreateKey (см. http://msdn.microsoft.com/en-us/library/ff556468.aspx) NtSetValueKey (см. http://msdn.microsoft.com/en-us/library/ff557688.aspx), которые используют UNICODE_STRING в качестве параметров вместо LPCTSTR. Вы можете прочитать больше о например, использование собственного API реестра в http://www.codeproject.com/kb/system/NtRegistry.aspx. Код Delphi вы найдете здесь http://www.delphi3000.com/articles/article_3539.asp.

ОБНОВЛЕНО : Поскольку многие читают этот вопрос, я хочу добавить несколько слов в свой ответ. Я хочу разделить часть вопроса, которую мы можем прочитать также в заголовке «лучшее место, чтобы скрыть ключ в реестре Windows» , от темы с лицензионными ключами . Поскольку я прочитал некоторые ответы (написанные до меня), которые касались почти только части лицензионных ключей, и почти не прочитал ответа на вопрос из заголовка, я написал мне ответ.

Тема с лицензионным ключом я считаю очень сложной. Это зависит от выбранной модели лицензирования. Важно, как генерировать, распространять (устанавливать) и проверять ключ. Ключ должен быть аппаратно зависимым или нет? Это может быть один на компьютер или один на группу компьютеров. Генерация ключа, установка ключа или проверка ключа может быть как с некоторыми онлайн-сервисами (также из Интернета), так и без них. Я могу продолжить ... Есть много аспектов, преимуществ и недостатков различных подходов.

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

ОБНОВЛЕНО 2 на основе обновленного вопроса: мне кажется, в вашем случае было бы лучше использовать некоторый сценарий, основанный на криптографическом подписании билета активации . Например, схема может выглядеть следующим образом:

  • Ваше программное обеспечение, установленное на клиентском компьютере, нуждается в активации. Перед активацией он может не работать или работать в очень ограниченной форме (например, включены только некоторые меню, необходимые для активации программного обеспечения).
  • Вы пишете серверный компонент, который будет использоваться клиентом во время активации для генерации лицензионного ключа на основе запроса активации, полученного от клиента.
  • Если клиент платит за программное обеспечение, вы включаете информацию о «идентификаторе компьютера» клиента (в любой форме) в базу данных на сервере.
  • После запуска процесса активации из клиентского программного обеспечения (либо при запуске программы из меню, либо любым другим способом, каким вы хотите), он собирает некоторую информацию о компьютере, такую ​​как имя компьютера («идентификатор машины»), некоторые последовательные номера или другая информация об оборудовании или операционной системе, которую нельзя изменить без новой активации. Эту информацию программа отправляет на ваш сервер (это запрос на активацию).
  • Сервер проверяет, что клиент с «идентификатором машины» заплатил за программное обеспечение и еще не активирован. Затем сервер вычисляет хеш (SHA1, MD5 или какой-либо другой) из информации, отправленной клиентом, и подписывает ответ закрытым ключом сервера (или сертификатом сервера). Подписанный сервер заявок будет отправлен обратно клиенту. Этот билет будет играть роль лицензионного ключа.
  • Сервер может добавить любую дополнительную информацию в тикет до подписания.Например, он может добавить информацию о дате до того, как одна программа должна быть действительной (например, текущий день плюс один год).Таким образом, билет, который будет отправлен обратно клиенту, может содержать хэш входной информации об активации и любую дополнительную информацию, все, что вы хотите.Важно только то, что информация должна быть подписана .В общем случае вы можете включить полный запрос клиента в виде простого текста в заявку сервера вместо включения хеша, но использование хеша а) уменьшает размер заявки и б) делает билет немного более безопасным.
  • Каждый клиент имеет открытый ключ , соответствующий личному ключу, используемому сервером для подписания билета активации.Клиент сохраняет билет, полученный от сервера во время активации, в любом месте реестра в файловой системе.
  • Каждый раз, когда клиентское программное обеспечение запускается, программное обеспечение считывает сохраненный билет активации из реестра (или из файловой системы).Затем программа собирает ту же информацию, которая используется для генерации билета активации, вычисляет хеш и сравнивает его с хешем из сохраненного билета.Он проверяет причину подписи билета в отношении открытого ключа (или в отношении сертификата сервера).Более того, программное обеспечение может проверять любую другую дополнительную информацию о политике из билета, например, до истечения срока действия билета.

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

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

25 голосов
/ 01 августа 2010

Я не думаю, что реестр является хорошим местом для сокрытия такой информации, потому что любой может загрузить и использовать Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) инструмент и посмотреть, что ваша программа делает с реестром.

И снова думаю об этом. Вы, вероятно, сделаете пользователей вашего программного обеспечения несчастными, если оно оставит вещи в реестре и других «секретных» местах на жестком диске пользователя. Подобные места также легко обнаруживаются инструментами, которые отслеживают, какие функции системы вызывает ваша программа.

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

Недостатком этого является то, что пользователь может потенциально запускать более старую версию с заблокированным ключом с заблокированным доступом в Интернет на ваш сайт, но если ваше программное обеспечение активно разрабатывается с добавлением новых функций и исправлений, то никто не захочет запускать более старые версии , И если вы очень параноик, вы можете выпускать «обновления», которые обновляют только встроенный список запрещенных ключей.

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

2 голосов
/ 01 августа 2010

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

Другие приложения (например, Windows) вместо проверки на отрицательный (забаненный ключ) вместо проверки на положительный (хороший ключ).Вы «активируете» программное обеспечение один раз (при подключении через Интернет), и эта активация сохраняет «хороший ключ», который вы затем можете проверить при каждом запуске программного обеспечения (будь то онлайн или офлайн).

Я бы предложилВторой подход для вас.

2 голосов
/ 01 августа 2010

Если вы действительно хотите пойти по этому пути, зашифруйте или зашифруйте ключи, а затем проверьте хешированный или зашифрованный пользовательский ключ с ключами в реестре.

Обязательно проверьте, есть ли какие-либо ключи в реестре дляубедитесь, что пользователь не стер их.

1 голос
/ 01 августа 2010

Обратите внимание, что существуют обычные инструменты конечного потребителя, которые отслеживают, какие приложения пишут в реестр (например, Cleansweep).Это происходит на уровне вызовов API, поэтому, вероятно, он также поймает обходные пути № 0.

Вы можете попытаться зашифровать весь shebang в ключе реестра с помощью чего-то, что однозначно идентифицирует машину (например, MAC-адрес) ивременная метка, чтобы люди не могли перенести ключ на другие машины.Они всегда требуют наличия такого ключа для запуска и требуют подключения к Интернету для обновления / активации, если его там нет.(или отметка времени очень старая)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...