我正在尝试使用radare2工具的递归遍历反汇编程序。但是,我不能正确使用它。

首先,根据radare2手册,我们可以通过使用pdr使用递归遍历反汇编程序:

[0x00404890]> pd?
Usage: pd[f|i|l] [len] @ [addr]
  pda  : disassemble all possible opcodes (byte per byte)
  pdj  : disassemble to json
  pdb  : disassemble basic block
  pdr  : recursive disassemble across the function graph
  pdf  : disassemble function
  pdi  : like 'pi', with offset and bytes
  pdl  : show instruction sizes


但我总是收到以下错误消息:

Cannot find function at 0x004028c0


这是在radare2命令上进行的ls的完整会话,首先是线性扫描反汇编,然后是递归遍历反汇编的尝试:

$> radare2 /bin/ls
syntax error: error in error handling
syntax error: error in error handling
[0x00404890]> pd@main
        ;-- main:
        0x004028c0    4157         push r15
        0x004028c2    4156         push r14
        0x004028c4    4155         push r13
        0x004028c6    4154         push r12
        0x004028c8    55           push rbp
        0x004028c9    4889f5       mov rbp, rsi
        0x004028cc    53           push rbx
        0x004028cd    89fb         mov ebx, edi
        0x004028cf    4881ec88030. sub rsp, 0x388
        ...
        0x00402dff    8b0567772100 mov eax, [rip+0x217767] ; 0x0040a56c 
        0x00402e05    488b0d64772. mov rcx, [rip+0x217764] ; 0x0040a570 
        0x00402e0c    83f801       cmp eax, 0x1
        0x00402e0f    0f84de0d0000 jz 0x403bf3
        0x00402e15    83f802       cmp eax, 0x2
        0x00402e18    be0f384100   mov esi, 0x41380f
        0x00402e1d    b80e384100   mov eax, str.vdir
        0x00402e22    480f45f0     cmovnz rsi, rax
        0x00402e26    488b3de3772. mov rdi, [rip+0x2177e3] ; 0x0040a610
        0x00402e2d    48c70424000. mov qword [rsp], 0x0
        0x00402e35    41b9bd384100 mov r9d, str.DavidMacKenzie
        0x00402e3b    41b8cd384100 mov r8d, str.RichardM.Stallman
[0x00404890]> pdr@main
Cannot find function at 0x004028c0
实际上,我强烈认为我在这里缺少步骤。看来我们应该首先构建该程序的调用图,但是我没有设法找到实现方法(显然我在某处错过了一些文档,对此感到抱歉!)。

所以,如果有人可以给我一个提示,我会很高兴的!

#1 楼

实际上,您首先应该对程序进行“功能”分析。为了更好地理解此类型,请使用a?

[0x00404890]> a?
Usage: a[?adfFghoprsx]
 a8 [hexpairs]    ; analyze bytes
 aa               ; analyze all (fcns + bbs)
 ad               ; analyze data trampoline (wip)
 ad [from] [to]   ; analyze data pointers to (from-to)
 ae [expr]        ; analyze opcode eval expression (see ao)
 af[bcsl?+-*]     ; analyze Functions
 aF               ; same as above, but using graph.depth=1
 ag[?acgdlf]      ; output Graphviz code
 ah[?lba-]        ; analysis hints (force opcode size, ...)
 ao[e?] [len]     ; analyze Opcodes (or emulate it)
 ap               ; find and analyze function preludes
 ar[?ld-*]        ; manage refs/xrefs
 as [num]         ; analyze syscall using dbg.reg
 at[trd+-*?] [.]  ; analyze execution Traces
 ax[-cCd] [f] [t] ; manage code/call/data xrefs
Examples:
 f ts @ `S*~text:0[3]`; f t @ section..text
 f ds @ `S*~data:0[3]`; f d @ section..data
 .ad t t+ts @ d:ds



,从af?开始进行“功能”分析:

[0x00404890]> af?
Usage: af[?+-l*]
 af @ [addr]               ; Analyze functions (start at addr)
 af+ addr size name [type] [diff] ; Add function
 af- [addr]                ; Clean all function analysis data (or function at addr)
 afb 16                    ; set current function as thumb
 afbb fcnaddr addr size name [type] [diff] ; Add bb to function @ fcnaddr
 afl[*] [fcn name]         ; List functions (addr, size, bbs, name)
 afi [fcn name]            ; Show function(s) information (verbose afl)
 afr name [addr]           ; Rename name for function at address (change flag too)
 afs [addr] [fcnsign]      ; Get/set function signature at current address
 af[aAv][?] [arg]          ; Manipulate args, fastargs and variables in function
 afc @ [addr]              ; Calculate the Cyclomatic Complexity (starting at addr)
 af*                       ; Output radare commands


然后,您可以运行递归遍历反汇编: >
还可以使用main选项启动radare2:


-A:在提示符或补丁之前运行'aaa'命令以分析所有引用的代码


另请参见http://radare.today/posts/analysis-by-default/

评论


执行af @ func命令会执行哪种分析?您能详细说明一下吗?

–恐怖
2014年5月4日19:08



根据我的阅读,它建立了程序的调用图。

–恐怖
2014年5月5日7:37

它从函数地址开始进行递归函数分析。

– jvoisin
15年8月13日在12:26