Лицензирование с OnGuard - PullRequest
       31

Лицензирование с OnGuard

2 голосов
/ 03 декабря 2010

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

Изучив руководство и примеры, я добавил в код своей основной формы следующее:

const
  TheKey: TKey = ($4A,$62,$F3,$2B,$9C,$D2,$84,$BF,$CB,$04,$0A,$C3,$3D,$11,$47,$1A);


function TfrmMain1.MakeCode(sName, sNumber: String; dtExpiration: TDate): String;
var Key: TKey;
    Code: TCode;
    sCode: String;
begin
  Key := TheKey;
  InitRegCode(Key, sName + ' - ' + sNumber, dtExpiration, Code);
  sCode := BufferToHex(Code, SizeOf(Code));
  Insert('-', sCode, 13);
  Insert('-', sCode, 09);
  Insert('-', sCode, 05);
  Result := sCode
end;

function TfrmMain1.TestCode(sName, sNumber, sTestCode: String; dtExpiration: TDate): Boolean;
var Key: TKey;
    Code: TCode;
    sCode: String;
begin
  sCode := MakeCode(sName, sNumber, dtExpiration);

  Result := SameText(sCode, sTestCode);
end;

Это поднимает некоторые вопросы:

  1. Кажется ли вам правильным использовать это? Я бы предпочел не добавлять их компоненты в мою форму.

  2. Поскольку исходный код OnGuard доступен, не может ли хакер-реверс-инженер Ключ, который я выберу, и создать действительные коды выпуска? Должен ли я поэтому добавить некоторую дополнительную запутанность в код или я могу просто ослабить систему.

  3. Ключ устанавливается здесь как константа. Разве это не будет показано в коде как непрерывные байты и будет легко скопировать?

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

Здесь есть 4 вопроса, которые тесно связаны и довольно специфичны. Казалось, что было бы более неловко задавать вопросы в четырех отдельных записях и добавлять ссылки на контекст, но я буду рад сделать это, если это будет предпочтительнее. Спасибо за вашу помощь.

Джек

Ответы [ 3 ]

2 голосов
/ 04 декабря 2010

Я использую API нижнего уровня OnGuard, а не классы, предложенные Runner.Любой из них будет работать нормально, так или иначе классы будут вызывать API более низкого уровня.Вот мои вспомогательные функции-обертки для этих методов API более низкого уровня.

{ Used by you to generate the unlock code you send to your customer, do not include in the customer software }

function GenerateReleaseCode(const inAppKey : string; inExpiryDate : TDateTime; inRegCode : string) : string;
(* inAppKey is the byte sequence key you already have
   inRegCode can be anything, typically customers name
   Returns the release code for the customer to type into the software *)
var
  releaseCode : TCode;
  key : TKey;
begin
  HexToBuffer(inAppKey, key, SizeOf(TKey));
  InitRegCode(key, inRegCode, inExpiryDate, releaseCode);
  Result := BufferToHex(unlockCode, SizeOf(releaseCode));
end;

{ Used in your program to authenticate if the release code is valid - does not check for expiry }

function AuthenticateReleaseCode(const inReleaseCodeHexString : string; const inAppKey : TKey) : Boolean;
var
  releaseCode : TCode;
begin
  HexToBuffer(inReleaseCodeHexString, releaseCode, SizeOf(releaseCode));
  Result := IsRegCodeValid(inAppKey, releaseCode);
end;

{ Used in your program to test if the license has expired }

function UnlockCodeExpiryDate(const inReleaseCodeHexString : string; const inAppKey : TKey) : TDateTime;
var
  releaseCode : TCode;
begin
  HexToBuffer(inReleaseCodeHexString, releaseCode, SizeOf(releaseCode));
  Result := GetExpirationDate(inAppKey, releaseCode);
end;

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

Даже тогда вы можете замедлить взломщики, но вы можете 'Останови их.

2 голосов
/ 05 декабря 2010

3) Вы должны «разбросать» ключ вокруг и, возможно, каким-то образом вычислить его часть. Чем проще определить ключ, тем проще обойти защиту. Но даже сложный ключ бесполезен, если простая инструкция JMP в нужном месте обойдет всю проверку защиты. Эти проверки также должны быть более одного, и опять же, разбросаны по всему.

