Как привязать программу к железу

Данную статью я представляю вниманию новичков для обеспечения защиты своего софта. Защита реализуется путем привязки к железу компа + онлайн проверка.

Наша защита будет состоять из нескольких частей:

  • Генератор серийного номера по системным характеристикам.
  • Генератор ключа авторизации по серийнику
  • Защищаемая программа

Итак… с структурой мы разобрались, теперь нужно определиться к каким параметрам мы будем осуществлять привязку.

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

Иногда в программах необходимо использовать возможность проверки типа носителя или его серийный номер. Причины могут быть разными от банального контроля устройств в системе до средств защит использующих привязку к железу. Сейчас я вам покажу как с помощью API реализовать эту простую задачу.

Нам понадобится всего 2 API — функции:

  • GetDriveType — определяет и возвращает тип носителя;
  • GetVolumeInformation — определяет информацию о носителе, среди которой содержится серийный номер.

Рассмотрим описание этих функций для С++ и Delphi. Первой будет функция GetDriveType, она очень простая и использует всего один параметр — указатель на том. Например «c:»,»a:» и т.д. Функция возвращает одно из следующих значений:

Привязка программы к железу Delphi (через интернет)

  • DRIVE_UNKNOWN — 0 : диск неопределен/не существует
  • DRIVE_NO_ROOT_DIR — 1 : неверный путь/ путь не указывает на том
  • DRIVE_REMOVABLE — 2 : тип устройства определяется как съемный (дискета, флешка и т.д.)
  • DRIVE_FIXED — 3 : тип устройства — фиксированный диск (жесткий диск)
  • DRIVE_REMOTE — 4 : тип устройства — удаленный(сетевой) диск
  • DRIVE_CDROM — 5 : это устройство CD-ROM
  • DRIVE_RAMDISK — 6 : виртуальный диск, созданный в оперативной памяти

C/C++

UINT WINAPI GetDriveType( LPCTSTR lpRootPathName //путь к диску );

Delphi

function GetDriveType( lpRootPathName: PChar //путь к диску ): UINT; stdcall;

Замечание: Если в качестве параметра указать для С/С++ NULL, а для Delphi — nil то тип устройства будет определяться для текущего диска (с которого была запущена программа).

А теперь взглянем на функцию GetVolumeInformation. Тоже достаточно простая функция, однако использует параметров значительно больше.

C/C++

BOOL WINAPI GetVolumeInformation( LPCTSTR lpRootPathName, //путь к сетевому или локальному // тому (пример: «\MyServerMyShare» или «C:». LPTSTR lpVolumeNameBuffer, //буфер — в котором будет храниться // имя тома DWORD nVolumeNameSize, //размер буфера LPDWORD lpVolumeSerialNumber, //серийный номер тома LPDWORD lpMaximumComponentLength, //размер тома LPDWORD lpFileSystemFlags, //тип файловой системы LPTSTR lpFileSystemNameBuffer, //название файловой системы DWORD nFileSystemNameSize //размер буфера под название ФС );

Читайте также:
Что такое кроссовер программа

Delphi

function GetVolumeInformation( lpRootPathName: PChar; //путь к сетевому или локальному //тому (пример: «\MyServerMyShare» или «C:». lpVolumeNameBuffer: PChar; //буфер — в котором будет храниться // имя тома nVolumeNameSize: DWORD; //размер буфера lpVolumeSerialNumber: PDWORD; //серийный номер тома var lpMaximumComponentLength, lpFileSystemFlags: DWORD; //размер // тома и тип файловой системы lpFileSystemNameBuffer: PChar; //название файловой системы nFileSystemNameSize: DWORD //размер буфера под название ФС ): BOOL; stdcall;

Замечание: Если в качестве первого параметра указать для С/С++ NULL, а для Delphi — nil то функция будет выполняется для текущего диска (с которого была запущена программа).

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

Ну а теперь собственно для пущего интересу приведу пример, как привязать программу к устройству. В данном примере будем привязывать программу к флешке. Смотрим пример:

C/C++

#include #include #include #include using namespace std; int main() < // Получаем тип носителя с которого запущена программа unsigned int drive_type = GetDriveType( NULL ); char VolumeNameBuffer[100]; char FileSystemNameBuffer[100]; DWORD sz,fs; unsigned long drive_sn; GetVolumeInformationA( NULL, VolumeNameBuffer, 100, cout << «Volume serial number:t»; if(drive_sn == 1018821877) //сравниваем серийный номер cout

Delphi

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

C/C++

. GetVolumeInformationA(NULL, VolumeNameBuffer,100, .

Delphi

Источник: codenet.ru

Лицензирование программы с привязкой к железу

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

Отслеживать
19.1k 6 6 золотых знаков 30 30 серебряных знаков 44 44 бронзовых знака
задан 17 июл 2016 в 8:04
929 6 6 серебряных знаков 17 17 бронзовых знаков

Читайте также:
Лучшая программа для составления бизнес планов

Вы же понимаете, что это очень субъективный вопрос? Методика защиты приложения зависит от многих факторов, например: есть ли сервер, на который приложение может обратиться за проверкой лицензии или за самими файлами? Как вообще Вы видите (абстрактно) порядок работы пользователя по установке приложения и работе с ним, применительно к защите файлов? Т.е. для каких-либо ответов нужно знать предполагаемую модель распространения приложения.

17 июл 2016 в 8:21

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

17 июл 2016 в 8:36
В этом случае нецелесообразно экономически использовать токен. Не тот уровень по.
17 июл 2016 в 8:52

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

18 июл 2016 в 8:52

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

18 июл 2016 в 10:16

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

Читайте также:
Программа день перемен отзывы

Отслеживать
ответ дан 18 июл 2016 в 10:29
Albert Fomin Albert Fomin
1,108 5 5 серебряных знаков 7 7 бронзовых знаков

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

Простой пример — 1с на сервере в режиме программной эмуляции (hyper-v, esxi или подобное). Меняем размер винчестера (виртуального. ) — требуется переактивация. Защита не должна глючить. Например, в ситуации, если есть привязка к серийнику диска, а их в системе два. И т.п. соображения

18 июл 2016 в 11:30

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

18 июл 2016 в 11:31

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

18 июл 2016 в 12:27

1. Вопрос к чему цепляться. Дешёвые китайские мамки через WMI могут не отдавать информацию (‘To be filled by OEM’ в ответ на запрос о производителе, например).

19 июл 2016 в 7:32

Тут всё достаточно извращенно ‘select caption from Win32_volume where systemvolume=True’ — вернет системный диск, случается, что операционка не на c: установлена. Затем через ‘SELECT Dependent,Antecedent FROM Win32_LogicalDiskToPartition’ найти имеется ли в свойстве Dependent имя системного диска, Antecedent — для этой записи будет содержать имя раздела. Затем ‘SELECT Dependent,Antecedent FROM win32_diskdrivetodiskpartition’ вернет в Antecedent уже значение индекса диска. А уже после этого можно сделать запрос SELECT * FROM win32_Physicalmedia where tag like ‘%physicaldrive0%’

19 июл 2016 в 12:12

  • delphi
  • лицензирование

Источник: ru.stackoverflow.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru