Какие-нибудь универсальные утилиты или библиотеки для преобразования шестнадцатеричных дампов в удобочитаемую форму?
-
08-07-2019 - |
Вопрос
Я много работаю с последовательной связью с различными устройствами, и поэтому мне часто приходится анализировать шестнадцатеричные дампы в файлах журналов.В настоящее время я делаю это вручную, просматривая дампы, спецификацию протокола и записывая результаты.Однако это утомительно и чревато ошибками, особенно когда сообщения содержат сотни байт и содержат смеси данных в формате big-endian и little-endian, ASCII, Unicode, сжатие, CRCS, ....
Я написал несколько скриптов на Python, чтобы помочь в более распространенных случаях.Но есть множество протоколов, с которыми нужно иметь дело, и нет смысла тратить время на написание пользовательского скрипта, если я не знаю, что у меня будет много дампов для анализа.
Чего бы я хотел, так это какой-нибудь утилиты, которая могла бы автоматизировать это действие.Так, например, если у меня есть текстовый шестнадцатеричный дамп, подобный этому:
7e ff 00 7b 00 13 86 04
00 41 42 43 44 56 ef 7e
и какое-то описание формата сообщения, например, это:
# Field Size Byte Order Output Format
Flag 1 hex
Address 1 hex
Control 1 hex
DataType 1 decimal
LineIndex 1 decimal
PollAddress 2 msb hex
DataSize 2 lsb decimal
Data (DataSize) ascii
CRC 2 lsb hex
Flag 1 hex
Я бы получил такой результат:
Flag 0x7e
Address 0xff
Control 0x00
DataType 123
LineIndex 0
PollAddress 0x1386
DataSize 4
Data "ABCD"
CRC 0xef56
Flag 0x7e
Аппаратные анализаторы протоколов часто обладают необычными функциями для выполнения подобных задач, но мне нужно работать с текстовыми файлами журналов.
Существует ли какая-либо такая утилита или библиотека?
С тех пор как я установил награду, появилось несколько хороших ответов.Я думаю, щедроты работают!
Wireshark и HexEdit выглядят многообещающе;Я взгляну на них и, вероятно, назначу награду тому, кто удовлетворит моим потребностям.Но я по-прежнему открыт для других идей.
Решение
Wireshark неплохо умеет открывать сетевые протоколы.
Другие советы
Полагаю, вам нужен хороший шестнадцатеричный редактор. Ознакомьтесь с hexedit . Я использовал бесплатную версию в прошлом, и это хорошо, но я не знаю, предлагает ли она то, что вы ищете. По сути, вы хотите иметь возможность определить структуру и затем иметь возможность декодировать шестнадцатеричные данные в нее. Я полагаю, хороший редактор hex поддержит это. Проверьте платную версию HexEdit или Google для другого редактора; Есть много доступных.
Обычно я использую emacs hexl-mode для просмотра двоичных файлов в виде " text-dump " ;. Когда мне нужен более конкретный вывод, я просто делаю как вы и пишу парсер на C ++.
В моей работе мы разрабатывали сетевые и последовательные протоколы для управления встроенным оборудованием. Я также устал от неправильного чтения дампов и написания скриптов для каждого протокола, поэтому я написал библиотеку, которая будет делать именно то, что вы описываете. Вы можете дать ему описание протокола в текстовом файле, и в нем есть графический интерфейс для поддержки отдельных битов, переключатели для выбора между допустимыми комбинациями битов и раскрывающиеся списки, когда вариантов было много. Вы можете отредактировать шестнадцатеричное представление данных, двоичное представление каждого поля или даже указать и щелкнуть поля, и все остальные представления обновятся. Это сэкономило нам кучу времени. Это немного быстро и грязно, но я бы опубликовал его, если бы он не принадлежал моему работодателю. Дело в том, что писать было не очень сложно, и как только я отказался от сценариев для каждого протокола и от одной программы, которая могла бы понять описание протокола, все было замечательно. Мы прекратили провалы, связанные с неправильным чтением дампа, и добавление новых протоколов стало тривиальным. Кроме того, текстовое описание протокола вошло прямо в спецификации разработки, чтобы разработчики программного обеспечения знали, что делать с оборудованием. Я призываю вас попробовать.
Вы должны использовать двоичные команды Tcl для вещей как это. Далее следует отправная точка для вашего примера выше. Tcl действительно легок в изучении и написании сценариев. Если вы занимаетесь последовательной связью, вы обязаны изучить хотя бы основы.
bash$ tclsh
% binary scan [binary format H* 7eff007b00138604004142434456ef7e] \
H2H2H2ccH4sa4h4H2 \
flag1 addr ctl datatype lineidx polladdr datasize data crc flag2
10
% puts "$flag1 $addr $ctl $datatype $lineidx \
$polladdr $datasize $data $crc $flag2"
7e ff 00 123 0 1386 4 ABCD 65fe 7e
Когда вы делали свои байты, вы переключали байты, но не биты, поэтому я не совсем уверен, что вы там искали. В любом случае, это поможет вам начать.
Просмотрите hexworkshop
Я использую его годами для анализа дампов в шестнадцатеричном формате. Он имеет просмотрщик структуры, который позволяет вам определять структуру данных a в стиле C / C ++, а затем отображать данные в этом формате.
WinHex поддерживает отображение / редактирование пользовательских форматов записей. Некоторые примеры можно найти на http://www.x-ways.net/winhex/templates/index.html
Я почти уверен, что видел что-то подобное на CPAN. Я мог бы быть более расплывчатым, если хотите. : -)
Обновление . Это не совсем то, что вам нужно, но посмотрите на Parse :: Binary :: FixedFormat
Существует утилита командной строки BSD, которая называется hexdump
это делается с помощью строк формата (которые могут находиться во внешнем файле).Видишь https://www.suse.com/communities/blog/making-sense-hexdump/ для вступления и, например, https://www.freebsd.org/cgi/man.cgi ?запрос=шестнадцатеричный дамп и раздел=1 для страницы руководства (с особым вниманием к -e
и -f
параметры и раздел, озаглавленный Форматы).