2010-12-03 14 views
2

最近、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; 

これは、いくつかの質問が表示されます:

  1. は、これを使用する正しい方法のように思えるん?私はむしろ自分のコンポーネントを自分のフォームに追加しないだろう。

  2. OnGuardのソースが利用可能なため、ハッカーがキーをリバースエンジニアリングできなかったため、有効なリリースコードが選択されます。したがって、コードに追加の難読化コードを追加するか、システムを弱体化させるべきでしょうか。

  3. ここではキーが定数として設定されています。連続したバイトとしてコードに表示されず、簡単にコピーできますか?

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

ここに4つの質問がありますが、それらは密接に関連しており、非常に具体的です。それは4つの別々のエントリーでそれらを尋ねるのがもっと厄介で、文脈のための参考文献を追加しなければならないように思えましたが、それが望ましいなら私はそれをするのがうれしいでしょう。ご協力ありがとうございました。

ジャック

+2

誠実な人々は、強制がない場合でも依然として原則を守ります。それが正直なのです。 –

+1

使用しているライセンスの数を把握できないため、購入したライセンスより多くのライセンスを使用していることに注意する必要があるのは無能なものです! –

答えて

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に付属のタイムトライアルデモをご覧ください。しかし、コンピュータ時計の単純な操作だけでそれを欺くのに十分であることに注意してください。私の意見では、最善の試用版ソフトウェアはそのような、いくつかの重要な機能が不足している(ボタンを保存...)。良い時間の試練は私の意見では非常に難しいです。

+0

このような完全で徹底的な答えをありがとう。あなたが提供したコードは、OnGuardを利用しようとしている他の誰にとっても役立つはずです。私はあなたに同意しますが、このことについてあまりにも妄想になる傾向があります。ご協力いただきありがとうございます。私は今、実際に私のプログラムを販売することができることに一歩近づいています。 – jrodenhi

+0

いいえ、問題は、助けてうれしいです:) – Runner

2

私は、ランナーの提案するクラスではなく、より低いレベルの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を暗号化する商用コピープロテクションライブラリなどの強力なソリューションをお勧めします。

それでもクラッカーを遅くすることはできますが、停止することはできません。

+0

あなたのコードとあなたがそれを使用する製品についてあなたのアドバイスを含めていただきありがとうございます。私は、コンシューマーソフトウェア市場がソフトウェア保護のためのより敵対的な場所であるように思われることに同意します。私は、有効期限が切れたと思うので、あなたがそこでやっていることに従います。コードにもう一度感謝します。これは、利用可能なドキュメントの良い拡張です。私が2つの答えを受け入れるとマークすることができれば、私はあなたのものを含めるでしょう。 – jrodenhi

2

3)キーを散らばって、その一部を多少計算する必要があります。もちろん、鍵を特定するのが簡単ですが、保護をバイパスする方が簡単です。しかし、適切な場所にある単純なJMP命令が保護チェック全体をバイパスするならば、複雑なキーでさえも役に立たない。これらの小切手は1つ以上のものでなければなりません。

4)このような種類のライセンスには注意してください。年間料金がいくらかの知覚価値をも意味しない限り(通常、アンチウィルスによって更新シグネチャが提供されます)、GPSアプリケーションはマップを更新します。ユーザーに毎年払わなければならないのは、あなたにとって有益なものではないかもしれない新しい機能を追加したとしても、ユーザーのためには見えないかもしれません。アプリケーションが動作を停止する場合はさらに悪いです。それは、同じ機能を持つが、年間料金のないWindowsアプリケーションが利用可能になったとき、多くのUnixアプリケーションを殺した問題の1つです。私は、多くの企業がそのモデルに復帰しようと考えていることを知っています。成功するかどうかは未だ分かりません。

関連する問題