Как я могу интерпретировать устаревший файл двоичных данных без документации?

StackOverflow https://stackoverflow.com/questions/1801978

  •  05-07-2019
  •  | 
  •  

Вопрос

Данные часто хранится в двоичных файлах, специфичных для программы, для которых имеется мало документации или она отсутствует вообще.Типичным примером в нашей области являются данные, поступающие от прибора, но я подозреваю, что проблема носит общий характер.Какие методы существуют для понимания и интерпретации данных?

Чтобы установить некоторые границы.Файлы не зашифрованы и DRM отсутствуют.Тип и формат файла зависят от автора программы (т.это не «стандартный файл» (например, *.tar), личность которого утеряна).Здесь (вероятно) нет преднамеренного запутывания, но могут быть некоторые любительские попытки сэкономить место.Мы можем предположить, что у нас есть общее представление о том, что представляют собой данные, и мы можем распознать некоторые, но, вероятно, не все поля и массивы.

Предположим, что большая часть данных является числовой, со скалярами и массивами (вероятно, одно- и двумерными, а иногда и нерегулярными или треугольными).Также будут некоторые строки символов, возможно, имена людей, сайты, даты и, возможно, некоторые ключевые слова.В программе будет код, читающий бинарный файл, но у нас нет доступа к исходнику или ассемблеру.Например, он мог быть написан программой VAX Fortran или какой-либо ранней версией Unix или Windows как объекты OLE.Числа могут быть с прямым или прямым порядком байтов (что изначально неизвестно), но они, вероятно, последовательны.У нас могут быть разные версии на разных машинах (например,Крей).

Мы можем предположить, что у нас достаточно большой корпус файлов — скажем, несколько сотен.

Мы можем предположить два сценария:

  1. Мы можем перезапустить программу с другими входными данными, чтобы проводить эксперименты.
  2. Перезапустить программу мы не можем — у нас фиксированный набор документов.Это имеет некое сходство с расшифровкой исторических документов на неизвестном языке (напр.Линейное письмо Б).

Частичное решение может быть приемлемым, т.е.могут быть некоторые поля, которые сейчас не понимает ни один живой человек, но большинство остальных можно интерпретировать.

Меня интересуют только подходы с открытым исходным кодом.

ОБНОВЛЯТЬ Существует связанный вопрос SO (Как перепроектировать форматы двоичных файлов в целях совместимости), но акценты несколько иные.ОБНОВЛЯТЬ Умное предложение от @brianegge по адресу (1).Использовать truss (или возможно strace в Linux), чтобы сбросить все write() и подобные вызовы в программе.Это должно позволить, по крайней мере, собирать записи, записываемые на диск.

Это было полезно?

Решение

Это интересный вопрос, я думаю, что ответ заключается в том, что обратное проектирование двоичных форматов - это приобретенный навык, но есть инструменты, которые могут помочь.

Одним из инструментов является WinOLS , который предназначен для интерпретации и редактирования двоичных изображений компьютера управления двигателем транспортного средства (в основном числовые данные в их таблицах поиска). Он поддерживает различные форматы байтов (хотя я думаю, что это не PDP) и позволяет просматривать данные с различной шириной и смещением, определять области массива (карты) и визуализировать их в 2D или 3D со всеми видами параметров масштабирования и смещения. Он также имеет эвристический / статистический автоматический поиск карт, который может работать для вас.

Это коммерческий инструмент, но бесплатная демоверсия позволит вам сделать все, но сохранить изменения в двоичном файле и использовать функции управления движком, которые вам не нужны. Вы сказали, что заинтересованы только в решениях с открытым исходным кодом, но это Stackoverflow, и кто-то другой может быть не так требователен.

Другие советы

все файлы имеют заголовок. Начните отсюда, посмотрите, какие у вас сходства между двумя файлами, исключите общие " подписи " и работать с различиями. Они должны отмечать количество записей, дату экспорта и тому подобное.

Общие части между двумя заголовками можно просто считать общими подписями, и я думаю, вы можете их игнорировать

