Radare2“pd”命令

All*_* Ye 2 radare2

我目前正在使用 Radare2 从 PE 文件中提取操作码。目前,我正在尝试使用 API 中的“pd”命令:“pd n @ offset: Print n opcodes disassembled”。我想知道是否有一种方法可以计算/找出我处理的每个文件的“n”到底是什么。谢谢

Kum*_*uma 5

环境

\n\n
    \n
  • radare2: radare2 4.2.0-git 23519 @ linux-x86-64 git.4.1.1-84-g0c46c3e1e 提交:0c46c3e1e30bb272a5a05fc367d874af32b41fe4 版本:2020-01-08__09:49:0
  • \n
  • 系统: Ubuntu 18.04.3 LTS
  • \n
\n\n

解决方案

\n\n

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

\n\n
    \n
  1. 通过视觉模式查看radare2中的反汇编:

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

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

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

    \n\n
      \n
    • 命令一:aaaa# 分析文件
    • \n
    • 命令二:aoj @@=`pid @@f ~[0]` > out\n\n
        \n
      • aoj# 显示JSON格式的操作码分析信息
      • \n
      • @@=# 对子查询返回的每个偏移量重复该命令
      • \n
      • pid @@f ~[0]# 子查询\n\n
          \n
        1. pid# 打印带有偏移量和字节的反汇编
        2. \n
        3. @@f# 对每个函数重复该命令
        4. \n
        5. ~[0]# 只打印第一列(偏移量)
        6. \n
      • \n
      • > out# 将输出重定向到名为out的文件
      • \n
    • \n
  8. \n
\n\n

例子

\n\n

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

\n\n

使用radare2 shell的示例

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

将 Python 与 r2pipe 结合使用的示例

\n\n
import r2pipe\n\nR2 = r2pipe.open(\'/bin/ls\') # Open r2 with file\nR2.cmd(\'aaaa\')              # Analyze file\nR2.cmd(\'pdf @@f > out\')     # Write disassembly for each function to out file\nR2.quit()                   # Quit r2\n
Run Code Online (Sandbox Code Playgroud)\n