Delphi → Привязка к железу в Delphi

Сен 2, 2011


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

Как это происходит?


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

Модуль


Для того, чтобы постоянно не переписывать защитный код, я решил создать отдельный модуль - BindEx. С помощью него можно произвести быструю привязку к железу в несколько строк кода. Шифрование/сжатие файла лицензии производится библиотекой Zlib, которая использует комбинацию алгоритма LZ77 и алгоритма Хаффмана. Сам серийный номер преобразуется в хэш через алгоритм MD5.


Описание модуля


Disk

property Disk: char write FDisk;

Свойство, принимающее в качестве значения, букву диска для которой будет формироватся серийный номер (по умолчанию - C).

KeyFile

property KeyFile: string write FKeyFile;

Свойство, принимающее в качестве значения, имя файла лицензии (по умолчанию - key.lic).

Salt

property Salt: string write FSalt;

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

CreateKeyFile

procedure CreateKeyFile(ASerial: string);

Процедура создает файл лицензии на основе серийного номера ASerial.

CheckNow

procedure CheckNow;

Процедура проверяет файл лицензии и если он неверный завершает работу.

GetDiskSerial

function GetDiskSerial: string;

Функция возвращает серийный номер текущего компьютера.

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

Скачать bindex.zip (модуль + пример использования)
Размер: 662.6 kB – Скачиваний: 140 – Скачан последний раз: 26.11.2011 16:58

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

Post to Twitter

Похожие статьи:

  1. Компонент Antigate для Delphi
  2. Использование XML в Delphi (msxml_tlb)
  3. Взаимодействие Oracle и Delphi
  4. Установка Indy на Portable Delphi
  5. Многопоточность в Delphi

Комментарии (5)

  1. avatar

    Sky
    Сентябрь 3rd, 2011 at 13:06 #

    Проверка на основе серийного номера жесткого диска?

  2. avatar

    GlooK
    Сентябрь 3rd, 2011 at 13:19 #

    Да. Предвижу возмущение, но как защита от дурака подходит.
    А тем, кому действительно нужна хорошая защита, добавят еще привязку к матплате, сетевухе и т.д.

  3. avatar

    Sky
    Сентябрь 3rd, 2011 at 20:01 #

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

  4. avatar

    Безумный Программист
    Сентябрь 4th, 2011 at 13:33 #

    К сожалению, такая защита ломается простым перехватом GetVolumeInformation.

  5. avatar

    GlooK
    Сентябрь 4th, 2011 at 14:28 #

    Безумный Программист
    Как вариант, можно добавить inline директиву к функциям сравнения и вызову GetVolumeInformation. После чего вызывать CheckNow при каждом действии пользователя. По крайней мере это не даст сделать битхак.

    P.S. К сожалению, у мены компилятор какой-то урезанный и не распознает инлай директиву.

Ваш комментарий

Rambler's Top100 Яндекс.Метрика