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