radare2能否按名称打印本地变量?

15
当radare2分析函数时,它会为类似于ebp - 0x4的局部变量命名为local_4h。当这些变量的作用变得清晰明了时,它也提供了将这些变量命名为更有意义的名称的功能。然而,在变量被重命名之后,打印它们就变得更加困难了。当我看到像mov eax, dword [ebp-i]这样的指令时,我必须:
  1. 查找反汇编代码的顶部,找到var int i @ ebp-0xc这一行
  2. 键入pxw @ebp-0xc
  3. 从输出的16行(!)中的第一行中读取i的值
  4. 再次在最后一个命令被移动后在反汇编代码中找到我的位置
这不是很麻烦,但当我查看大量带有许多变量的汇编代码时,它很快变得乏味。
另外一个问题是,是否可能在执行断点时每次都打印一个变量/位置,就像使用GDB的display命令那样?

这可能更适合于逆向工程维基。 - Alyssa Haroldsen
1个回答

15

使用 afvd (analyze function variables display) 代替 pxw @ local_4h,它会列出每个或特定变量:

[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 返回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]

1
Radare2为什么不原生支持pwx local_14h?这个问题有任何更新吗? - Shuzheng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接