Поиск шаблонов в двоичных файлах - PullRequest
0 голосов
/ 07 марта 2011

Я работаю над небольшим проектом на C, где мне нужно проанализировать двоичный файл недокументированного формата файла. Поскольку я довольно новичок в C, у меня есть два вопроса к более опытным программистам.

Первый кажется легким. Как извлечь все строки из двоичного файла и поместить их в массив? В основном я ищу простую реализацию программы strings на языке C.

Когда я открываю бинарный файл в любом текстовом редакторе, я получаю много мусора с некоторыми читаемыми строками. Я могу извлечь эти строки используя строки в командной строке Теперь я хотел бы сделать что-то подобное в 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 ]

1 голос
/ 07 марта 2011

Первый кажется легким. Как извлечь все строки из двоичного файла и поместить их в массив?

Определите, какой диапазон символов представляет печатные символы ASCII. Выполните итерацию по файлу, проверяя, являются ли символы символами ASCII, и подсчитывая количество соседних символов ASCII. По умолчанию strings будет обрабатывать последовательности из четырех или более символов как строки; когда вы найдете следующий не-ASCII символ, проверьте, не превышено ли число; если это так, выведите строку. Нужна бухгалтерия.

Вторая проблема немного сложнее и, я считаю, является правильным способом достижения того же самого.

Ваш псевдокод по существу правильный. Вы можете вручную сравнить содержимое buffer[i] с целым числом (например, 2). Чтение байта так же просто, как увеличение i. Убедитесь, что вы не переполняете буфер, и убедитесь, что массив, в который вы читаете строку, достаточно велик (если параметр размера составляет всего один байт, вы можете избежать использования буфера массива длиной 255).

0 голосов
/ 07 марта 2011

Я не уверен, что ваше решение будет работать: что если вы найдете строку длиной 350 символов? Числа могут быть частью строки, или вы можете считать их "мусором"?

Я думаю, что самый безопасный способ -

  1. Определите, что вы считаете строкой, а что мусором - например, ":!?" такое "строка" или "мусор"?
  2. Определить минимальную длину строки, которая будет считаться «читаемой» строкой
  3. Анализировать файл, ища каждую группу символов с длиной> = минимум. Я знаю, это скучно, но я думаю, что это единственный безопасный способ. Удачи!
...