Если вы работаете в системе, которая предлагает truss , просто смотрите ваши системные вызовы, чтобы написать, и у вас, вероятно, будет хорошая идея. Также возможно, что программа собирается отобразить файл и скопировать его непосредственно из памяти, но это не так часто.

$ truss -t write echo foo
foowrite(1, " f o o", 3)                                = 3
write(1, "\n", 1)                               = 1

Также может иметь смысл взглянуть на двоичный файл. В системах Unix вы можете использовать objdump для просмотра макета двоичного файла. Это будет указывать на разделы кода и данных. Затем вы можете открыть двоичный файл в шестнадцатеричном редакторе и перейти к определенным смещениям. Возможно, вас заинтересуют мои советы для двоичных файлов Solaris .

  • Сравните 2 или более файлов, чтобы найти сходство.Это часто помогает вам идентифицировать блоки заголовков и различные разделы файла.

  • Порядок байтов обычно довольно легко определить: более значимые байты имеют тенденцию быть равными нулю гораздо чаще, чем менее значащие, поэтому, если вы видите шаблон типа «00 78» или «78 00», вы можете сделать хорошее предположение о какой байт является старшим.Однако это поможет только в том случае, если вы (приблизительно) определили, что представляют собой предыдущие данные, и знаете, как данные выровнены.

  • Ищите легко идентифицируемые данные: в первую очередь следует начинать со строк, поскольку их легко обнаружить.Они часто дают вам подсказки, поскольку обычно встраиваются рядом со связанными данными, используются как стандартные элементы в заголовках и т. д.Если строки имеют кодировку Unicode, вы обычно увидите буквы текста, разделенные нулевыми байтами, что поможет вам определить порядок байтов и выравнивание данных в этой точке данных.

  • Общий подход к формату (например, IFF) заключается в хранении фрагментов данных, каждый из которых имеет небольшой заголовок (например,идентификатор размером 2 или 4 байта, затем размер блока размером 2 или 4 байта, затем данные блока).Обычно люди используют значимые (для них) идентификаторы фрагментов, чтобы их было легко обнаружить. Если вы обнаружите что-то, похожее на тег, проверьте следующие данные, чтобы увидеть, похоже ли это на длину (посмотрите, сколько байтов содержится в данных). чтобы увидеть, похоже ли это на другой заголовок).Если вы сможете определить такой формат, вы разобьете проблему «одного большого файла» на проблему «множества маленьких файлов», что значительно облегчит задачу.(Однако многие данные устройства имеют тенденцию «оптимизироваться», чтобы сделать их компактными, и в этом случае программисты часто выбрасывают удобные расширяемые форматы и сбивают все вместе, упаковывая биты и, как правило, значительно усложняя задачу)

  • Найдите известные значения.Если ваше устройство отображает «температура:40", то вполне возможно, что вы обнаружите это значение, непосредственно сохраненное в файле.(Также часто используются коэффициенты масштабирования или значения с фиксированной точкой, поэтому 40 можно представить как (например) 40*10 = 400 или 40*256 = 10240)

  • Если вы можете достаточно контролировать устройство:создайте несколько простых файлов.То, чего вы пытаетесь достичь, — это наименьшие файлы, которые вы можете извлечь из устройства, чтобы минимизировать объем данных, которые вам нужно изучить.Затем внесите на устройстве изменение, которое приведет к изменению файла (постарайтесь свести к минимуму количество изменений) и снова получите файл.Если формат файла «открытый» (не сжатый и не зашифрованный), вы сможете определить изменившиеся байты.

  • Если вы можете «загружать» файлы обратно на устройство, вы также можете создавать свои собственные файлы, просто изменив одно значение, чтобы посмотреть, заметите ли вы какие-либо изменения в поведении устройства.Если вам удастся достичь простых значений, это может сработать, но часто вы можете обнаружить, что просто нарушаете формат файла, и устройство вообще не сможет прочитать данные.

Я надеялся, что найдется волшебная утилита, которая сможет вырабатывать шаблоны, пробовать разные порядки байтов и т. д. Но этого не происходит!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top