免責事項:以下のすべては、教育と研究の目的だけでなく、ハッキングに対する保護のメカニズムを理解するためにのみ書かれています。 著者は、この情報を使用してプログラムをクラックすることを決して推奨しません。この記事では、.NETプログラムをハッキングする3つ半の基本的な方法についてお話したいと思います。私が追求している目標は、開発者がプログラムの保護メカニズムをよりよく理解できるようにすることです。 最も明白な脅威を見つけて、適切な手段を講じる(またはしない)。
詳細には触れず、洗練されたハッキングツールは使用しません。 すべてが「ダミー用」に塗装されます。 すべてのツールはシンプルで、簡単にアクセスでき、無料です。 そして主なものは、.NET用プログラムの逆コンパイラーである
Reflectorです 。

モルモットとして、
Expresso-正規表現アナライザーを選びました。 このプログラムは無料で、ライセンスはハッキングについて何も示していないように見えますが、登録なしでは60日間しか動作しません。 言い換えれば、このプログラムのハッキングによる被害は最小限であり、さらにその内部構造はトレーニングに非常に適しています。 このプログラムの作者が私に腹を立てないことを願っています。
まず、このフレームワークの開発に慣れていない人向けの.NETプログラムの構造に関する短い教育プログラム:.NET言語(C#、Visual Basic、F#、Delphi.NET)で記述されたすべてのコードは、通常と呼ばれる特別な中間言語にコンパイルされますILまたは
MSIL これはアセンブラーのようなもので、非常にスマートで非常に強力な命令を備えています。 そして、これは、原則として、C#と同じピア言語であり、構文のみが悪化しています(そして、より多くの可能性があります)。 さらに、.NETプログラムはメタデータを積極的に使用します。 クラス、メソッド、プロパティ、属性、その他すべてに関するすべての情報は、実行可能ファイルに保存されます。
つまり 実際、この場合、プログラムの逆コンパイルはあまり良い概念ではありません。 それはすべてオープンな形式であり、リフレクターの形式のツールは、MSILコンストラクトを対応するC#または他の言語のコンストラクトにもたらし、コードの可読性を高めます。
ハッキングに移りましょう。
0.トライアルをリセット
実際には、これはハックではなく、非アクティブなプログラムの使用期間を延長するための半合法的な方法です。 それは、最初の起動の日付が保存され、変更/破壊される場所があるという事実にあります。 その後、次の期限までプログラムを使用できます。
実験用反射板を見てみましょう。
コードを少し見て回ると、MainFormコンストラクターに興味深い行が見つかります

レジストリエディターを開き、HKEY_CURRENT_USER \ Software \ Ultrapico \ Expressoに移動して、次のキーを確認します。

それらを削除して、さらに60日間の作業を行います。
もちろん、このオプションはシンプルで明白ですが、さらに複雑な場合は、リフレクターで情報が書き込まれているすべての場所を見つけてそれらをクリーンアップするのに少し時間がかかります。
秘密の場所にデータを書き込もうとする開発者へのアドバイス:慎重に書きます。そうしないと、何らかの理由でこの場所を持たない、または十分な権限を持たない一般ユーザーにとってすべてが問題になります。
1. keygenを書く
開発者にとって最も恐ろしいオプションであり、エンドユーザーにとって最も快適なオプションです。 プログラムはそれ自体がライセンスされていると見なし、ひどいジェスチャーを行う必要はありません。
リフレクターを開き、ライセンスまたは登録を含むクラスのコードを探します。

名前と名前でコードを入力すると、特定のハッシュが計算され、コードと比較されます。

このハッシュは、DESとあらゆる種類のプレフィックスを使用します。

バイトは、このメソッドを使用して文字列に変換されます。
これですべてがわかったので、IDEを開いて必要なコードをすべてコピーします(または自分で実装します)。 Prefix、Suffix、およびMyDES実装パラメーターの値が何であるかを知ることだけが残っています。 私はそれらを与えません、これらはすでに技術的な詳細です。
その結果、任意の名前のキーが生成され、以下が表示されます。

ビンゴ!
keygenに対する保護は簡単で明白です。何らかの形で非対称暗号化を使用します。 つまり 秘密鍵を知らずにコードを生成することを不可能にします。この鍵はプログラムの作成者である1か所にしかありません。
2.ラッパーの使用
ライセンスの正確さを確認することは、非常に面倒なビジネスであり、高速ではありません。 したがって、プログラム開発者は通常、ライセンスを1回確認してから、受信したチェックボックスを使用します-有効/無効(オプションとして、機能の異なる複数のタイプのライセンスが許可されている場合の有効性)。 ここでは、次のアルゴリズムを使用して再生できます。
- ライセンスが既に検証されていることをプログラムに伝えます
- ライセンスが正しいことをプログラムに伝える
どうやってやるの? 最初に実行可能ファイルにメタデータが存在することについては既に述べましたが、これを使用します。 プログラムの起動方法とライセンスの確認方法を見てみましょう。


起動時には、何もおもしろいものはありませんが、プログラムが既に登録されている場合、すべてが正常であると考えられ、ライセンスの正当性を判断するためのさらなる作業を行わないことを確認します。
これを活用してください。
新しいプロジェクトを作成し、Expresso.exeにReferenceを追加して、自分で実行してみましょう。

何が起こったのか見てみましょう:

さて、誰がそれを疑うでしょう。
この場合、すべてが単純であることが判明しましたが、プログラムの作成者がパブリックプロパティをプライベートプロパティに置き換えた場合、アクセスにReflectionを使用するだけで、すべて元のタスクになります。
これから自分を守る方法は明確だと思います-定期的にライセンスを確認し、プログラムが実行されている環境を見て、目的の変数を設定できないようにします。
しかし、これらすべての保護は、攻撃者が使用するという事実につながります
3.物理的なハッキングプログラム
ここではすべてがすでに深刻です。 このプログラムは完全にMSILに逆コンパイルされ、すでにそこから組み立てられています(MSILはC#?と同じ言語であることを思い出してください)。 デコンパイルには、
ildasmというSDKのユーティリティが必要です。コンパイルには、.NET Framework
ilasmのコンパイラが
必要です。
ildasmを起動し、Expresso.exeを開いて、ダンプを.ilファイルに保存します。 IsRegisteredメソッドが既に考慮されていることを確認し、コードを少し追加します(ラベルなし)。

次に、ilasmを取得し、すべてを収集します(リソースの接続を忘れずに)。
このコードの機能:登録に必要な名前を設定し(オプション)、すべてが正常であるというステータスを返します。
より明確にするために、C#のリフレクターでは次のようになります。

つまり 今ではすべてがうまくいくことは明らかです:
MSILのコードについて少し:これはレジスタのないスタックされたマシンで、すべての操作は次のように見えます:適切な量のパラメーターをスタックにポップし、適切な量のパラメーターを取得して結果を出力する関数を実行します。 その逆もまた同様です。変数の値をスタックにあるものによって設定します。 これらすべての作業をよりよく理解するには、簡単な手法をお勧めします。使い慣れた言語で小さなプログラムを作成し、コンパイルし、MSILeで何が起こったのかを確認し、言語構造を理解します。
同時に、MSILのいくつかの処理を非常にうまく行うことができます。たとえば、2つの変数を場所で入れ替えます-4本の素敵な行(C#は小さくなりますが、見苦しい)。攻撃者が犠牲にしているのは、プログラムの署名であり、現在は作成者ではなく、彼の署名です。 場合によっては、プログラムが多くのライブラリを使用する場合、これが問題になります。 その後、邪悪なハッカーはそれらをすべて分解して、すべてを再構築する必要がありますが、これを行うことができる場合、彼は
自分のキーで署名されたプログラムの独自のバージョンを持っ
ています。
実際、このすべてのさに対する保護はほとんどありません。難読化を実行するか、ネイティブコードのロジック/セキュリティチェックの一部を実行します。
おわりに
作成者が自分のプログラムを保護する努力をしなかった場合、.NETに侵入するのがどれほど簡単であるかを説明したと思います。 そして、保護を行い、それに時間とリソースを費やすかどうかを決定します。 または、単にWebシステムを作成するか、無料の限定バージョンを作成することもできます。 開発者次第です。