寻找二进制文件中的模式

时间:2011-03-07 02:08:47

标签: c linux hex bin

我正在使用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;
          }
     }
}

感谢您的任何指示。 :)

2 个答案:

答案 0 :(得分:1)

  

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

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

  

第二个问题有点复杂,我相信是实现同样事情的正确方法。

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

答案 1 :(得分:0)

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

我认为最安全的方式是

  1. 定义您认为字符串以及您认为“垃圾”的内容 - 例如“:,!?”是“字符串”还是“垃圾”?
  2. 将最小字符串长度定义为“可读”字符串
  3. 解析文件,查找长度为&gt; =最小值的每组char。 我知道,这很无聊,但我认为这是唯一安全的方式。祝你好运!
相关问题