Простая программа, которая может анализировать большие двоичные объекты, закодированные Google Protobuf (версии 2 или 3), не зная их сопутствующего определения. Он напечатает красивое цветное изображение их содержимого. Пример:
Как видите, имена полей явно потеряны вместе с некоторыми деталями высокого уровня, такими как:
Но protobuf-inspector в большинстве случаев способен правильно угадать структуру сообщения. Когда он находит в поле встроенные двоичные данные, он сначала пытается проанализировать их как сообщение. Если это не удастся, данные отобразятся в виде строки или шестнадцатеричного дампа. Он может допускать ошибки, особенно с небольшими кусками.
Он показывает поля именно в том порядке, в котором они закодированы в проводе, поэтому он может быть полезен для тех, кто хочет познакомиться с форматом провода или разработчиками синтаксического анализатора, а также для обратного проектирования.
Вы можете установить с помощью pip:
pip install protobuf-inspector
Это установит команду protobuf_inspector
. Запустите его, подав объект protobuf на стандартный ввод:
protobuf_inspector < my-protobuf-blob
После прочтения первого (слепого) анализа большого двоичного объекта вы обычно начинаете определять некоторые поля, чтобы protobuf-inspector мог лучше анализировать ваши большие двоичные объекты, пока не дойдете до момента, когда у вас есть полное определение protobuf и синтаксическому анализатору больше не нужно угадай что-нибудь.
Прочтите об определении полей здесь.
Если обнаружена ошибка синтаксического анализа, синтаксический анализ прекратится внутри этого поля , но продолжится без изменений за пределами иерархии. Трассировка стека будет напечатана там, где будет располагаться содержимое поля, вместе с шестнадцатеричным дампом, указывающим, где в этом фрагменте был остановлен анализ, если это применимо.
Итак, если вы указали uint32
и найден больший вариант, вы получите что-то вроде:
Если вы указали, что какое-то поле содержит встроенное сообщение, но там были обнаружены недопустимые данные, вы получите:
Обратите внимание, что main.py
завершит работу с ненулевым статусом, если произойдет одна или несколько ошибок синтаксического анализа.
Есть несколько приемов, которые можно использовать, чтобы сэкономить время при приближении к капле:
Если вы уверены, что varint не использует зигзагообразную кодировку, но все еще не уверены в подписи, оставьте его как varint
. Если он использует зигзагообразную кодировку, используйте sint64
если вы не уверены, что он 32-битный, а не 64-битный.
Если чанк ошибочно распознается как packed chunk
или внедренное сообщение, или если вы видите что-то странное в проанализированном сообщении и хотите увидеть необработанные байты, укажите тип bytes
. И наоборот, если по какой-то причине оно не обнаруживается как встроенное сообщение, а должно, принудительно отправите message
чтобы увидеть причину.
Если вы хотите извлечь необработанные данные фрагмента в файл для его лучшего анализа, укажите тип dump
, и protobuf-inspector будет создавать dump.0
, dump.1
и т. д. каждый раз, когда найдет соответствующий объект.
protobuf-inspector анализирует большой двоичный объект как сообщение типа root
, но это просто значение по умолчанию. Если у вас определено много типов сообщений, вы можете передать имя типа в качестве необязательного аргумента, и protobuf-inspector будет использовать его вместо root
:
protobuf_inspector request < my-protobuf-blob
Простой пример:
from protobuf_inspector . types import StandardParser
parser = StandardParser ()
with open ( 'my-blob' , 'rb' ) as fh :
output = parser . parse_message ( fh , "message" )
print ( output )
Однако этот проект изначально не был разработан для использования в качестве библиотеки, и его API может измениться. Более сложный пример см. в protobuf_inspector/__main__.py
.