4

I have a test assembly and I want to find method in file

[CompilerGenerated]
public bool get_CreateFlash()
{
    return this.cZBH;
}

I use hex editor and template to search

2B * 26 16 02 7B * * * * 0A 2B * 06 2A

where * is any byte because I do not see exact bytes in tools like ILSpy.

I have found 1500 matches, naturally, it is getter. The different is in 7B * * * *, like this

"2B 02 26 16 02 7B 1D 00 00 04 0A 2B 00 06 2A"
"2B 02 26 16 02 7B 1E 00 00 04 0A 2B 00 06 2A"
...
etc.

How can I find what I need?

4

1 に答える 1

9

ILDasm (.NET Framework SDK の一部) を使用すると、対応するコード バイトが表示されます。

それらを表示するには、メソッドを表示する前に、View -> Show Bytes を選択する必要があります。これをテストするために小さなサンプル アプリケーションを作成したところ、次の結果が得られました。

ILDASM での単純なプロパティ ゲッターの逆アセンブル

このデータを使用するには、「|」の左側のバイトが .dll/.exe では順番に表示され、右側はリトルエンディアンでエンコードされています。これを念頭に置いて、次の .exe を検索しました (リトルエンディアン順のバイトを強調表示していることに注意してください)。

00 02 7b 03 00 00 04 0a 2b 00 06 2a

私の (小さいながらも) テスト実行可能ファイルでは、この一連のバイトは 1 回しか発生しませんでした。

上のスクリーンショットでは、メソッド RVA (相対仮想アドレス) も示されていることに注意してください。これをファイルの場所に変換するには、実行可能ファイルのレイアウトを決定する必要があります。利用可能な PE ツールは多数ありますが、私dumpbinは Visual Studio に付属するものを使用して PE ヘッダーを表示しました ( dumpbin /headers <your exe name>)。この実行可能ファイルの関連データ:

セクション ヘッダー #1
   .テキスト名
    1824 仮想サイズ
    2000 仮想アドレス (00402000 ~ 00403823)
    1A00 サイズの生データ
     200 生データへのファイルポインタ (00000200 ~ 00001BFF)
       0 再配置テーブルへのファイル ポインタ
       0 行番号へのファイルポインタ
       移転回数0回
       0 行番号
60000020 フラグ
         コード
         読み取り実行

ここで、.textセクションの仮想アドレスは 0x2000 として示され、仮想サイズは 0x1824 バイトです。メソッドには 0x2464 の RVA があるため、このセクション内に存在する必要があります。からの出力の「生データへのファイル ポインター」は、dumpbinメソッドを含むセクションが実行可能ファイルの 0x200 で始まることを示しているため、実行可能ファイルのメソッドのオフセットを次のように計算できます。

(メソッド RVA - セクション RVA) + ファイルの場所
= (0x2464 - 0x2000) + 0x200
= 0x664

テスト実行可能ファイルの位置 0x664 に移動すると、探していたバイトが実際にそこに表示されます (正確にはこの位置ではありませんが、IL バイトの前に小さなメソッド ヘッダーがあるため、その数バイト後にあります)。

于 2012-07-02T08:26:43.550 に答える