最近,我研究了如何使用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;这就引出了一些问题:
这里有四个问题是密切相关和相当具体的。似乎问那些在四个单独的条目,并必须添加引用的上下文,但我会很高兴这样做,如果这将是可取的。谢谢你的帮助。
杰克
发布于 2010-12-04 08:23:08
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;发布于 2010-12-04 08:47:52
我使用的是较低级别的OnGuard API,而不是运行程序建议的类。不管哪种方法都能正常工作,类最终还是会调用较低级别的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,但只对盗版不是问题的企业软件使用。如果你在销售消费者软件,担心盗版,我会推荐一个更强大的解决方案,比如一个商业的拷贝保护库来加密这个exe。
即使如此,你也可以放慢饼干的速度,但你阻止不了它们。
发布于 2010-12-04 22:18:20
3)你应该把钥匙“散开”,也许可以用某种方法计算出其中的一部分。识别密钥越简单,当然越容易绕过保护。但即使是一个复杂的密钥是无用的,如果一个简单的JMP指令在适当的地方将绕过整个保护检查。这些支票也应该不止一张,再一次,到处都是。
4)小心这类许可证--通常用户不喜欢它们,除非年费也意味着某种感知的价值(即防病毒会给您更新签名,或者GPS应用程序更新地图)。仅仅强迫用户每年付费可能对你有好处,但对用户却没有好处,即使你添加了他们认为没有用的新功能。如果应用程序停止工作,情况就更糟了。当Windows应用程序具有相同的特性,但不需要支付年费时,这就是杀死许多Unix应用程序的原因之一。我知道,许多公司都在考虑回归这一模式--如果它能成功的话,还有待观察。
https://stackoverflow.com/questions/4349165
复制相似问题