Wie decode binary/raw google protobuf-Daten
Ich wurde ein Speicherabbild mit kodierten protobuf Daten, und ich will zu entschlüsseln dieser Daten und den Inhalt sehen. Ich habe die .proto-Datei, die definiert, diese Botschaft in der raw-Protokoll-Puffer.
Meine proto-Datei sieht wie folgt aus:
$ 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;
}
Und protoc version:
$ protoc --version
libprotoc 2.3.0
Ich habe versucht, die folgenden:
-
Dump der Rohdaten aus dem Kern
(gdb) dump memory b.bin 0x7fd70db7e964 0x7fd70db7e96d
-
Pass es auf 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.
Irgendwelche Gedanken auf, wie Sie zu entschlüsseln? Die Dokumentation erklärt nicht viel, wie man über es.
Bearbeiten:
Daten im Binär-format (10 Byte)
(gdb) x/10xb 0x7fd70db7e964
0x7fd70db7e964: 0x08 0xff 0xff 0x01 0x10 0x08 0x40 0xf7
0x7fd70db7e96c: 0xd4 0x38
InformationsquelleAutor brokenfoot | 2016-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du verwendet
--decode_raw
richtig, aber Ihre Eingabe nicht scheinen, um eine protobuf.Für
--decode
, müssen Sie den Namen eingeben, wie:Jedoch, wenn
--decode_raw
meldet einen parse error als--decode
auch.Scheint es, dass der bytes, die Sie extrahiert haben, über den gdb sind nicht gültig protobuf. Vielleicht ist Ihr die Adressen nicht genau das richtige: wenn Sie Hinzugefügt oder entfernt werden, ein byte an einem Ende, wird es wahrscheinlich nicht analysieren.
Ich beachten Sie, dass nach den Adressen, die Sie angegeben, die protobuf ist nur 9 bytes lang, der ist nur genug Platz für drei oder vier Felder gesetzt werden. Ist es das, was Sie erwarten? Vielleicht könnten Sie schreiben die bytes hier.
EDIT:
Die 10 bytes, die Sie Hinzugefügt, um Ihre Frage erscheinen zu decodieren erfolgreich mit
--decode_raw
:Querverweise auf das Feld Anzahl, erhalten wir:
Es scheint mir, dass die bytes, die Sie gab in der Tat analysieren erfolgreich -- ich bearbeitet habe, von Antwort zu zeigen. Irgendwie
b.bin
muss nicht beendet haben, die genau diese bytes. Diedump memory
Befehl, den Sie gab, wie es aussieht, würde nur dump 9 bytes. Denken Sie daran, dass die dump - nicht enthalten das byte am Ende Adresse -- es enthält bis zum byte unmittelbar vor ihm.Perfekt! Ich war mir nicht bewusst über die memory dump-Befehl auch nicht das Letzte byte in der Ausgabe. Vielen Dank!
Ist es möglich, pass protoc hex statt der binären?
Nein, aber mit dem unix-Kommando
xxd -r -p
decodiert hex zu Binär, so können Sie es in eine pipeline, wie in meiner Antwort. Wenn Sie nicht laufen protoc von einer unix-Befehlszeile, dann haben Sie, um zu kommen mit einigen anderen Lösung...InformationsquelleAutor Kenton Varda
protoc --decode [message_name] [.proto_file_path] < [binary_file_path]
,wo
package_name.message_name
.Beispiel für die situation in der Frage (unter der Annahme, dass
my.proto
undb.bin
sind in Ihrem aktuellen Arbeitsverzeichnis):protoc --decode header my.proto < b.bin
package_name.message_name
war der Schlüssel für mich!InformationsquelleAutor Hemaolle