102

システムにバイナリがインストールされており、特定の関数の逆アセンブルを確認したいと考えています。を使用することをお勧めしobjdumpますが、他の解決策も受け入れられます。

この質問から、境界アドレスさえわかれば、コードの一部を逆アセンブルできる可能性があることがわかりました。この回答から、分割されたデバッグ シンボルを 1 つのファイルに戻す方法を学びました。

しかし、その単一のファイルを操作し、すべてのコードを逆アセンブルしても (つまり、開始アドレスまたは停止アドレスはなく、単純な-dパラメーターを にobjdump)、そのシンボルはどこにも表示されません。問題の関数が静的である限り、これは理にかなっているため、エクスポートされません。それにもかかわらず、valgrind関数名を報告するため、どこかに保存する必要があります。

デバッグ セクションの詳細を見ると、その名前が.debug_strセクションに記載されていますが、これをアドレス範囲に変換できるツールがわかりません。

4

10 に答える 10

95

最も簡単な方法として gdb を使用することをお勧めします。次のように、ワンライナーとして実行することもできます。

gdb -batch -ex 'file /bin/ls' -ex 'disassemble main'
于 2014-04-01T01:47:57.543 に答える
4

これは、gdb ソリューションと同じように機能します (オフセットをゼロにシフトするという点で) が、ラグがない点が異なります (私の PC では約 5 ミリ秒でジョブが完了しますが、gdb ソリューションは約 150 ミリ秒かかります)。

objdump_func:

#!/bin/sh
# $1 -- function name; rest -- object files
fn=$1; shift 1
exec objdump -d "$@" | 
awk " /^[[:xdigit:]].*<$fn>/,/^\$/ { print \$0 }" |
awk -F: -F' '  'NR==1 {  offset=strtonum("0x"$1); print $0; } 
                NR!=1 {  split($0,a,":"); rhs=a[2]; n=strtonum("0x"$1); $1=sprintf("%x", n-offset); printf "%4s:%s\n", $1,rhs }'
于 2016-08-07T16:23:42.277 に答える
0

使うだけobjdump -d filename | awk '/<funcname>/,/^$/'

于 2021-11-22T14:43:12.850 に答える