2

そのため、最近、C++ コードの逆アセンブリを調べており、次のように各レジスタの内容を手動で追跡する必要があります。

  95:   48 8b 16                mov    (%rsi),%rdx ; %rdx = raggedCross.sink
  98:   48 8b 42 38             mov    0x38(%rdx),%rax ; %rax = sink.table
  9c:   8b 4a 10                mov    0x10(%rdx),%ecx ; %ecx = sink.baseCol
  9f:   48 8b 70 50             mov    0x50(%rax),%rsi ; %rsi = table.starts
  a3:   89 c8                   mov    %ecx,%eax   ; %eax = baseCol
  a5:   83 c1 1c                add    $0x1c,%ecx  ; %ecx = baseCol + 1

等々。コメントは、C++ クラスのさまざまなフィールド (sink、table、baseCol、starts など) のオフセットを調べて、手作業で追加したものです。

実行するのは簡単ですが、退屈で時間がかかります。プログラムが実行するのに最適なことです。gdb は、構造体内のさまざまなフィールドのオフセットを認識しているようです: &((Table *)0x1200)->starts を実行すると、正しいアドレスが通知されます。だから、この情報は周りにあります。

この情報を使用してコードに注釈を付けることができる逆アセンブラーはありますか?

それがなければ、私は自分で書くことができました。gdb はどこでオフセットを取得しますか?

4

3 に答える 3

0

IDAProをご覧ください。プロセスを完全に自動化するわけではありませんが、少なくとも1つの場所で構造/クラスを定義でき、そこからほとんどのことを処理できます。

于 2010-06-02T17:10:28.247 に答える
0

GDB は、あなたが含めたデバッグ情報を使用してそのようなことを判断します。それは通常の実行可能ファイルの一部ではありません。DWARFは、デバッグ情報の保存に使用される一般的な形式の 1 つです。

于 2010-06-02T17:08:25.803 に答える
0

オブジェクト ファイルを確認するには、デバッグ情報 (DWARF2) を使用できます。GCC を使用しているので、binutils ユーティリティを使用して注釈付きダンプを実行できますobjdump -S。すべてのセクションをダンプすると、DWARF 情報もダンプされます。

于 2010-06-02T17:09:38.153 に答える