【问题标题】:Looking for patterns in binary files在二进制文件中寻找模式
【发布时间】:2011-03-07 02:08:47
【问题描述】:

我正在使用 C 语言处理一个小项目,我必须解析一个未记录文件格式的二进制文件。由于我是 C 的新手,所以我有两个问题想问一些更有经验的程序员。

第一个似乎很容易。如何从二进制文件中提取所有字符串并将它们放入数组中?基本上我正在寻找 C 中 strings 程序的简单实现。

当我在任何文本编辑器中打开二进制文件时,我会得到很多垃圾,其中混入了一些可读的字符串。我可以在命令行中使用 strings 提取这些字符串。现在我想在 C 中做一些类似的事情,就像下面的伪代码一样:

while (!EOF) {
     if (string found) {
          put it into array[i]
          i++
       }
     return i;
}

第二个问题稍微复杂一些,我相信它是实现相同目标的正确方法。当我在 HEX 编辑器中查看文件时,很容易注意到一些模式。例如,在每个字符串之前有一个值为 02 (0x02) 的字节,后跟字符串的长度和字符串本身。例如 02 18 52 4F 4F 54 4B 69 57 69 4B 61 4B 69 是字符串部分加粗的字符串。

现在我正在尝试创建的函数将像这样工作:

while(!EOF) {
     for(i=0; i<buffer_size; ++i) {
          if(buffer[i] hex value == 02) {
               int n = read the next byte;
               string = read the next n bytes as char;
               put string into array;
          }
     }
}

感谢您的任何指点。 :)

【问题讨论】:

  • TLV - 类型、长度、值 - 编码很常见。你的例子不是决定性的;长度 0x18 后面应该跟一个 24 字节的字符串,但你只显示 12 个字节……它是在计算 nybbles 而不是字节?
  • 是的,它似乎只计算单个十六进制数字,因此以字节为单位的字符串长度将为 n/2。

标签: c linux hex bin


【解决方案1】:

第一个似乎很容易。如何从二进制文件中提取所有字符串并将它们放入数组中?

找出代表可打印 ASCII 字符的字符范围。遍历文件,检查字符是否为 ASCII 字符,并计算相邻的 ASCII 字符。默认情况下,strings 会将四个或更多字符的序列视为字符串;当你找到下一个非 ASCII 字符时,检查是否超过了数字;如果有,输出字符串。一些簿记是必要的。

第二个问题稍微复杂一些,我相信这是实现相同目标的正确方法。

您的伪代码基本上是正确的。您可以手动将buffer[i] 的内容与整数(例如 2)进行比较。读取一个字节就像增加i 一样简单。确保您没有超出缓冲区,并确保您读取字符串的数组足够大(如果 size 参数只有一个字节,您可以使用 255 长度的数组缓冲区。)

【讨论】:

  • +1。您需要创建一个 isStringChar() 函数,该函数接受一个字符,如果它在字符串中则返回 true(例如,如果它的 a-z)。并且您需要保留一个字符串,该字符串是您目前看到的字符的当前运行字符串。添加一个循环来一次解析一个字符,你就完成了。
  • 好的,这似乎很有帮助。我将尝试实现第一种方法。再看一下文件,似乎 02 并不总是表示字符串,而且有些地方 02 后面跟着不可读的字符。
  • 如果您对数据格式进行逆向工程,您应该做的第一件事是使用十六进制编辑器/字符串/其他通用类型的工具进行一些手动检查。当你对格式有了一个理论,然后开始编码。
【解决方案2】:

我不确定您的解决方案是否有效:如果您找到一个长度为 350 个字符的字符串怎么办? 数字可以是字符串的一部分,或者你可以认为它们是“垃圾”?

我认为最安全的方法是

  1. 定义你认为的字符串和你认为的“垃圾” - 例如“:,!?”是“字符串”还是“垃圾”?
  2. 定义被视为“可读”字符串的最小字符串长度
  3. 解析文件以查找长度 >= 最小值的每一组字符。 我知道,这很无聊,但我认为这是唯一安全的方法。祝你好运!

【讨论】:

  • 如果你说的是 250 而不是 350……当然,单个字节(假设为 8 位字节,正常情况下)最多只能保存 255 的值。
猜你喜欢
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2012-07-27
相关资源
最近更新 更多