minto Asked: 2024-06-17 04:35:08 +0800 CST2024-06-17 04:35:08 +0800 CST 2024-06-17 04:35:08 +0800 CST 如何打印出二进制数据中包含的所有可打印的 ASCII 字符串? 772 如何打印出二进制文件中包含的所有可打印 ASCII 字符串(例如,长度超过四个字符)? 我用了strings -a -w file.bin >>output。 command-line 2 个回答 Voted cpu 2024-06-17T04:43:44+08:002024-06-17T04:43:44+08:00 该命令strings就是您要查找的查看二进制文件中的所有 ASCII 字符串。 Best Answer Stéphane Chazelas 2024-06-17T14:44:08+08:002024-06-17T14:44:08+08:00 ASCII 是一种字符集,它为从 0 到 127 的每个字节值分配字符。其中,33 个(对应字节值 0 到 31 和 127)是控制字符(其中一些(\n,\t)经常用于文本,也\r用于 Microsoft 文本,很少\b用于某些应用程序中的粗体/下划线处理,\e用于图形再现转义序列),其余可打印(其中一个(字节值 32 上的空格)是非图形的)。 因此,如果确实要查找由 4 个或更多 ASCII 字符组成的字符串,那么可能需要查找 0-127 范围内的 4 个或更多字节的序列,您可以使用 perl 来执行此操作: perl -l -0777 -ne 'print for /[\0-\177]{4,}/g' (此处打印换行符分隔符(换行符为 ASCII 格式))。 现在,在给定的二进制文件中,并不是因为字节的值在 0 到 127 之间,所以它们应该是 ASCII 编码的文本。特别是,表示 ASCII NUL 控制字符的字节 0 很少在文本中找到,因此该字节值的存在通常清楚地表明该文件包含二进制数据而不是文本。 因此,将它与换行符和制表符以外的控制字符一起从列表中删除,可能会更有可能为您提供旨在作为 ASCII 字符串的字节序列。 perl -l -0777 -ne 'print for /[\t\n\40-\176]{4,}/g' (您可能想要添加\e,\10(BS,\b在 perl 中表示不同的东西))。 请注意,如果您不将其重定向到文件,这些控制字符(\t,,,)将按原样打印到终端。\n\e\b 你可以这样做: perl -MJSON::PP -l -0777 -ne 'print encode_json$_ for /[\10\t\n\e\40-\176]{4,}/g' 打印这些字符串的 JSON 字符串表示形式。例如,在/bin/ls我的系统上的内容将显示以下内容: "sha384sum" "sha512sum" "\n%s online help: <%s>\n" "GNU coreutils" "Full documentation <%s%s>\n" "full-iso" 代替: sha384sum sha512sum %s online help: <%s> GNU coreutils Full documentation <%s%s> full-iso 当发送到终端设备时,换行符(又称换行控制字符)(以\nJSON 字符串表示)通常会转换为回车符+换行符序列的控制字符,几乎所有终端中的第一个控制字符将光标移动到行首(返回回车符),第二个控制字符将光标向下移动一行(换行)。这就是 Unix 确保换行符作为行分隔符的方式。
该命令
strings
就是您要查找的查看二进制文件中的所有 ASCII 字符串。ASCII 是一种字符集,它为从 0 到 127 的每个字节值分配字符。其中,33 个(对应字节值 0 到 31 和 127)是控制字符(其中一些(
\n
,\t
)经常用于文本,也\r
用于 Microsoft 文本,很少\b
用于某些应用程序中的粗体/下划线处理,\e
用于图形再现转义序列),其余可打印(其中一个(字节值 32 上的空格)是非图形的)。因此,如果确实要查找由 4 个或更多 ASCII 字符组成的字符串,那么可能需要查找 0-127 范围内的 4 个或更多字节的序列,您可以使用 perl 来执行此操作:
(此处打印换行符分隔符(换行符为 ASCII 格式))。
现在,在给定的二进制文件中,并不是因为字节的值在 0 到 127 之间,所以它们应该是 ASCII 编码的文本。特别是,表示 ASCII NUL 控制字符的字节 0 很少在文本中找到,因此该字节值的存在通常清楚地表明该文件包含二进制数据而不是文本。
因此,将它与换行符和制表符以外的控制字符一起从列表中删除,可能会更有可能为您提供旨在作为 ASCII 字符串的字节序列。
(您可能想要添加
\e
,\10
(BS,\b
在 perl 中表示不同的东西))。请注意,如果您不将其重定向到文件,这些控制字符(
\t
,,,)将按原样打印到终端。\n
\e
\b
你可以这样做:
打印这些字符串的 JSON 字符串表示形式。例如,在
/bin/ls
我的系统上的内容将显示以下内容:代替:
当发送到终端设备时,换行符(又称换行控制字符)(以
\n
JSON 字符串表示)通常会转换为回车符+换行符序列的控制字符,几乎所有终端中的第一个控制字符将光标移动到行首(返回回车符),第二个控制字符将光标向下移动一行(换行)。这就是 Unix 确保换行符作为行分隔符的方式。