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 – Скачиваний: 1266 – Скачан последний раз: 15.08.2012 07:19

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

Post to Twitter

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

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

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

  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. К сожалению, у мены компилятор какой-то урезанный и не распознает инлай директиву.

  6. avatar

    TheOlimper
    Апрель 23rd, 2012 at 10:33 #

    попробовал в RAD Studio 2010 и этот модуль на нем не работает. Что делать? А мне бы он так помог

  7. avatar

    GlooK
    Апрель 23rd, 2012 at 13:50 #

    А какую ошибку выдает?

  8. avatar

    TheOlimper
    Апрель 25th, 2012 at 09:28 #

    Не выдает ошибок как ни странно. exe’шники скаченные мной с этого сайта исправно работали, а если я открывал проект и, не делая никаких изменений, пытался запустить в Rad Studio, то ApplicationUnit уже не запускался при наличии ключа в папке. Как отладить я даже не знаю. А в какой версии borland’a был написан bindex?

  9. avatar

    GlooK
    Апрель 25th, 2012 at 12:12 #

    Bindex написан на BDS 2006 (http://tdlite.ru/delphi/portable-delphi/)

  10. avatar

    TheOlimper
    Апрель 29th, 2012 at 09:14 #

    Слушай, а ты сам какой версией пользуешься? Как можно отладить для RAD 2010? Я что-то пытаюсь-пытаюсь, а никак не выходит ((

  11. avatar

    Anriko
    Май 2nd, 2012 at 19:56 #

    TheOlimper, замени код функции TBind.FReadSerial(AFileName: string): string; в bindex.pas на:
    function TBind.FReadSerial(AFileName: string): string;
    var
    FileStream: TFileStream;
    ZlibStream: TDecompressionStream;
    Buffer: AnsiString;
    begin
    try
    FileStream := TFileStream.Create(AFileName, fmOpenRead);
    ZlibStream := TDecompressionStream.Create(FileStream);
    SetLength(Buffer, FileStream.Size);
    ZlibStream.Read(Buffer[1], FileStream.Size);
    ZlibStream.Free;
    FileStream.Free;
    Result := Trim(string(Buffer));
    except
    Halt;
    end;
    end;

  12. avatar

    TheOlimper
    Май 10th, 2012 at 09:19 #

    Я заново скачал этот модуль, в каждом bindex’e поменял этот код функции, но он все равно не работает. Но всё равно спасибо))

  13. avatar

    VANS
    Июль 13th, 2012 at 21:04 #

    Пффф, это крякается обычными NOP’ами, можно даже универсальный патч накатать. Если хотите защитить свою программу — этот компонент не лучший вариант.

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

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