如何仅提取ELF部分的原始内容?

mep*_*ell 24 linux shell elf binutils

我尝试了以下内容,但生成的文件仍然是ELF,而不仅仅是部分内容.

$ objcopy --only-section=<name> <infile> <outfile>
Run Code Online (Sandbox Code Playgroud)

我只想要该部分的内容.有没有可以做到这一点的实用工具?有任何想法吗?

ndi*_*dim 47

使用-O binary输出格式:

objcopy -O binary --only-section=.text foobar.elf foobar.text
Run Code Online (Sandbox Code Playgroud)

刚刚用avr-objcopyAVR ELF图像.text部分进行了验证.

请注意,如果Tim在下面指出,如果您的部分没有ALLOC标志,则可能需要添加--set-section-flags .text=alloc以便能够提取它.

  • 这个巧妙的技巧并不适用于所有部分.`objcopy`不会复制标记既不加载("加载")也不加载("alloc")的部分.消息来源中的评论声称"这样的部分内容在二进制格式中没有意义". (9认同)
  • 以下适用于我:objcopy -O binary -j .text/usr/bin/lpr mylprtext (4认同)
  • 这与--set-section-flags一起允许我将.ARM.attributes转储到一个文件中.不会用棍子触摸另一个答案中的awk脚本;)+1. (3认同)
  • 很奇怪,但是 objcopy 打印:无法识别输入文件 `elf.img' 的格式,当 objdump 正常打印部分时。 (2认同)

Dum*_*001 19

相当不优雅的黑客攻击objdumpdd:

IN_F=/bin/echo
OUT_F=./tmp1.bin
SECTION=.text

objdump -h $IN_F |
  grep $SECTION |
  awk '{print "dd if='$IN_F' of='$OUT_F' bs=1 count=$[0x" $3 "] skip=$[0x" $6 "]"}' |
  bash
Run Code Online (Sandbox Code Playgroud)

所述objdump -h产生包含部分中的小精灵文件偏移预测的输出.我为shell awk生成了一个dd命令,因为dd它不支持十六进制数字.并将命令提供给shell.

在过去,我手动完成了所有操作,没有制作任何脚本,因为它很少需要.

  • 因为它不适用于我的所有测试用例.上面做了. (2认同)

Cir*_*四事件 16

objcopy --dump-section

在Binutils 2.25中引入,并实现了类似的效果-O binary --only-section.

用法:

objcopy --dump-section .text=output.bin input.o
Run Code Online (Sandbox Code Playgroud)

https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html将其记录为:

--dump-section sectionname = filename

将名为sectionname的部分的内容放入文件filename中,覆盖之前可能存在的任何内容.此选项与--add-section相反.此选项类似于--only-section选项,除了它不创建格式化文件,它只是将内容转储为原始二进制数据,而不应用任何重定位.该选项可以多次指定.

最小的可运行示例

电源

.data
    .byte 0x12, 0x34, 0x56, 0x78
.text
    .byte 0x9A, 0xBC, 0xDE, 0xF0
Run Code Online (Sandbox Code Playgroud)

组装:

as -o main.o main.S
Run Code Online (Sandbox Code Playgroud)

提取数据:

objcopy --dump-section .data=data.bin main.o
hd data.bin
Run Code Online (Sandbox Code Playgroud)

输出:

00000000  12 34 56 78                                       |.4Vx|
00000004
Run Code Online (Sandbox Code Playgroud)

提取文字:

objcopy --dump-section .text=text.bin main.o
hd text.bin
Run Code Online (Sandbox Code Playgroud)

输出:

00000000  9a bc de f0                                       |....|
00000004
Run Code Online (Sandbox Code Playgroud)

测试在Ubuntu 18.04 amd64,Binutils 2.30.

  • @Downvoters,请解释一下,我可以学习和改进信息. (5认同)
  • 这应该是最好的答案。 (2认同)