2016-01-27 4 views
3

У меня есть coredump с закодированными данными protobuf, и я хочу декодировать эти данные и посмотреть содержимое. У меня есть .proto-файл, который определяет это сообщение в буфере необработанных протоколов. Мой файл прото выглядит следующим образом:Как декодировать двоичные/необработанные данные goob protobuf

$ 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 версия:

$ protoc --version 
libprotoc 2.3.0 

Я попытался следующие:

  1. дамп исходных данных из ядра

    (gdb) dump memory b.bin 0x7fd70db7e964 0x7fd70db7e96d

  2. Передайте его protoc

    //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.

Любые мысли о том, как в десятичную одеть его? В документации недостаточно объясняется, как это сделать.

Edit: данных в двоичном формате (10 байт)

(gdb) x/10xb 0x7fd70db7e964 
0x7fd70db7e964: 0x08 0xff 0xff 0x01 0x10 0x08 0x40 0xf7 
0x7fd70db7e96c: 0xd4 0x38 

ответ

11

Вы использовали --decode_raw правильно, но ваш вклад не кажется Protobuf.

Для --decode, необходимо указать имя типа, как:

protoc --decode header my.proto < b.bin 

Однако, если --decode_raw сообщает об ошибке синтаксического анализа, чем --decode тоже.

Казалось бы, байты, которые вы извлекли через gdb, не являются действительными protobuf. Возможно, ваши адреса не совсем правильные: если вы добавили или удалили байт с обоих концов, он, вероятно, не будет разбираться.

Отмечу, что в соответствии с указанными вами адресами protobuf имеет длину всего 9 байтов, что является достаточным пространством для трех или четырех полей, которые необходимо установить. Это то, чего вы ожидаете? Возможно, вы можете разместить здесь байты.

EDIT: вы добавили на свой вопрос

В 10 байт появляются для декодирования успешно используют --decode_raw:

$ echo 08ffff01100840f7d438 | xxd -r -p | protoc --decode_raw 
1: 32767 
2: 8 
8: 928375 

Перекрестные ссылки на номера полей, мы получим:

u1: 32767 
u2: 8 
u6: 928375 
+0

Спасибо за ответ, я добавил необработанные байты (10 байтов) в мой вопрос выше. И да, здесь будут установлены только некоторые необязательные поля, поэтому это ожидается. – brokenfoot

+0

@brokenfoot: Мне кажется, что байты, которые вы дали, действительно разбираются успешно - я отредактировал ответ, чтобы показать это. Так или иначе, 'b.bin' не должен был содержать именно эти байты. Команда 'dump memory', которую вы указали, выглядит так, что она сбросит только 9 байтов. Помните, что дамп * не * включает в себя байт на конечном адресе - он включает до байта непосредственно перед ним. –

+0

Отлично! Я не знал о команде памяти дампа, не включая последний байт в выходе. Большое спасибо! – brokenfoot

Смежные вопросы