Radare2 "pd" 命令

Radare2 "pd" command

我目前正在使用 Radare2 从 PE 文件中提取操作码。目前,我正在尝试使用来自 API: "pd n @ offset: Print n opcodes disassembled" 的 "pd" 命令。我想知道是否有办法 calculate/find 准确地找出我处理的每个文件的 "n" 是什么。谢谢

环境

  • radare2:radare2 4.2.0-git23519@linux-x86-64git.4.1.1-84- g0c46c3e1e 提交:0c46c3e1e30bb272a5a05fc367d874af32b41fe4 构建:2020-01-08__09:49:0
  • 系统: Ubuntu 18.04.3 LTS

解决方案

此示例显示了 4 个不同的选项来查看/打印反汇编或操作码。

  1. radare2可视化查看反汇编:

    • 命令一:aaaa # 分析文件
    • 命令二:Vp # 以可视模式打开反汇编
  2. 打印 r2 或 r2pipe 中所有函数的反汇编:

    • 命令一:aaaa # 分析文件
    • 命令二:pdf @@f > out
      • pdf # 打印函数的反汇编
      • @@f # 对每个函数重复命令
      • > out # 将输出重定向到名为 out
      • 的文件
  3. 只打印r2或r2pipe中的指令:

    • 命令一:aaaa # 分析文件
    • 命令二:pif @@f ~[0] > out
      • pif # 打印一个函数的指令
      • @@f # 对每个函数重复命令
      • ~[0] # 只打印第一列(指令)
      • > out # 将输出重定向到名为 out
      • 的文件
  4. 使用r2或r2pipe获取每个操作码的详细信息:

    • 命令一:aaaa # 分析文件
    • 命令二:aoj @@=`pid @@f ~[0]` > out
      • aoj # 显示JSON
      • 中的opcode分析信息
      • @@= # 通过子查询
      • 对每个偏移return重复命令
      • pid @@f ~[0] # 子查询
        1. pid # 打印带偏移量和字节的反汇编
        2. @@f # 对每个函数重复命令
        3. ~[0] # 只打印第一列(偏移量)
      • > out # 将输出重定向到名为 out
      • 的文件

示例

将此处的命令替换为上面的任何选项。

使用 radare2 的示例 shell

user@host:~$ r2 /bin/ls
[0x00005850]> aaaa
...
[0x00005850]> pdf @@f > out
[0x00005850]> q
user@host:~$ cat out
...
┌ 38: fcn.00014840 ();
│           ; var int64_t var_38h @ rsp+0xffffffd0
│           0x00014840      53             push rbx
│           0x00014841      31f6           xor esi, esi
│           0x00014843      31ff           xor edi, edi
│           0x00014845      e846f2feff     call sym.imp.getcwd
│           0x0001484a      4885c0         test rax, rax
│           0x0001484d      4889c3         mov rbx, rax
│       ┌─< 0x00014850      740e           je 0x14860
│       │   ; CODE XREF from fcn.00014840 @ 0x14868
│      ┌──> 0x00014852      4889d8         mov rax, rbx
│      ╎│   0x00014855      5b             pop rbx
│      ╎│   0x00014856      c3             ret
..
│      ╎│   ; CODE XREF from fcn.00014840 @ 0x14850
│      ╎└─> 0x00014860      e88beffeff     call sym.imp.__errno_location
│      ╎    0x00014865      83380c         cmp dword [rax], 0xc
│      └──< 0x00014868      75e8           jne 0x14852
└           0x0001486a      e861feffff     call fcn.000146d0
            ; CALL XREFS from fcn.00013d00 @ 0x13d9d, 0x13da8
...

使用 Python 和 r2pipe

的示例
import r2pipe

R2 = r2pipe.open('/bin/ls') # Open r2 with file
R2.cmd('aaaa')              # Analyze file
R2.cmd('pdf @@f > out')     # Write disassembly for each function to out file
R2.quit()                   # Quit r2