1

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

4

1 回答 1

3

环境

  • 雷达2:雷达2 4.2.0-git 23519@linux-x86-64 git.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 格式显示操作码分析信息
      • @@=# 对子查询返回的每个偏移量重复该命令
      • 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
...

使用带有 r2pipe 的 Python 示例

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
于 2020-06-11T16:24:03.910 回答