2012-05-08 6 views
2

可能であれば、それが可能かどうかを知りたい場合は、動的にロードされた.NETアセンブリを保存する(バイト(exe/dllはアセンブリによって異なります)、直接使用することができます(exeの場合、すべてのexeヘッダーが含まれ、実行可能または少なくとも "反映可能"になります)。管理された.NETアセンブリをメモリからEXE/DLLファイルとして保存する方法

また、ロードされたアセンブリは実際にはファイルに表示されている通りに正確にメモリに格納されます。つまり、PE EXEヘッダ、リソースなど、つまりexe/dllファイルがメモリに格納されます。そのため、dll/exe .netアセンブリとしてメモリの一部の領域を節約することはできません。つまり、画像から類推を使うことができます:jpegファイルをメモリにビットマップとしてロードすることができます。メモリ内のイメージを表す実際のバイトは、jpegファイルを表す実際のバイトとはかなり異なります。アセンブリの読み込みと同じですか?

最後に、アセンブリの実際の位置がどのようにメモリのアドレス(ポインタ)を取得するのですか?

私はAssembly.Load()でアセンブリがロードされた最初のバイト配列にアクセスできません。

ここにはrelated questionがありますが、メモリからディスク上のファイルにバイト配列を介してロードされたアセンブリをダンプする方法があるかどうかは不明です。

ありがとうございます。

+0

バイト配列をストリームとしてキャストし、ディスクに保存するだけです。それらはファイルごとにメモリに格納されます。はいといいえ。 ILは1つ1つですが、一度JITtedされていますが、これは.netフレームワークのすべてです。実際に何をしようとしていますか? –

+0

おそらく私はそれをはっきりと説明しなかったでしょう。私はバイト配列にアクセスできません。それは全体のポイントです。私が持っているのは、いくつかのプロセスのメモリにロードされているマンテッドアセンブリです。そのアセンブリがバイト配列からロードされている(つまり、ディスク上の対応するファイルが存在しない)ことがわかっていますので、質問は次のとおりです。 2)そのメモリは、exe/dllファイルに格納されるものと1対1で対応していますか?3)どのように保存しますか? –

+0

決してそれを試みたことはありません。 Assemblyには、GetObjectDataメソッドがあります。このメソッドは、アセンブリを再作成するために必要なすべての情報のシリアル化を返します。コードベースのようなものについて考えましたか?あなたが持っているアセンブリと保存してからディスクからロードするアセンブリが異なるソースを持っているので、正確な機能の一致であってもフレームワークはそれらを異なるものとしてマークします。私。あなたはそれらの両方を同時にロードすることができます... –

答えて

0

まず、.NETでは、アセンブリは物理的に異なる場所にある複数のモジュールで構成できます。したがって、モジュールをアセンブリに保存することは可能です。ほとんどの場合、メインモジュールのみが必要になりますので、Assembly.ManifestModuleを使用して取得してください。

Marshal.GetHINSTANCEは、thisの記事に従ってモジュールのベースアドレスであるモジュールのHINSTANCEを返します。 MSDNの状態ではメモリ内モジュールにはHINSTANCEはありませんが、メモリ内モジュールのベースアドレスが返されるようです。

これでモジュールのベースアドレスが得られました。次に行うことは、モジュールのサイズを決定することです。これを行う最も簡単な方法は、PEファイルのSection Headersを解析することです。例えばこの場合

Name | Raw Size | Raw Address 
.text | 0x2000 | 0x400 
.rsrc | 0x400 | 0x2400 
.reloc | 0x200 | 0x2800 

、モジュールのサイズが最大ローアドレスと対応する生サイズであり、それは0x2A00です。

関連する問題