首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OnGuard授权

使用OnGuard授权
EN

Stack Overflow用户
提问于 2010-12-03 19:29:53
回答 3查看 3.8K关注 0票数 2

最近,我研究了如何使用OnGuard来帮助诚实的人遵守他们的原则。我同意这里许多人所表达的观点,即没有任何许可制度会保护你免受那些想要使用你的软件而不想为此付费的人的伤害。另一方面,我想避免太容易让别人为我的程序创建有效的密钥。

在研究了手册和示例之后,我在我的主要表单代码中添加了以下内容:

代码语言:javascript
复制
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. 我的程序将需要(至少)年度更新,我的计划是授权它每年订阅。在我的程序中添加年份作为常量,并在几个地方测试过时的用户条目,这样会更强吗?

这里有四个问题是密切相关和相当具体的。似乎问那些在四个单独的条目,并必须添加引用的上下文,但我会很高兴这样做,如果这将是可取的。谢谢你的帮助。

杰克

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-04 08:23:08

代码语言:javascript
复制
  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附带的时间试用演示,就可以知道如何做有时间限制的许可。然而,请注意,只要简单地操作计算机时钟就足以愚弄它。在我看来,最好的试用软件是这样的,这是缺乏一些重要的功能(保存按钮.)。在我看来,好时机的考验是很难进行的。
票数 2
EN

Stack Overflow用户

发布于 2010-12-04 08:47:52

我使用的是较低级别的OnGuard API,而不是运行程序建议的类。不管哪种方法都能正常工作,类最终还是会调用较低级别的API。下面是这些低级API方法的包装实用程序函数。

代码语言:javascript
复制
{ 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。

即使如此,你也可以放慢饼干的速度,但你阻止不了它们。

票数 2
EN

Stack Overflow用户

发布于 2010-12-04 22:18:20

3)你应该把钥匙“散开”,也许可以用某种方法计算出其中的一部分。识别密钥越简单,当然越容易绕过保护。但即使是一个复杂的密钥是无用的,如果一个简单的JMP指令在适当的地方将绕过整个保护检查。这些支票也应该不止一张,再一次,到处都是。

4)小心这类许可证--通常用户不喜欢它们,除非年费也意味着某种感知的价值(即防病毒会给您更新签名,或者GPS应用程序更新地图)。仅仅强迫用户每年付费可能对你有好处,但对用户却没有好处,即使你添加了他们认为没有用的新功能。如果应用程序停止工作,情况就更糟了。当Windows应用程序具有相同的特性,但不需要支付年费时,这就是杀死许多Unix应用程序的原因之一。我知道,许多公司都在考虑回归这一模式--如果它能成功的话,还有待观察。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4349165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档