【问题标题】:How to extract text portion of a binary file in linux/bash?如何在 linux/bash 中提取二进制文件的文本部分?
【发布时间】:2016-12-14 10:59:27
【问题描述】:

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

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

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

【问题讨论】:

  • strings file1.bin
  • @MarcB 请给出答案,以便我们可以正确投票...

标签: linux bash sed grep


【解决方案1】:

使用 strings 实用程序 - 这正是它的设计目的。

【讨论】:

  • 我在它不起作用之前尝试过。但后来我意识到我错过了s。字符串不是字符串,我的错 :-) 谢谢!
  • 那么如何使用字符串呢?
【解决方案2】:

这是我在未安装“字符串”实用程序的系统中使用的内容

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

这会一举打印文本并删除不可打印的字符,这与“cat -v 文件名”不同,它只打印文本但需要一些后处理来删除不需要的内容。请注意,某些二进制数据可能是可打印的,因此您仍然会在好东西之间得到一些乱码。如果你可以使用字符串,我认为字符串也会消除这种乱码。

【讨论】:

  • strings ~/Pictures/Pic_A.jpg 有结果(或更好)。 $ cat ~/Pictures/Pic_A.jpg | tr -cd "[:print:]" 结果:tr: Illegal byte sequence
【解决方案3】:

如果您使用的是 Debian 发行版,您可能只需 sudo apt install radare2 即可获得 radare2 (r2)。

安装 r2 后,无论是使用 apt、其他发行版上的其他安装程序,还是按照在线指南,您都可以使用 rabin2 仅提取二进制文件的文本部分:

$ rabin2 -z your_binary

这通常比strings“更好”,因为它只输出二进制文件中有用的.data 部分。该部分之外的东西并不总是很有用。

【讨论】:

  • 此解决方案仅适用于可执行文件,因为该工具专注于逆向工程。并非每个二进制文件都是可执行的(因此,没有 .data 部分)。
  • 据我所知,有趣的字符串(如密码和硬编码到二进制文件中的路径)通常位于.data 部分,因此使用rabin2 -z 可以直接找到那些不打印我们得到的乱码的人使用strings。不过我都用过。
  • 我的评论是为了让读者清楚地了解您的工具在其中工作的用例。您的用例特定于可执行文件,因为您一直提到 .data 部分。让我想到这个问题的用例是一个不可执行的二进制文件,它没有.data 部分供rabin2 操作。 strings 不仅仅对可执行文件有用。 :-)
猜你喜欢
  • 2011-02-08
  • 2020-08-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
相关资源
最近更新 更多