4) Будьте осторожны с такими лицензиями - обычно пользователям они не нравятся, если только ежегодная плата не означает также некоторую предполагаемую стоимость (то есть антивирус дает вам подписи обновлений или обновленные карты приложения GPS). Простое принуждение пользователей к ежегодной оплате может выглядеть хорошо для вас, но не для пользователей, даже если вы добавляете новые функции, которые они могут не счесть полезными. Если приложение перестает работать, это еще хуже. Это одна из проблем, которая убила многие приложения Unix, когда стали доступны приложения Windows с теми же функциями, но без ежегодных сборов. Я знаю, что многие компании думают вернуться к этой модели - если она будет успешной, еще предстоит увидеть.

2 голосов
/ 04 декабря 2010
  constructor TLincenceManager.Create;
  begin
    FSpecialCode := TOgSpecialCode.Create(nil);
    FSpecialCode.OnGetModifier := OgNetCodeGetModifier;
    FSpecialCode.OnChecked := OgNetCodeChecked;
    FSpecialCode.OnGetCode := OgNetCodeGetCode;
    FSpecialCode.OnGetKey := OgNetCodeGetKey;
    FSpecialCode.AutoCheck := False;
  end;

  function TLincenceManager.InitializeLicenceCode: Boolean;
  begin
    Result := FSpecialCode.CheckCode(True) = ogValidCode;
  end;

  procedure TLincenceManager.OgNetCodeChecked(Sender: TObject; Status: TCodeStatus);
  begin
    case Status of
      ogValidCode    : FMaxUsers := FSpecialCode.GetValue;
      ogInvalidCode  : FMaxUsers := 0;
      ogPastEndDate  : FMaxUsers := 0;
      ogDayCountUsed : FMaxUsers := 0;
      ogRunCountUsed : FMaxUsers := 0;
      ogNetCountUsed : FMaxUsers := 0;
      ogCodeExpired  : FMaxUsers := 0;
    else
      FMaxUsers := 0;
    end;
  end;

  procedure TLincenceManager.OgNetCodeGetCode(Sender: TObject; var Code: TCode);
  var
    FileName: string;
    SerialData: string;
    LicenceData: TStringList;
  begin
    FileName := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)));
    FileName := FileName + cLicenseFileName;
    SerialData := '';

    LicenceData := TStringList.Create;
    try
      if FileExists(FileName) then
      begin
        LicenceData.LoadFromFile(FileName);
        SerialData := LicenceData.Values['Serial'];
      end;

      {convert to proper form}
      HexToBuffer(SerialData, Code, SizeOf(Code));
    finally
      LicenceData.Free;
    end;
  end;

  procedure TLincenceManager.OgNetCodeGetKey(Sender: TObject; var Key: TKey);
  const
    CKey : TKey = ($4A,$62,$F3,$2B,$9C,$D2,$84,$BF,$CB,$04,$0A,$C3,$3D,$11,$47,$1A);
  begin
    Key := CKey;
  end;

  procedure TLincenceManager.OgNetCodeGetModifier(Sender: TObject; var Value: Integer);
  begin
    Value := GenerateMachineModifierPrim;
  end;
  1. Я опубликовал способ, которым я делаю это. Я не использую «визуальные» компоненты. То, как я это делаю, это путь, в вашем случае вы просто применяете модификатор даты (у меня есть модификатор машины)

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

  3. Да, ключ можно извлечь из двоичного файла, если кто-то знает, что делает. Вы могли бы использовать какое-то запутывание здесь. Но я бы не стал беспокоиться. Для большинства людей такой защиты достаточно, поэтому, если вы не делаете следующий MS Office, я бы не стал беспокоиться. Люди - параноики о своих продуктах. Продайте это сначала и подумайте об этом позже. Да, и поскольку это не строка, ее все равно найти немного сложнее.

  4. Достаточно взглянуть на демонстрационные версии, которые идут с onGuard, чтобы узнать, как сделать лицензию с ограниченным сроком действия. Однако имейте в виду, что простое манипулирование компьютерными часами будет достаточно, чтобы обмануть его. На мой взгляд, лучшее пробное программное обеспечение таково, что ему не хватает какой-то жизненно важной функции (кнопка сохранения ...). На мой взгляд, очень трудно проводить хорошие испытания.

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