5

可能であれば、動的にロードされた .net アセンブリ (ファイルではなくバイト配列からロードされた) をディスク上のファイル (exe/dll に応じて) に保存する方法を知りたいです。アセンブリ) であり、直接使用できます (つまり、exe の場合、すべての exe ヘッダーが含まれ、実行可能または少なくとも「反射可能」になります)。

また、ロードされたアセンブリは、実際にファイルに表示されるのとまったく同じようにメモリに保存されますか、つまり、すべての PE EXE ヘッダー、リソースなど、つまり、本質的にメモリ内の exe/dll ファイルですか、それとも別の方法でメモリに保存されますか?メモリの一部の領域を dll/exe .net アセンブリとして保存できますか? つまり、画像からの類推を使用できる場合: jpeg ファイルをビットマップとしてメモリにロードできます。メモリ内の画像を表す実際のバイトは、jpeg ファイルを表す実際のバイトとはまったく異なります。アセンブリのロードと同じですか?

最後に、プロセスのメモリ内でアセンブリが実際に配置されている場所へのメモリ アドレス (ポインタ) を取得するにはどうすればよいですか?

明確にするために、Assembly.Load() を介してアセンブリが読み込まれた最初のバイト配列にアクセスすることはできません。

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

ありがとうございました。

4

1 に答える 1

1

まず、.NET では、アセンブリは物理的に異なる場所にある複数のモジュールで構成できます。したがって、モジュールをアセンブリに保存することしかできません。ほとんどの場合、メインモジュールのみが必要なので、それAssembly.ManifestModuleを入手するために使用できます。

Marshal.GetHINSTANCEこの記事によると、モジュールのベースアドレスであるモジュールのHINSTANCEを返します。MSDN のコメントにはメモリ内モジュールには HINSTANCE がないと記載されていますが、このメソッドはメモリ内モジュールのベース アドレスを返すようです。

これで、モジュールのベースアドレスが得られました。次に行うことは、モジュールのサイズを決定することです。これを行う最も簡単な方法は、PE ファイルのセクション ヘッダーを解析することです。例えば:

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

この場合、モジュールのサイズは、最大 Raw アドレスに対応する Raw サイズ (0x2A00) を加えたものになります。

于 2012-07-13T06:36:55.290 に答える