radare2 可以按名称打印局部变量吗?
Can radare2 print local variables by name?
当radare2分析一个函数时,它给出了局部变量名称,例如local_4h
for ebp - 0x4
。当它们的目的变得明确时,它还提供了为这些变量赋予更有意义的名称的能力。但是,在重命名变量后,打印它们变得更加困难。当我看到诸如 mov eax, dword [ebp - i]
之类的指令时,我必须
- 查看反汇编的顶部以找到行
var int i @ ebp-0xc
- 类型
pxw @ebp-0xc
- 从输出的 16(!) 行的第一行中读取
i
的值
- 从上一个命令转移后,在反汇编中重新找到我的位置
这不是一项 很多 的工作,但是当我查看大量包含许多变量的程序集时,它很快就会变得乏味。
作为后续问题,每次执行在断点处停止时是否可以打印 variable/location,就像 GDB 的 display
命令一样?
而不是pxw @ local_4h
,有afvd
(analyze function variables display),其中列出了每个或特定变量:
[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
returns r2命令显示变量'name'。开头的点执行命令。
请记住,您始终可以使用 ?
命令获取帮助:
[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]
当radare2分析一个函数时,它给出了局部变量名称,例如local_4h
for ebp - 0x4
。当它们的目的变得明确时,它还提供了为这些变量赋予更有意义的名称的能力。但是,在重命名变量后,打印它们变得更加困难。当我看到诸如 mov eax, dword [ebp - i]
之类的指令时,我必须
- 查看反汇编的顶部以找到行
var int i @ ebp-0xc
- 类型
pxw @ebp-0xc
- 从输出的 16(!) 行的第一行中读取
i
的值 - 从上一个命令转移后,在反汇编中重新找到我的位置
这不是一项 很多 的工作,但是当我查看大量包含许多变量的程序集时,它很快就会变得乏味。
作为后续问题,每次执行在断点处停止时是否可以打印 variable/location,就像 GDB 的 display
命令一样?
而不是pxw @ local_4h
,有afvd
(analyze function variables display),其中列出了每个或特定变量:
[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
returns r2命令显示变量'name'。开头的点执行命令。
请记住,您始终可以使用 ?
命令获取帮助:
[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]