循环(Loops)

自动化最常见的一个工作就是循环地处理某些东西,在radare2中有多种途径实现该任务。

可以在flags上进行loop

@@ flagname-regex

比如,我们想要通过afi命令获得函数信息

[0x004047d6]> afi
#
offset: 0x004047d0
name: entry0
size: 42
realsz: 42
stackframe: 0
call-convention: amd64
cyclomatic-complexity: 1
bits: 64
type: fcn [NEW]
num-bbs: 1
edges: 0
end-bbs: 1
call-refs: 0x00402450 C
data-refs: 0x004136c0 0x00413660 0x004027e0
code-xrefs:
data-xrefs:
locals:0
args: 0
diff: type: new
[0x004047d6]>

现在,比如说我们想要查看目前发现的所有函数中某个特定字段(如上面输出里的某个字段),可以通过在函数flag空间(带fcn.前缀的那些函数)上进行loop达到该目的。

该命令将会从afi命令的输出中提取name字段信息,对每个匹配了正则fcn.*的函数flag都会如此。 radare2还提供预定义的@@f命令,可以看作是@@针对function的特化版本。因此我们也可以通过下面的命令获取r2发现的所有函数的名字。

同样还可以在包含一系列偏移的列表上进行loop,使用如下形式:

例如,我们想查看2个偏移地址上的opcode信息:当前的,以及当前地址+2这两个位置:

注意,我们正使用$$变量,其求值的结果正是当前偏移量。还要注意的是$$+2是在loop过程之前求值的,因此我们才可以使用这一简单的算术表达式。

进行loop的第三种方法是从文件加载偏移量,该文件每一行都包含一个偏移量。

radare2同样提供了多种foreach构造器进行loop,最有用的一个就是用于遍历函数中的所有指令。

在这个例子中对当前函数(entry0)中的每条指令执行pi 1命令。 这里同样有一些其他的选项(并非完整列表,通过@@?了解更多信息)

  • @@k sdbquery - 遍历sdbquery返回的所有偏移量

  • @@t- 在所有线程上进行遍历(参见dp)

  • @@b - 在当前函数的所有基本块上进行遍历(参见afb)

  • @@f - 在所有函数上进行遍历 (参见aflq)

最后一种类型的遍历允许对任何预定义的类型进行遍历

  • symbols

  • imports

  • registers

  • threads

  • comments

  • functions

  • flags

这是通过@@@命令做到的,前面那个列出函数信息的例子也可以通过@@@命令完成:

这个命令将会从afi的输出中提取name字段,并会输出一长串函数名,我们可以仅选择第二列,即去掉每行中重复出现的name

请当心, @@@ 与 JSON commands 不兼容

最后更新于

这有帮助吗?