📕
Radare2手册
  • 简介
  • 历史
  • Radare2框架
  • 下载radare2
  • 编译与可移植性
  • Compilation on Windows
  • Compilation on Android
  • 用户界面
  • 快速上手
    • 命令行选项
    • 命令格式
    • 表达式
    • 基本的debug操作
    • Contributing to radare2
  • 配置
    • Colors
    • 配置项
    • radare2相关文件
  • 基本命令
    • 定位
    • 块大小
    • 节区
    • 映射文件
    • 输出模式
    • 标记符(Flags)
    • 写入数据
    • Zoom模式
    • 复制/粘贴
    • 字节比较
    • SDB
    • Dietline
  • 可视化模式
    • 反汇编界面
    • 汇编界面
    • 变量编辑器界面
    • 可视化面板
  • 搜索字节
    • 基本的搜索用法
    • 配置搜索引擎
    • 搜索重复字节序列
    • 搜索中的自动化
    • 回溯搜索
    • 搜索汇编指令
    • Searching for AES Keys
  • 反汇编
    • 为反汇编添加元数据
    • ESIL
  • 分析
    • 代码分析
    • 变量
    • 类型
    • 调用约定
    • 虚函数表
    • 系统调用
    • 模拟执行
    • Symbols 信息
    • 函数签名
    • 图形化命令
  • 脚本化
    • 循环(Loops)
    • 宏(Macros)
    • R2pipe
  • 调试器
    • 入门
    • 从ida, GDB 或 WinDBG迁移到radare2
    • 寄存器(Registers)
    • 内存映射(Memory Maps)
    • 堆(Heap)
    • 文件(Files)
    • 反向调试
    • Windows消息(Messages)
  • 远程访问
    • 远程GDB调试
    • 远程WinDbg
  • 命令行工具
    • Rax2
    • Rafind2
    • Rarun2
    • Rabin2
      • 文件信息识别
      • 入口点(EP)
      • 导入(Imports)
      • 导出(Exports)
      • Symbols (exports)
      • 库文件
      • 字符串(String)
      • 节区(Sections)
    • Radiff2
      • 二进制文件比较
    • Rasm2
      • 汇编
      • 反汇编
      • 配置项
    • Ragg2
      • Language
    • Rahash2
      • Rahash Tool
  • 插件
    • IO 插件
    • Asm 插件
    • Analysis 插件
    • Bin 插件
    • 其它插件
    • Python插件
    • 对插件进行调试
    • 测试
    • 打包
  • Crackmes
    • IOLI
      • IOLI 0x00
      • IOLI 0x01
    • Avatao R3v3rs3 4
      • .radare2
      • .first_steps
      • .main
      • .vmloop
      • .instructionset
      • .bytecode
      • .outro
  • Reference Card
  • Acknowledgments
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 反汇编

为反汇编添加元数据

上一页反汇编下一页ESIL

最后更新于4年前

这有帮助吗?

二进制逆向工作中一个经典的任务就是为分析结果提供有用而关键的注解。 Radare提供了多种方式存取该元信息。

遵循UNIX原则,我们采用脚本语言使用odjdump,otool以及其他小工具结合起来提取二进制文件内的信息,并将这些信息导入radare2中。例如中的idc2r.py,可以用idc2r.py file.idc > file.r2调用之,其读取IDA pro导出的IDC文件,然后创建一个包含相同注释、函数名和其它数据的r2脚本把这些数据引入r2中。可以在radare2内用.命令执行该r2脚本:

[0x00000000]> . file.r2

.命令用于调用外部的radare命令输入源, 包括文件和程序的输出内容。例如想省略中间文件的生成并直接导入脚本,可以使用如下的命令组合:

[0x00000000]> .!idc2r.py < file.idc

请注意,导入IDA Pro中的IDC dump的元数据是一个已被废弃的机制,在未来的版本中很可能不再生效。更推荐的做法是使用基于ida2r2.py的直接打开IDB文件,该做法不需要系统上安装IDA pro。

C命令用于管理注释和数据转换的部分,你可以将一个范围内的字节作为代码解释,作为二进制数据解释或者作为字符串进行解释。同样也支持指定的标识位置外执行外部代码,以从外部文件或数据库中获取一些元信息,比如注释之类的。

radare包含大量不同的元数据操作命令,下面是他们的简要介绍:

