2012-06-19 20 views
5

アセンブリが特定のクラスを参照しているかどうかを調べることができるかどうか不思議です。私は現在、アセンブリをロードし、その後、私はアセンブリが、私はロードしていますアセンブリ内から参照されているかを判断するためにリフレクションを使用しています。今、私はアセンブリが参照されているものを知っていることを、私はそれらのvReferencedAssembly掘り下げたいクラスが参照されているかどうかを調べるC#

foreach (var vReferencedAssembly in vSomeAssembly.GetReferencedAssemblies()) 

をし、このようなものが発生したかどうかを判断:簡単な英語で

File.Create(vSomeFile); 

を、私は私が脅威と考えるもの含むことが私に与えリストからアセンブリをロードする必要はありません。だから私はファイルなどを操作する可能性のあるものをブロックしたいかもしれません。

+0

これは動的である必要がありますか?静的だった場合は、逆アセンブラを使用して、参照されているアセンブリとそれが何を呼び出すかを見ることができます。 – Josh

+0

私はそれが可能ならばダイナミックであることを好むと思います。最も良い方法は、逆アセンブラを使用することです。 – Tada

答えて

2

あなたが探しているのは、反射のみのコンテキストにアセンブリを読み込むことです。これにより、コードを検査した後でなければ、コードが実行されない安全な領域にロードすることができます。

参照:http://msdn.microsoft.com/en-us/library/ms172331.aspx

更新:あなたはタイプを返し、変数、プロパティ、パラメータ、のようなものを見てリフレクションを使用することができますが、それはまだあなたが完全に法内部に含まれます悪意のあるコードを検出するのに役立ちません。 。安全なコードと安全でないコードの区別は、システム管理者に任せておくことをお勧めします。これらのアプリケーションは、PC上の安全な場所と暗黙の信頼関係を持ちます。 IE:グローバルアセンブリキャッシュ、現在の作業ディレクトリ、またはアプリケーションによって決まる固定パス。 PCは管理者にこの場所にあるアセンブリを管理する権限しか与えません。

更新2:この潜在的に危険なコードを独自のアプリケーションドメインで実行することも考えられます。ここでは、許可されるものとされないものを設定できます。 http://msdn.microsoft.com/en-us/library/bb763046.aspxを参照してください。

Update 3:適切な権限を持つ独自のアプリケーションドメイン内に信頼できないコードをロードすることは最もクリーンなアプローチですが、このquestionによって尋ねられたように、実行時に内部的に参照するメソッドを特定することは可能です。その要点は、メソッド(MethodBody.GetILAsByteArray)の生のILバイトを取得するためにリフレクションを使用し、ILパーサーの中から選択して解析することです。

+0

これが私が探しているものかどうかはわかりません。特定のクラスが参照または呼び出されているかどうかを決定するためにアセンブリを検査するにはどうすればよいでしょうか?例: mscorlib(mscorlib.dll)にFile.Createが含まれていることは知っていますが、実際に読み込んだアセンブリが実際にFile.Createを参照しているわけではありません。それをどうやって決めることができますか?もしすべてであれば... – Tada

+0

メソッドのパラメータや戻り値で使われているクラスをリフレクションが識別できるように見えますが、メソッドの実際の本体の中で参照されていれば、それを見つけることはできません... – Tada

関連する問題