1

gdbを使用して小さなバイナリを理解しようとしていますが、達成する方法が見つからないことがあります。指定されたアドレスを指すジャンプのリストを見つけるにはどうすればよいですか?分解されたコードに小さな命令セットがあり、それがどこで呼び出されているのか知りたいです。.textで対応する命令を検索することを最初に考えましたが、ジャンプの種類が多く、アドレスが相対的である可能性があるため、これは機能しません。

それを行う方法はありますか?

または、このアドレスにブレークポイントを設定した場合、前の命令(この場合はジャンプ)のアドレスを知る方法はありますか?

4

1 に答える 1

0

これが他の場所から呼び出されているサブルーチンである場合、呼び出されている間、いくつかのABIを尊重する必要があります。使用するCPUに応じて、リターンアドレス(したがって、それが呼び出された場所)はどこかに(スタックまたは一部のレジスタに)格納されます。元のコードをこれを調べるコードに置き換えると、差出人住所のリストを作成できます。または、もっと簡単に言うと、gdbを使用してそのルーチンにブレークポイントを設定すると、btコマンドを使用してどこから呼び出されたかを確認できます。

そこにたどり着いたのが実際のジャンプ(「サブルーチンへのジャンプ」ではなく)の場合(longjmp / setjmpのようなものでない限り、多くの場所から呼び出された場合は疑わしいです)、おそらくどこにあるかを判断することはできません。使用しているCPUで何らかの方法で実行を追跡できない限り、これはから呼び出されました。

于 2013-02-28T08:41:53.127 に答える