在Linux/Bash中如何提取二进制文件的文本部分?

18

我有一个二进制文件。如果我用vi打开它,会显示一些可读的文本和二进制字符。使用Bash提取仅人类可读部分的最佳方法是什么?

我在想,也许我们可以通过grepsed模式来做到这一点?

cat file1.bin | grep '????'  > newfile.txt

11
strings file1.bin - Marc B
@MarcB 请把它作为答案,这样我们才能适当地投票... - Eduardo
3个回答

31

使用 strings 工具 - 这正是它的设计目的。


我之前尝试过,但没有成功。但后来我意识到我漏掉了“s”。应该是字符串(strings)而不是字符串(string),我的错 :-) 谢谢! - RonPringadi
那么如何使用字符串? - Zimba
@Zimba man strings - DevSolar

3

在一个没有安装"strings"实用程序的系统中,我使用了以下内容:

"最初的回答"

cat yourfilename | tr -cd "[:print:]"

这个命令可以一次性打印文本并删除不可打印的字符,不像"cat -v filename"只能打印文本但需要后期处理以删除不想要的内容。请注意,一些二进制数据可能是可打印的,所以在好东西之间仍会出现一些乱码。如果您能使用strings命令,它也可以去除这些乱码。


strings ~/Pictures/Pic_A.jpg has result (or better). $ cat ~/Pictures/Pic_A.jpg | tr -cd "[:print:]" Result: tr: Illegal byte sequence - RonPringadi

2
如果您使用的是Debian发行版,您可以通过sudo apt install radare2轻松获取radare2(r2)。
安装完r2后,无论是通过apt、其他发行版上的某个安装程序还是遵循在线指南,都可以使用rabin2提取二进制文件的文本部分: $ rabin2 -z your_binary 这通常比仅使用strings更好,因为它仅输出二进制文件的有用.data部分。该部分之外的内容并不总是非常有用。

此解决方案仅适用于可执行文件,因为该工具是反向工程重点。并非每个二进制文件都是可执行的(因此没有 .data 部分)。 - Cliff
据我所知,像密码和路径这样的有趣字符串通常是硬编码到二进制文件中的.data部分,因此使用rabin2 -z可以直接访问它们,而不会打印出使用strings时得到的无意义字符。不过我两种方法都会用到。 - ChocolateOverflow
我的评论是为了让读者清楚你的工具适用的用例。你的用例是针对可执行文件的,因为你一直提到.data部分。我遇到这个问题的用例是一个非可执行二进制文件,没有.data部分供rabin2操作。strings不仅在可执行文件上有用。 :-) - Cliff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接