[0x00404cc0]> C?
| Usage: C[-LCvsdfm*?][*?] [...]   # Metadata management
| C                                              list meta info in human friendly form
| C*                                             list meta info in r2 commands
| C*.                                            list meta info of current offset in r2 commands
| C- [len] [[@]addr]                             delete metadata at given address range
| C.                                             list meta info of current offset in human friendly form
| CC! [@addr]                                    edit comment with $EDITOR
| CC[?] [-] [comment-text] [@addr]               add/remove comment
| CC.[addr]                                      show comment in current address
| CCa[-at]|[at] [text] [@addr]                   add/remove comment at given address
| CCu [comment-text] [@addr]                     add unique comment
| CF[sz] [fcn-sign..] [@addr]                    function signature
| CL[-][*] [file:line] [addr]                    show or add 'code line' information (bininfo)
| CS[-][space]                                   manage meta-spaces to filter comments, etc..
| C[Cthsdmf]                                     list comments/types/hidden/strings/data/magic/formatted in human friendly form
| C[Cthsdmf]*                                    list comments/types/hidden/strings/data/magic/formatted in r2 commands
| Cd[-] [size] [repeat] [@addr]                  hexdump data array (Cd 4 10 == dword [10])
| Cd. [@addr]                                    show size of data at current address
| Cf[?][-] [sz] [0|cnt][fmt] [a0 a1...] [@addr]  format memory (see pf?)
| Ch[-] [size] [@addr]                           hide data
| Cm[-] [sz] [fmt..] [@addr]                     magic parse (see pm?)
| Cs[?] [-] [size] [@addr]                       add string
| Ct[?] [-] [comment-text] [@addr]               add/remove type analysis comment
| Ct.[@addr]                                     show comment at current or specified address
| Cv[bsr][?]                                     add comments to args
| Cz[@addr]                                      add string (see Cs?)

在指定的行/地址加入一个注释,只需使用Ca命令:

[0x00000000]> CCa 0x0000002 this guy seems legit
[0x00000000]> pd 2
0x00000000    0000         add [rax], al
;      this guy seems legit
0x00000002    0000         add [rax], al

C?命令族可以用于将范围内的数据标记为几种类型之一,基本的三种类型为:code(通过asm.arch完成反汇编),data(一个包含数据元素的数组)或string。使用Cs命令可以定义一个字符串,使用Cd命令可以定义一个数组,使用Cf命令则可以定义一些更复杂的数据结构,比如struct。

对数据类型的注解通常在可视化模式下更容易完成,使用"d"键即可进行注解,其是"data type change"的缩写。首先用光标选择一个字节范围(按下c键进入光标模式,在里面通过HJKL键进行选择),之后按下'd'键可以获取菜单,菜单中包含允许进行的操作或可能的类型。例如想要将一个范围内的字节标记为字符串时,选择该菜单中的s选项。当然也可以在r2 shell下使用Cs命令达到同样的效果。

[0x00000000]> f string_foo @ 0x800
[0x00000000]> Cs 10 @ string_foo

Cf命令用于定义一个内存格式化字符串(与pf命令使用的格式相同)。这里有一个例子:

[0x7fd9f13ae630]> Cf 16 2xi foo bar
[0x7fd9f13ae630]> pd
;-- rip:
0x7fd9f13ae630 format 2xi foo bar {
0x7fd9f13ae630 [0] {
 foo : 0x7fd9f13ae630 = 0xe8e78948
 bar : 0x7fd9f13ae634 = 14696
}
0x7fd9f13ae638 [1] {
 foo : 0x7fd9f13ae638 = 0x8bc48949
 bar : 0x7fd9f13ae63c = 571928325
}
} 16
0x7fd9f13ae633    e868390000   call 0x7fd9f13b1fa0
0x7fd9f13ae638    4989c4       mov r12, rax

传递给Cf的[sz]参数用于定义反汇编中该结构体占据的字节数,该参数与格式化字符串中所定义的字节数是完全独立的。听起来可能有一点迷惑,不过这个设定有几个用途,例如,你可能想在反汇编中看到经过格式化规整后的结构体,同时仍然将结构体中对应位置显示为偏移量和原始的字节。有时,你可能只识别出一个大结构体中的几个成员,又或者只对其中的某个成员感兴趣,那么你可以使用格式化字符串和'skip'跳过,让r2仅仅显示这些成员区域,同时反汇编依旧可以不受阻碍地继续下去,因为其使用sz命令所指定的数值作为结构体的大小。

有时候仅仅添加一行文字注释可能无法满足需要,radare2允许创建一个指向文本文件的链接。使用CC,命令或者在可视化模式按下,键,之后会打开一个$EDITOR创建新文件,如果文件名已经存在了,那么将会创建一个指向文件的链接。之后,它在反汇编窗口中会显示这样的注释:

[0x00003af7 11% 290 /bin/ls]> pd $r @ main+55 # 0x3af7
│0x00003af7  call sym.imp.setlocale        ;[1] ; ,(locale-help.txt) ; char *setlocale(int category, const char *locale)
│0x00003afc  lea rsi, str.usr_share_locale ; 0x179cc ; "/usr/share/locale"
│0x00003b03  lea rdi, [0x000179b2]         ; "coreutils"
│0x00003b0a  call sym.imp.bindtextdomain   ;[2] ; char *bindtextdomain(char *domainname, char *dirname)

注意,,(locale-help.txt)出现在了注释中,如果在可视化模式下再次按下,就会打开该文件。通过该机制就可以在反汇编窗口中的注释位置上创建一个长描述,外链到数据表或者相关的文章。

通过使用Cf,我们能够使用简单的命令定义复杂的结构体。查看pf?的输出信息获取更多帮助。 记住,所有这些C命令都可以在可视化模式下通过d(data conversion)键使用。还要注意的是,和命令不同,Cf并不改变分析结果,它仅仅用于优化展示效果。

radare2ida
python-idb
t