Лицензирование с OnGuard
Недавно я решил использовать 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;
Это поднимает некоторые вопросы:
Кажется ли, как правильно использовать это? Я бы предпочел не добавлять их компоненты в мою форму.
Поскольку исходный код OnGuard доступен, не может ли хакер-реверс-инженер Ключ, который я выберу, создать действительные коды выпуска? Должен ли я поэтому добавить некоторую дополнительную запутанность в код или я мог бы просто ослабить систему.
Ключ устанавливается здесь как константа. Разве это не будет отображаться в коде как непрерывные байты и будет легко скопировать?
Моя программа потребует (как минимум) ежегодных обновлений, и я планирую лицензировать ее с годовой подпиской. Будет ли правильнее добавить год в моей программе в качестве константы и проверить датированные записи пользователей по сравнению с этим годом в нескольких местах.
Здесь есть 4 вопроса, которые тесно связаны и довольно специфичны. Казалось, что было бы более неловко задавать вопросы в четырех отдельных записях и добавлять ссылки на контекст, но я буду рад сделать это, если это будет предпочтительнее. Спасибо за помощь.
Джек
3 ответа
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;
Я разместил способ, которым я делаю это. Я не использую "визуальные" компоненты. То, как я это делаю, это путь, в вашем случае вы просто применяете модификатор даты (у меня есть модификатор машины)
Нет в теории нет. Ключ, с помощью которого вы генерируете свою лицензию, имеет большое значение Если у вас есть ключ, вы можете взломать лицензии. Но только с кодом, который вы не можете. Это так же, как алгоритмы шифрования. Вы можете знать, как работает алгоритм, но если у вас нет ключа, вы не сможете взломать его. Посмотрите на XTEA. Это очень просто, но трудно взломать.
Да, ключ может быть извлечен из двоичного файла, если кто-то знает, что делает. Вы могли бы использовать какое-то запутывание здесь. Но я бы не стал беспокоиться. Для большинства людей такой защиты достаточно, поэтому, если вы не создаете следующий MS Office, я бы не стал беспокоиться. Люди - параноики о своих продуктах. Продайте это сначала и подумайте об этом позже. Да, и поскольку это не строка, ее все равно найти немного сложнее.
Просто посмотрите демонстрационные версии, которые идут с onGuard, чтобы узнать, как сделать лицензию с ограниченным сроком действия. Однако имейте в виду, что простое манипулирование компьютерными часами будет достаточно, чтобы обмануть его. На мой взгляд, лучшее пробное программное обеспечение таково, что ему не хватает какой-то жизненно важной функции (кнопка сохранения...). Хорошее время испытаний очень трудно сделать по моему мнению.
3) Вы должны "разбросать" ключ вокруг и, возможно, каким-то образом вычислить его часть. Чем проще определить ключ, тем проще обойти защиту. Но даже сложный ключ бесполезен, если простая инструкция JMP в нужном месте обойдет всю проверку защиты. Эти проверки также должны быть более одного, и опять же, разбросаны вокруг.
4) Будьте осторожны с такими лицензиями - обычно пользователям они не нравятся, если только ежегодная плата не означает также некоторую предполагаемую стоимость (т. Е. Антивирус дает вам обновленные подписи или обновленные карты приложения GPS). Простое принуждение пользователей к ежегодной оплате может выглядеть хорошо для вас, но не для пользователей, даже если вы добавляете новые функции, которые они могут не считать полезными. Если приложение перестает работать, это еще хуже. Это одна из проблем, которая убила многие приложения Unix, когда стали доступны приложения Windows с такими же функциями, но без ежегодных сборов. Я знаю, что многие компании думают вернуться к этой модели - если она будет успешной, еще предстоит увидеть.
Я использую 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, но только для корпоративного программного обеспечения, где пиратство не является такой проблемой. Если вы продаете потребительское программное обеспечение и беспокоитесь о пиратстве, я бы порекомендовал более надежное решение, такое как коммерческая библиотека защиты от копирования, которая шифрует исполняемый файл.
Даже тогда вы можете замедлить крекеры, но не можете их остановить.