Как декодировать двоичные / необработанные данные google protobuf
У меня есть coredump с закодированными данными protobuf, и я хочу декодировать эти данные и посмотреть содержимое. У меня есть файл.proto, который определяет это сообщение в буфере необработанного протокола. Мой прото-файл выглядит так:
$ cat my.proto
message header {
required uint32 u1 = 1;
required uint32 u2 = 2;
optional uint32 u3 = 3 [default=0];
optional bool b1 = 4 [default=true];
optional string s1 = 5;
optional uint32 u4 = 6;
optional uint32 u5 = 7;
optional string s2 = 9;
optional string s3 = 10;
optional uint32 u6 = 8;
}
И проток версия:
$ protoc --version
libprotoc 2.3.0
Я пробовал следующее:
Дамп сырых данных из ядра
(gdb) dump memory b.bin 0x7fd70db7e964 0x7fd70db7e96d
Передай его протоку
//proto file (my.proto) is in the current dir
$ protoc --decode --proto_path=$pwd my.proto < b.bin
Missing value for flag: --decode
To decode an unknown message, use --decode_raw.
$ protoc --decode_raw < /tmp/b.bin
Failed to parse input.
Есть мысли о том, как его расшифровать? Документация мало что объясняет, как это сделать.
Изменить: данные в двоичном формате (10 байт)
(gdb) x/10xb 0x7fd70db7e964
0x7fd70db7e964: 0x08 0xff 0xff 0x01 0x10 0x08 0x40 0xf7
0x7fd70db7e96c: 0xd4 0x38
2 ответа
Ты использовал --decode_raw
правильно, но ваш ввод не является протобуфом.
За --decode
Вам необходимо указать имя типа, например:
protoc --decode header my.proto < b.bin
Однако если --decode_raw
сообщает об ошибке разбора, чем --decode
будет тоже.
Казалось бы, байты, которые вы извлекли через gdb, не являются действительными протобуфами. Возможно, ваши адреса не совсем верны: если вы добавили или удалили байт с любого конца, он, вероятно, не будет анализироваться.
Отмечу, что по указанным вами адресам протобуф имеет длину всего 9 байтов, что достаточно только для трех или четырех полей, которые нужно установить. Это то, что вы ожидаете? Возможно, вы могли бы разместить байты здесь.
РЕДАКТИРОВАТЬ:
10 байт, которые вы добавили в свой вопрос, успешно декодируются с использованием --decode_raw
:
$ echo 08ffff01100840f7d438 | xxd -r -p | protoc --decode_raw
1: 32767
2: 8
8: 928375
Перекрестно ссылаясь на номера полей, получим:
u1: 32767
u2: 8
u6: 928375
protoc --decode [message_name] [.proto_file_path] < [binary_file_path]
,
где
- [message_name] - это имя объекта сообщения в файле.proto. Если сообщение находится внутри пакета в файле.proto, используйте
package_name.message_name
, - [.proto_file_path] - это путь к файлу.proto, в котором определено сообщение.
- [binary_file_path] - это путь к файлу, который вы хотите декодировать.
Пример ситуации в вопросе (при условии, что my.proto
а также b.bin
находятся в вашем текущем рабочем каталоге):
protoc --decode header my.proto < b.bin
Proto файл:
syntax = "proto3";
package response;
// protoc --gofast_out=. response.proto
message Response {
int64 UID
....
}
use protoc:
protoc --decode=response.Response response.proto < response.bin
protoc --decode=[package].[Message type] proto.file < protobuf.response