2

最近、正直な人が自分の原則を守るのを助ける方法として、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. Key はここで定数として設定されます。連続したバイトとしてコードに表示され、簡単にコピーできませんか?

  4. 私のプログラムでは、(少なくとも) 毎年の更新が必要であり、私の計画では、年間サブスクリプションでライセンスを取得する予定です。私のプログラムに年を定数として追加し、いくつかの場所でその年に対して日付の付いたユーザーエントリをテストする方が強力でしょうか.

ここには、密接に関連し、かなり具体的な 4 つの質問があります。それらを 4 つの別々の項目に分けて質問し、コンテキストの参照を追加する必要があるのは、より厄介なように思えましたが、それが望ましい場合は喜んでそうします。ご協力ありがとうございました。

ジャック

4

3 に答える 3

2
  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 に付属のタイム トライアル デモを見て、期間限定ライセンスの使用方法を確認してください。ただし、コンピュータの時計を単純に操作するだけで十分だまされることに注意してください。私の意見では、最高の試用版ソフトウェアは、いくつかの重要な機能 (保存ボタン...) が欠けているものです。私の意見では、良いタイムトライアルを行うのは非常に難しいです。

于 2010-12-04T08:23:08.603 に答える
2

3)キーを「分散」させ、おそらくその一部を何らかの方法で計算する必要があります。キーの識別が簡単になればなるほど、もちろん保護のバイパスも簡単になります。しかし、適切な場所にある単純な JMP 命令が保護チェック全体をバイパスする場合、複雑なキーでさえ役に立ちません。これらの小切手も複数ある必要があり、繰り返しになりますが、散らばっています。

4) この種のライセンスには注意してください。通常、年会費が何らかの認識価値を意味しない限り、ユーザーは好まないものです (つまり、ウイルス対策ソフトウェアで署名を更新したり、GPS アプリケーションで地図を更新したりします)。ユーザーに年払いを強制するだけでも、あなたにとっては良いように見えるかもしれませんが、ユーザーにとってはそうではありません。アプリケーションが動作を停止した場合はさらに悪化します。これは、同じ機能を備えた年会費のない Windows アプリケーションが利用可能になったときに、多くの Unix アプリケーションを停止させた問題の 1 つです。多くの企業がそのモデルに戻ることを考えていることは知っていますが、それが成功するかどうかはまだ分かりません。

于 2010-12-04T22:18:20.597 に答える
2

Runner が提案するクラスではなく、低レベルの 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-04T08:47:52.367 に答える