Как написать регистрацию программы?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Как написать регистрацию программы?

Сообщение ViruZ » 22.08.2007 10:06:31

Есть программа в стадии беты, проходит тестирование на реальных данных. Планирую распространять, за деньги :o естессно, возникла необходимость написать регистрацию и ограничить демо-версию, например, 30 запусками. Как лучше всего это осуществить?

З.Ы. Программа написана на Лазаре под Виндовс, использоваться будет предположительно только в Украине в лечебно-профилактических заведениях (формирование тарификационных списков медецинских работников + некоторые дополнительные возможности).
Последний раз редактировалось ViruZ 27.08.2007 11:39:13, всего редактировалось 1 раз.
ViruZ
постоялец
 
Сообщения: 175
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение Сергей Смирнов » 22.08.2007 13:53:37

Можно ещё ограничивать не количество запусков (т.к. счётчик надо где-то хранить), а количество записей в какой-нибудь подходящей таблице.

Далее надо сгенерить серийный номер и какой-нибудь хэш из него по более-менее хитрому алгоритму. Далее клиенту высылаешь эту пару и заставляешь ввести. Хранишь и то и другое потом на диске (хэш надо зашифровать используя в качестве ключа, например, номер HDD). При старте проги снова получаешь тем же самым алгоритмом хэш из серийника и сравниваешь с расшифрованным с диска. Если совпадут - прога зарегистрированная, проверку на окончание периода не делать.

В серийный номер можно даже зашить какую-нибудь полезную инфу (тип версии, дату продажи и т.п.).

Способ этот довольно примитивный и, наверное, легко ломаемый, но всё-же простому юзеру крякнуть его врядли под силу.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение ViruZ » 22.08.2007 14:00:19

Большое спасибо! Именно таким образом и сделаю. А ломать навряд ли кто-то будет, т.к. программа узко специализированная, а цена будеть даже очень гуманной, во всяком случае, государственные заведения здравоохранения спокойно себе смогут позволить купить эту порграмму.
Но возникает встречный вопрос: каким образом программно можна получить номер HDD?
ViruZ
постоялец
 
Сообщения: 175
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение Attid » 22.08.2007 14:30:11

поломать можно все . дальше от стоимости и типа распростронения.

лучше всего железная защита типа хасп или подобное. но про 30 запусков тут надо забыть.

дешево и сердито если используешь БД то там отмечайся и отсчитывай 30 запусков, можно и в реестр но отлавить можно и то и то.

вместо 30 запусков лучше сделать 30 дней и пока прога не зарегина проверяешь все даты проходящие через прогу. если клиент записывался\платил и .т.д. больше 30 дней назад выходишь из проги с предупреждением. самый безпрогрышный способ =)

а регистрцию читай в нете это как таковое к лазарю не привязано.
берешь имя машыны\серийный номер винта\и т.д. шифруешь понравившемся тебе алгоритмом с добавлением своего мастер слова ну и ключ готов.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение ViruZ » 22.08.2007 15:01:24

Именно так и пробую сделать. Нашел на Дельфях функцию как узнать серийник винчестера, сейчас попробую кодировать.
ViruZ
постоялец
 
Сообщения: 175
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение Сергей Смирнов » 22.08.2007 15:13:36

Функция возвращает номер HDD с указанной буквой. Ясен пень, что работать будет только в винде. Наверное, есть и кроссплатформенные решения. Если кто найдёт/сделает, плиз, не держите в себе :)
Код: Выделить всё
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Windows;

  function GetHSN(const DriveLetter: Char): DWord;

implementation

function GetHSN(const DriveLetter: Char): DWord;
var
  VolumeLabel, FileSystem: Array[0..$FF] of Char;
  SerialNumber, DW, SysFlags: DWord;
  D: Char;
  strDrive: string;
begin
  GetHSN := 0;
  D := UpCase(DriveLetter);
  if (D >= 'A') and (D <= 'Z') then
  begin
    strDrive := (D + ':\');
    GetVolumeInformation(@strDrive[1], VolumeLabel, SizeOf(VolumeLabel),
                         @SerialNumber, DW, SysFlags, FileSystem,
                         SizeOf(FileSystem));
    GetHSN := SerialNumber;
  end
end;
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение ev » 22.08.2007 16:11:10

лучше всего железная защита типа хасп или подобное. но про 30 запусков тут надо забыть.

аппаратный счетчик у нормальных ключей работает нормально
вопрос как это будет реализовано в самой программе
ведь часто ломают не ключик, а сам софт... даже крутую защиту можно прикрутить настолько коряво, что взломает и младенец
ev
долгожитель
 
Сообщения: 1763
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение Attid » 22.08.2007 17:31:55

аппаратный счетчик у нормальных ключей работает нормально


не я просто про то что не получится распростронять прогу через инет да и давать всем ключик для пробы денег тоже не напасешься.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение ev » 22.08.2007 17:34:29

норм ключик - примерно 15-20$
ev
долгожитель
 
Сообщения: 1763
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение ViruZ » 27.08.2007 12:56:39

Сергей Смирнов писал(а):Функция возвращает номер HDD с указанной буквой. Ясен пень, что работать будет только в винде. Наверное, есть и кроссплатформенные решения. Если кто найдёт/сделает, плиз, не держите в себе :)

Как вариант - отпарсить вывод hdparm в Линуксе или :idea: посмотреть его исходники
ViruZ
постоялец
 
Сообщения: 175
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина

Сообщение ViruZ » 06.09.2007 10:26:42

Сергей Смирнов писал(а):Функция возвращает номер HDD с указанной буквой. Ясен пень, что работать будет только в винде. Наверное, есть и кроссплатформенные решения. Если кто найдёт/сделает, плиз, не держите в себе :)


Кое-что нашел для линукса, но написано на с
Может, кто может попробовать переписать под FPC и протестировать?
Код: Выделить всё
#include <linux/hdreg.h>

...

int fd;
struct hd_driveid id;

...

fd = open ("/dev/hda", O_RDONLY);
ioctl (fd, HDIO_GET_IDENTITY, &id);
close (fd);
printf ("%s\n", id.serial_no);
ViruZ
постоялец
 
Сообщения: 175
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru