他の人が自分の .Net アセンブリを使用できないようにするにはどうすればよいですか?
-
01-07-2019 - |
質問
必要なアセンブリがあります ない 指定された実行可能ファイル以外のアプリケーションで使用することはできません。そのための指示をいくつか教えてください。
解決
アセンブリと実行可能ファイルに同じキーで署名し、保護するクラスのコンストラクターにチェックを入れることができます。
public class NotForAnyoneElse {
public NotForAnyoneElse() {
if (typeof(NotForAnyoneElse).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName().GetPublicKeyToken()) {
throw new SomeException(...);
}
}
}
他のヒント
.Net 2.0 以降では、すべてを内部化し、フレンド アセンブリを使用します。
http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
これでは反省が止まりません。以下にいくつかの情報を取り入れたいと思います。どうしても誰かの電話を阻止する必要がある場合、おそらく最良の解決策は次のとおりです。
- .exe と .dll を ILMerge する
- 最後の.exeを難読化する
また、呼び出しスタックをチェックして各呼び出し元のアセンブリを取得し、それらがすべてアセンブリと同じキーで署名されていることを確認することもできます。
いくつかのフープを飛び越えることなしには、100%完全に不可能です。
.NET を使用する利点の 1 つは、リフレクションを使用できることです。つまり、アセンブリをロードして検査し、メソッドを動的に呼び出すことができます。これにより、VB.NET と F# の間の相互運用が可能になります。
ただし、コードはマネージド アセンブリ内にあるため、次のことを意味します。 誰でもコードに参照を追加してそのパブリック メソッドを呼び出すことも、リフレクションを使用してコードをロードしてプライベート メソッドを呼び出すこともできます。. 。コードを「難読化」したとしても、ユーザーは依然としてリフレクションを使用してコードを呼び出すことができます。ただし、名前はすべてマスクされるため、何をするにも困難を伴います。
他の人が実行できないように .NET コードを配布する必要がある場合は、バイナリを NGEN (x86 にコンパイル) して、それらのバイナリを配布できる可能性があります。
あなたの状況の詳細はわかりませんが、難読化は十分であるはずです。
を使用することも検討できます ネッツ 実行可能なパッカーとコンプレッサー。
これにより、アセンブリと .exe ファイルが取得され、それらが 1 つの実行可能ファイルにパックされるため、少し調べなければ外部からは見えなくなります。
私の推測では、これはほとんどの .net プログラマのアクセスを防ぐのに十分だと思います。
.netz アプローチの大きな利点は、コードを変更する必要がないことです。もう 1 つの利点は、インストール プロセスが非常に簡素化されることです。
すべてを内部スコープにしてから使用できるはずです。 内部の可視先 その 1 つのアセンブリのみに内部メソッドへのアクセスを許可する属性。
@ するコード アクセス セキュリティ属性チャールズ・グラハム 言及は StrongNameIdentityPermissionAttribute
一部の人が言及したように、InternalsVisibleTo 属性を使用して、すべてを内部としてマークします。もちろん、これは反射を防ぐものではありません。
言及されていないことの 1 つは、 イルマージ アセンブリをメインの .exe/.dll/何でもに追加すると、参入障壁が少し上がります (アセンブリが参照を求めて単独で放置されているのを見ることができなくなります) が、リフレクション ルートは停止されません。 。
アップデート:また、IIRC ilmerge には、マージされたアセンブリを自動的に内部化できる機能があり、InternalsVisibleTo を使用する必要がまったくありません。
これが利用可能な方法であるかどうかはわかりませんが、おそらく、WCF または ASP.NET Web サービスを使用してアセンブリをホストし、ある種の認証スキーム (LDAP、公開/プライベート キー ペアなど) を使用して、許可されたクライアントのみが接続します。これにより、アセンブリが物理的に他人の手に届かなくなり、誰が接続するかを制御できるようになります。ちょっとした考え。
これは、アセンブリのコード アクセス セキュリティ ポリシーで設定できる場合があります。
難読化を使用できます。
それは次のようになります:
int MySecretPrimeDetectionAlgorithm(int lastPrimeNumber);
次のような判読できないものになります。
int Asdfasdfasdfasdfasdfasdfasdf(int qwerqwerqwerqwerqwerqwer);
他のユーザーは引き続きあなたのアセンブリを使用できますが、合理的なものにするのは困難になります。
保護ツールまたは難読化ツールを探しているようですね。特効薬はありませんが、私が推奨する保護ツールは次のとおりです。 スマートアセンブリ. 。いくつかの代替案は、 サラマンダー難読化装置, ドフスカーター, 、 そして ゼノコード.
残念ながら、自分のバイトを誰かに読んでもらうと...十分な時間と労力があれば、コードをロードして呼び出す方法を見つけることができます。コメントに先回りして答えるには、次のように質問することがよくあります。Salamander はコードが Reflector ツールに直接読み込まれるのを防ぎますが、私はもっと良い方法をとりました (例:より信頼性の高い) スマートアセンブリのエクスペリエンス。
お役に立てれば。:)
たとえば、アセンブリが Web サービスの場合、指定された実行可能ファイルが SOAP メッセージでシークレット値を渡すことを確認できます。
関数呼び出しを使用してパスコードを送信するように要求するだけで、それが承認されていない場合は、.setAuthorizeCode('123456') のように何も機能せず、使用できるすべての場所で authorizeCode != 123456 かどうかをチェックします。その後、エラーをスローするか、単に終了します...再利用性に関しては良い答えとは思えませんが、まさにそれが重要なのです。
これを使用できるのは、ユーザーがプログラムに承認コードをハードコーディングするときだけです。
ちょっと考えただけで、あなたが探しているもの、あるいはより良いものへのインスピレーションが得られるかもしれません。