我有一个 cgywin 可执行文件(应为 PE 格式),并想反汇编它以使用radare2 在文本部分获取汇编代码,大多数示例按指令反汇编而不是整个文件。
radare2 filename
然后我打字pdf
,它说
p:Cannot find function at 0x100401000
我错过了什么?
任何帮助都非常感谢。
我有一个 cgywin 可执行文件(应为 PE 格式),并想反汇编它以使用radare2 在文本部分获取汇编代码,大多数示例按指令反汇编而不是整个文件。
radare2 filename
然后我打字pdf
,它说
p:Cannot find function at 0x100401000
我错过了什么?
任何帮助都非常感谢。
首先,你要明白pdf
命令是用来反汇编函数的,所以你首先要寻找函数的起点(我认为他们是使用符号和其他一些启发式方法来找到它的)。
要获得函数的自动分析,只需aaa
先输入。它将对可执行文件运行大部分所需的分析。然后,键入pdf
。
如果你只想要一个没有函数分析的原始反汇编,那么只输入pd
.
radare 命令背后的逻辑是命令的每个字符都有一个含义并构建树状命令族。
例如,“ p
”用于“打印”命令系列。尝试键入p?
,您将获得以下信息:
[0x00005430]> p?
|Usage: p[=68abcdDfiImrstuxz] [arg|len] [@addr]
| p=[?][bep] [blks] [len] [blk] show entropy/printable chars/chars bars
| p2 [len] 8x8 2bpp-tiles
| p3 [file] print stereogram (3D)
| p6[de] [len] base64 decode/encode
| p8[?][j] [len] 8bit hexpair list of bytes
| pa[edD] [arg] pa:assemble pa[dD]:disasm or pae: esil from hexpairs
| pA[n_ops] show n_ops address and type
| p[b|B|xb] [len] ([skip]) bindump N bits skipping M
| pb[?] [n] bitstream of N bits
| pB[?] [n] bitstream of N bytes
| pc[?][p] [len] output C (or python) format
| pC[d] [rows] print disassembly in columns (see hex.cols and pdi)
| pd[?] [sz] [a] [b] disassemble N opcodes (pd) or N bytes (pD)
| pf[?][.nam] [fmt] print formatted data (pf.name, pf.name $<expr>)
| ph[?][=|hash] ([len]) calculate hash for a block
| p[iI][df] [len] print N ops/bytes (f=func) (see pi? and pdi)
| pm[?] [magic] print libmagic data (see pm? and /m?)
| pr[?][glx] [len] print N raw bytes (in lines or hexblocks, 'g'unzip)
| p[kK] [len] print key in randomart (K is for mosaic)
| ps[?][pwz] [len] print pascal/wide/zero-terminated strings
| pt[?][dn] [len] print different timestamps
| pu[?][w] [len] print N url encoded bytes (w=wide)
| pv[?][jh] [mode] show variable/pointer/value in memory
| p-[?][jh] [mode] bar|json|histogram blocks (mode: e?search.in)
| px[?][owq] [len] hexdump of N bytes (o=octal, w=32bit, q=64bit)
| pz[?] [len] print zoom view (see pz? for help)
| pwd display current working directory
然后,第二个字母 ( d
) 代表 'disassemble',请尝试pd?
:
[0x00005430]> pd?
|Usage: p[dD][ajbrfils] [sz] [arch] [bits] # Print Disassembly
| NOTE: len parameter can be negative
| NOTE: Pressing ENTER on empty command will repeat last pd command and also seek to end of disassembled range.
| pd N disassemble N instructions
| pd -N disassemble N instructions backward
| pD N disassemble N bytes
| pda disassemble all possible opcodes (byte per byte)
| pdb disassemble basic block
| pdc pseudo disassembler output in C-like syntax
| pdC show comments found in N instructions
| pdk disassemble all methods of a class
| pdj disassemble to json
| pdr recursive disassemble across the function graph
| pdf disassemble function
| pdi like 'pi', with offset and bytes
| pdl show instruction sizes
| pds[?] disassemble summary (strings, calls, jumps, refs) (see pdsf and pdfs)
| pdt disassemble the debugger traces (see atd)
如您所见,pdf
代表“反汇编功能”。
但是,如果您想要对内存区域进行原始反汇编,那么pd
可能就是您所需要的。它从当前地址盲目地反汇编到某个内存窗口。如果你想在一个精确的地址反汇编,那么使用pd @0xdeadbeef
.
打印反汇编大小重定向 output_filename
pd
: 打印反汇编代码$s
: 可执行文件的大小由radare2分配给这个变量>
: 重定向输出到文件因此,尝试:
pd $s >myfile.asm
或者,(s)eek 到 .text 部分的开头,然后 (p)rint(D) 组装 N 字节 N,从 .text 部分地址的结尾 (section_end..text) 减去开始的 .text 部分地址 (section.text) 计算得出。 。文本):
s section..text
pD section_end..text-section..text > myfiles.txt
如果您的可执行文件有多个节,则需要在名称后添加节号(例如,section..text.0)。通过列出所有 (S) 节列表来查找节的名称:
S
PS我只是在学习如何自己使用radare2。