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