Radare2が関数を分析するとき、local_4h
のebp - 0x4
などのローカル変数名を与えます。また、目的が明確になったときに、これらの変数にもっと意味のある名前を付ける機能も提供します。ただし、変数の名前が変更された後は、それらを印刷することがより困難になります。 mov eax, dword [ebp - i]
のような指示を見たとき、私はしなければなりません
var int i @ ebp-0xc
の行を見つけます。pxw @ebp-0xc
i
の値を読み取りますlotの作業ではありませんが、多くの変数を含む多くのアセンブリを調べていると、すぐに面倒になります。
フォローアップの質問として、GDBのdisplay
コマンドのように、実行がブレークポイントで停止するたびに変数/場所を出力することは可能ですか?
pxw @ local_4h
の代わりに、afvd
(a nalyze f unction v ariables d isplay)、すべてまたは特定の変数を一覧表示します。
[0x00400526]> afvd
var local_14h = 0x7fff2eab16ac 0x2eab17a000000001 ........
var local_20h = 0x7fff2eab16a0 0x00007fff2eab17a8 ........ @rsp rsi stack R W 0x7fff2eab21ec --> stack R W 0x74756f2e612f2e (./a.out) --> ascii
var local_8h = 0x7fff2eab16b8 0x0000000000000041 A....... ascii
var local_4h = 0x7fff2eab16bc 0x0040057000000000 ....p.@.
[0x00400526]> .afvd local_14h # note the dot
var local_14h = 0x7fff2eab16ac 0x2eab17a000000001 ........
afvd name
は、変数 'name'を表示するr2コマンドを返します。先頭のドットがコマンドを実行します。
いつでも?
コマンドを使用してヘルプを取得できることを忘れないでください。
[0x00400526]> afv?
|Usage: afv[rbs]
| afvr[?] manipulate register based arguments
| afvb[?] manipulate bp based arguments/locals
| afvs[?] manipulate sp based arguments/locals
| afvR [varname] list addresses where vars are accessed
| afvW [varname] list addresses where vars are accessed
| afva analyze function arguments/locals
| afvd name output r2 command for displaying the value of args/locals in the debugger
| afvn [old_name] [new_name] rename argument/local
| afvt [name] [new_type] change type for given argument/local
| afv-([name]) remove all or given var
実際には、質問と同じ構文を(ほぼ)使用する可能性もあります。ただし、変数名は事前にフラグとして追加する必要があり、これは関数を入力するたびに行う必要があります。
[0x00400526]> .afv*
[0x00400526]> pxw @ fcnvar.local_14h
0x7fff2eab16ac 0x00000001 0x2eab17a0 [omitted]