これは、ある時点で私たち全員が考慮しなければならない問題です。
何年にもわたって多くのアプローチを経て、私は一般的にこの声明に同意する傾向があります。「数百人以上が使用する保護されたソフトウェアについては、ひびの入ったバージョンを見つけることができます。これまでのところ、すべての保護スキームが改ざんされる可能性があります。」 あなたの雇用主は著作権侵害対策ソフトウェアの使用を強制していますか?
さらに、私がこの主題について投稿するたびに、誰かが私に思い出させます。「まず第一に、どのような種類の保護を採用する場合でも、真に専用のクラッカーは、最終的にはすべての保護障壁を通り抜けます。」 単一の開発者のためのお金のc#コード保護のための最高の価値は何ですか
したがって、これら2つの広く真の免責事項に耐えることなく、「保護」について話しましょう。
熟練したクラッカーの時間と注意を払う可能性が低い小さなアプリの場合、保護は価値のある演習だと今でも感じています。
何をしても、クラッカーがアプリケーションにパッチを適用してIFステートメント(jmp)の結果を切り替えることができれば、世界中のすべてのパスワードとドングルが役に立たないことは明らかです。
したがって、私のアプローチは、次のような製品を使用して仮想化でコードを難読化すること でした。http ://www.oreans.com/codevirtualizer.php この製品に非常に満足しています。私の知る限り、それは打ち負かされました。PEcompactを使用して実行可能ファイルを圧縮することもできます。他の誰かがそれを使用した経験がありますか?
EXEcryptor http://www.strongbit.com/news.aspに問題があっただけ で、サイトでさえ使用するのが頭痛の種です。コンパイルされたアプリは、WMI呼び出しを行うとクラッシュします。
このアプローチにより、コードの小さなセクションを難読化で囲み、セキュリティチェックなどを保護できます。
アプリケーションはサーバーからのデータを定期的に必要とするため、ユーザーがオフラインで長期間使用しても意味がないため、オンライン認証アプローチを使用します。定義上、アプリはひびが入っていても、その時点では価値がありません。
したがって、単純な暗号化されたハンドシェイクは十分に優れています。難読化保護の範囲内で時々チェックします。ユーザーがアプリを別のマシンにインストールすると、起動時に新しいIDがアップロードされ、サーバーは古いIDを無効にして、新しい認証を返します。
また、コンパイルされたアプリのハッシュを使用し、起動時に1ビットが変更されているかどうかを確認してから、アプリ内からアプリをファイルとして(読み取りLOCKを使用して)開いて、起動後に変更されないようにします。
すべての静的文字列は.exeファイルに明確に表示されるため、エラーメッセージなどを使用して一般的なものにしようとしています。「認証に失敗しました」という文字列はどこにもありません。
メモリダンプから保護するために、単純なテキスト難読化手法(すべての文字のXORなど)を使用します。これにより、メモリ内のプレーンテキストデータを変数などと区別するのが難しくなります。
そしてもちろん、本当に機密性の高いデータにはAESがあります。テキストのカウンターモードが好きです。これにより、シーケンスが繰り返されず、空白のシーケンスのような基になるデータが表示されます。
しかし、これらすべての手法で、キーまたは初期化ベクトルをメモリからダンプできる場合、またはIFステートメントをバイパスできる場合は、すべてが無駄になります。
私は条件文ではなくswitch文を使う傾向があります。次に、実際に目的のタスクを実行する関数ではなく、基本的に行き止まりの2番目の関数を作成します。
もう1つのアイデアは、変数を追加してポインターをコーディングすることです。変数は承認の結果です(通常はゼロ)。これは、ある時点で必然的にGPFにつながります。私はこれを最後の手段として使用するのは、いくつかの下位レベルの認証が失敗した後です。そうしないと、実際のユーザーがこれに遭遇する可能性があります。次に、ソフトウェアの評判が低下します。
どのようなテクニックを使用していますか?
(これは、何かを実装することのメリットを議論するスレッドではありません。何かをすることに決めた人のために設計されています)