我一直在使用objdump
来查看Linux ELF二进制文件中的汇编代码。如何检查Linux上ELF文件的数据部分的内容?
有时是通过存储在rodata
(只读数据)部分中的跳转表间接跳转。
如何获得objdump
或任何其他工具给我看这个数据段的内容是什么?
我可以执行该程序,并检查调试器中的相关地址,但我不想这样做,因为它必须交互来完成。
理想的答案将确定一个工具,它不仅会告诉我的内容,但让我控制的显示格式,多为od
一样。
我一直在使用objdump
来查看Linux ELF二进制文件中的汇编代码。如何检查Linux上ELF文件的数据部分的内容?
有时是通过存储在rodata
(只读数据)部分中的跳转表间接跳转。
如何获得objdump
或任何其他工具给我看这个数据段的内容是什么?
我可以执行该程序,并检查调试器中的相关地址,但我不想这样做,因为它必须交互来完成。
理想的答案将确定一个工具,它不仅会告诉我的内容,但让我控制的显示格式,多为od
一样。
objdump -s -j .rodata exefile
给出了类似的rodata
部分内容的并排的十六进制/打印的ASCII转储:
Contents of section .rodata:
0000 67452301 efcdab89 67452301 efcdab89 gE#.....gE#.....
0010 64636261 68676665 64636261 68676665 dcbahgfedcbahgfe
它看起来并不像有什么事,在那里控制的格式,但这是一个开始。你总是可以undump的十六进制和喂它OD,我想:)
readelf -x .rodata hello_world.o
给出:
Hex dump of section '.rodata':
0x00000000 48656c6c 6f20776f 726c6421 0a Hello world!.
你应该更喜欢readelf
时可能的,因为objdump
根本不显示部分路段像.symtab
:Why does objdump not show .bss, .shstratab, .symtab and .strtab sections?
您还可以使用上面提到的技术提取原始字节:How do you extract only the contents of an ELF section以及by ysdx。
你可以得到RAW(未进制打印-ED)ELF节用:
# To a file:
objcopy file /dev/null --dump-section .text=text.data
# To stdout:
objcopy file /dev/null --dump-section .text=/dev/stdout | cat
在这里,我以迫使标准输出是管道使用| cat
。如果stdout是文件,/dev/stdout
可能会意外地工作。 .text=-
不会发送到标准输出,而是发送到-
文件。
然而objcopy and objdump have some deficiencies(因为它们是基于BFD哪个抽象不同可执行文件格式)。
更新:我写了一个tool这样做,它不依赖于BFD。
'--dump-section'有点新近了。它添加在:http://sourceware-org.1504.n7.nabble.com/Commit-objcopy-Add-dump-section-option-td256052.html为什么它比'--only-section'好? – 2015-09-04 13:20:07
你从我的投票中找到(并写作!)比我的答案中更有意义的工具。 – hobbs 2016-01-21 06:45:17
太棒了!我试过这个,但是我没有想到包含这个血腥的点...... – 2009-11-06 05:49:03
如何从ELF部分获取以二进制格式转储的数据?像objdump -s -j -binary会很棒。 –
Bogatyr
2012-10-26 09:42:33
@Bogatyr:参见我的答案。 – ysdx 2015-08-21 11:18:30