如何解释二进制文件的八进制或十六进制转储?

如何解释二进制文件的八进制或十六进制转储?

二进制文件有字符串和一些数字,如果我这样做 od -c filenamestrings filename,我可以正确地看到字符串。但是,数字呢?它们的格式很奇怪。

完成后的文字od -c filename是这样的:

0000000 036 \0 032 004 SD \0 \0 \0 \0 序列 1
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \t \0 ó 002 3 001
0000040 & \0 032 \f O 2 006 \0 \0 \0 osfus 1
0000060 ó 002 3 001 ÿ \r \0 \0 \t \0 \0 @ 3 ×
0000100 233 º 004 \0 é 003 \0 \0 & \0 032 \f O 2 7 \0
0000120 \0 \0 osfeu 1 ó 002 3 001 é 235
0000140 \0 \0 035 003 \0 @ 3 × 233 º 004 \0 Ñ \a \0 \0
0000160 ä \0 032 \f 或 E \0 \0 \0 osfap 1

这个要如何破译呢?

我什至尝试过hexdump -C filename

输出是这样的:

00000000 1e 00 1a 04 53 44 00 00 00 00 73 65 71 31 20 20 |....SD....seq1 |
00000010 20 20 00 00 00 00 00 00 00 00 09 00 f3 02 33 01 | …….ó.3.|
00000020 26 00 1a 0c 4f 32 06 00 00 00 6f 73 66 75 73 31 |&...O2....osfus1|
00000030 20 20 f3 02 33 01 ff 0d 00 00 09 00 00 40 33 d7 | ó.3.ÿ……@3×|
00000040 9b ba 04 00 e9 03 00 00 26 00 1a 0c 4f 32 37 00 |.°..é...&...O27.|
00000050 00 00 6f 73 66 65 75 31 20 20 f3 02 33 01 e9 9d |..osfeu1 ó.3.é.|
00000060 00 00 1d 03 00 40 33 d7 9b ba 04 00 d1 07 00 00 |.....@3×.°..Ñ...|
00000070 e4 00 1a 0c 4f 72 45 00 00 00 6f 73 66 61 70 31 |ä...OrE...osfap1|

澄清一下,作为常规文件的主文件有一个显示的属性是某种奇怪的格式,因此我们正在查看原始/二进制文件。

对常规文件进行八进制转储,解决了查看问题。

有了grep 'id=123' regular_file | head -1 | od -c,我就能看到里面有什么数字。我本来以为是 1,结果显示为 001。

答案1

对于计算机科学,我首先要记住的事情之一是数据 + 解释 = 有用信息。由此推论,如果你缺少数据或解释,你就一无所有。数据本身并不能告诉你如何解释它。 (您可以拥有告诉您这一点的元数据,但是您需要知道如何解释元数据也)

在这种情况下,我建议尝试一下:

file filename

如果出现类似的情况:

filename: data

你有绝对地不知道格式是什么,它来自什么程序,它的用途是什么,或者 的内容filename,那么您可能应该放弃。

八进制转储输出

od(八进制转储)生成混合文本和八进制转储。非数字是可打印字符,如osf等,或不可打印字符,如\0(ASCII 0, NUL) 或\a(ASCII 7, BEL),或以 8 为基数的数字,带有标准 C 前缀0(例如032= 26 in十进制)。您的文件被解释为一个流8位字节

十六进制转储输出

hexdump生成传统的十六进制转储,其中一列以十六进制列出 8 位字节,另一列显示这些字节对应的 ASCII 字符(如果有)(如果字节值是不可打印的 ASCII 字符,或者根本不是 ASCII 字符) ,.显示在该位置)。同样,您的文件被解释为一个流8位字节

整数

如果您的文件包含 100% 二进制整数(即某种整数表示形式的无头、统一、一维数组),那么您必须回答自己所有这些问题:

  • 它们是“正确的”二进制文件,还是二进制编码的十进制 (BCD)? (可能是二进制)
  • 它们的宽度是多少?
  • 如果它们的宽度不是 8 的倍数,它们是否像 SMS 消息或 Base64 那样进行位打包,或者字节对齐?
  • 如果它们的宽度是 8 位或更多,那么它们的宽度是多少字节顺序?是 Big Endian、Little Endian 还是其他更罕见的类型之一?
  • 是整数已签名或未签名
  • 如果他们签署了,他们是否代表二进制补码(更有可能),或者一个人的补语,或者一些罕见和奇怪的东西?

我现在可能忘记了更多。

这仅适用于来自常见的现代计算机体系结构的一维统一整数数组。如果你的数据有任何复杂性,事情就会变得如此棘手,中彩票很快就会变得比仅仅猜测格式更容易。你呢猜测(有根据的猜测,但只是猜测),除非您知道格式。

答案2

存储数字的方法有很多种 - ASCII(可以有特定于区域设置的变体,例如使用“,”分隔小数部分或作为千位分组)、二进制整数(可变位数)/浮点/双精度(所有这可能会有所不同,具体取决于字节序架构以及生成文件的软件是否形式化表示形式)、BCD(未压缩、打包、定点和其他变体)、双五进制编码十进制...

没有标准。

相关内容