Как десериализовать protobufs без файла proto?

У меня есть сгенерированные классы десериализации и я могу генерировать образцы protobufs (байтовые буферы). Но у меня нет файлов .proto. Мне нужно прекратить использовать эти сгенерированные классы, потому что они поступают из сторонней библиотеки, которая может быть неподдерживаемой и недоступной. Как мне самому разобрать байтовые буферы?

Я считал:

  • Обратный инжиниринг двоичного формата
    • Создание большого количества буферов и их анализ
    • возможно с отладчик и сторонние классы
    • Обратная компиляция классов Java для получения некоторого (уродливого) исходного кода (но рефакторинг автогенерированного кода кажется плохой идеей).
  • Создание файлов .proto из файлов классов (не уверен, возможно ли это)
  • Обычно считывайте protobufs без файла .proto и без автогенерированного кода, но я не уверен, что в буферах достаточно встроенных метаданных, чтобы это было возможно.

Как это может быть сделано?

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

UninformedUser 31.10.2018 14:09

Да это правда. Здесь мое преимущество в том, что у меня есть сгенерированные файлы, и я могу работать с ними в отладчике. И я могу генерировать байтовые буферы с множеством различных входных данных для обратного проектирования (даже самые непрозрачные двоичные форматы можно реконструировать с определенными усилиями). Ищу советы, как это сделать.

Joshua Fox 31.10.2018 14:11

вы можете делать предположения, но одни и те же последовательности байтов могут представлять диапазон различных значений в зависимости от исходной схемы. Fixed-32 может быть числом с плавающей запятой или целым числом; varint может быть подписанным, беззнаковым или зигзагообразным знаком и может быть 32-битным или 64-битным; значение с префиксом длины может быть упакованным массивом, строкой или вложенным сообщением; и так далее...

UninformedUser 31.10.2018 14:11

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

Joshua Fox 31.10.2018 14:19
1
4
534
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Буферы протокола имеют довольно мощную рефлексию. Взгляните на дескрипторы сообщений здесь.

Дескрипторы сообщений содержат всю информацию об определенном типе сообщения, поэтому вы сможете определить все возможные поля оттуда. Вы можете получить дескриптор непосредственно из прото-сообщения, используя:

your_proto_message.getDescriptorForType()

Или используя

ProtoMessageClass.getDescriptor()

Если представление файла .proto - это все, что вам нужно, вы можете просто вызвать .toProto() для дескриптора. Подробнее здесь.

Итак, подведем итоги:

ProtoMessageClass.getDescriptor().toProto().toString()

И toString () дает содержимое прототипа: ProtoMessageClass.getDescriptor (). ToProto (). ToString ()

Joshua Fox 04.11.2018 13:51

@JoshuaFox Отредактировал мой ответ, чтобы включить ваш комментарий, спасибо!

Michał 07.11.2018 23:08

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