我目前正在使用Radare2从PE文件中提取操作码。当前,我正在尝试使用API中的“ pd”命令:“ pd n @ offset:打印n个反汇编的操作码”。我想知道是否有一种方法可以精确计算/查找我处理的每个文件的“ n”。谢谢
环境
SOLUTION] >>
此示例显示4个不同的选项,用于查看/打印反汇编或操作码。
通过可视模式在radare2中查看反汇编:
aaaa
#分析文件Vp
#在可视模式下打开反汇编打印r2或r2pipe中所有功能的反汇编:
aaaa
#分析文件pdf @@f > out
pdf
#打印功能的反汇编@@f
#对每个功能重复该命令> out
#将输出重定向到名为out仅打印r2或r2pipe中的指令:
aaaa
#分析文件pif @@f ~[0] > out
pif
#函数的打印指令@@f
#对每个功能重复该命令~[0]
#仅打印第一列(指令)> out
#将输出重定向到名为out使用r2或r2pipe为每个操作码获取的详细信息:
aaaa
#分析文件aoj @@=`pid @@f ~[0]` > out
aoj
#以JSON显示操作码分析信息@@=
#对子查询返回的每个偏移量重复此命令pid @@f ~[0]
#子查询pid
#使用偏移量和字节数进行打印反汇编@@f
#对每个功能重复该命令~[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