1

アンマネージド.NETAPIを使用していて、メソッドのCILバイトコードを取得したいところまで来ました。IMetaDataImportインターフェースは、メソッド実装のRVAを提供できますが、私が見た限りでは実際のメモリ位置は提供できません。

PEヘッダーを自分で解析せずに情報を取得する方法はありますか?それほど難しいことではないことはわかっていますが、IMetaDataImportはすでにそれを行っているので、作業が重複することになります。

本当にPEヘッダーを自分で解析する必要がある場合、IMetaDataImportインスタンスで使用されるHMODULEを取得できますか、それともファイルを自分でメモリマップし、OpenScopeFromMemoryを呼び出してIMetaDataImportインスタンスを作成する必要がありますか?

4

2 に答える 2

1

前回このAPIを使用したとき、RVAを実際のアドレスにマッピングするための組み込み機能はありませんでした。そうです、ファイルを自分でメモリにマップし、セクションテーブルを解析して、RVAが含まれているセクションを見つけ、そこからベースオフセットを読み取る必要があります。次に、その値をマップされたイメージポインターに追加して、メモリマッピング内のコードが配置されている場所に到達できます。

于 2012-04-23T23:54:41.953 に答える
0

あなたが言及したAPIについてはわかりませんが、メソッド本体のRVAがあれば、ファイルまたはメモリからの読み取りは簡単です。

ファイル内の位置は、ファイルまたはメモリ内のメタデータヘッダーアドレス、そのRVA(CLRヘッダーからのフィールド)およびメソッドのRVA(#〜ストリームのMethodDefテーブルから)がわかっている場合に計算できます。

offsetFromMetadataHeader = RVAofMethod - MetadataRVA
positionInFile = offsetFromMetadataHeader - positionOfMetaDataHeader

これは私の実装で機能します。

メタデータとバイトコードは、デフォルトで同じセクション(.data)にあります。

バイトコード読み取りの実装については、githubでProject Cecilを確認することをお勧めします(最初にメソッドヘッダーを処理する必要があることに注意してください)。

于 2012-04-26T18:02:12.947 に答える