Comment décoder binaire/raw google protobuf de données
J'ai un coredump avec codées protobuf de données et je veux décoder ces données et voir le contenu. J'ai l' .proto fichier qui définit ce message en raw protocole de la mémoire tampon.
Mon proto fichier ressemble à ceci:
$ 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;
}
Et protoc version:
$ protoc --version
libprotoc 2.3.0
J'ai essayé ce qui suit:
- Dump les données brutes de la base
(gdb) dump memory b.bin 0x7fd70db7e964 0x7fd70db7e96d
- Passer à 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.
Toute réflexion sur la façon de le décoder? La documentation n'est pas d'expliquer en grande partie sur la façon d'aller à ce sujet.
Modifier:
De données dans un format binaire (10 octets)
(gdb) x/10xb 0x7fd70db7e964
0x7fd70db7e964: 0x08 0xff 0xff 0x01 0x10 0x08 0x40 0xf7
0x7fd70db7e96c: 0xd4 0x38
OriginalL'auteur brokenfoot | 2016-01-27
Vous devez vous connecter pour publier un commentaire.
Vous avez utilisé
--decode_raw
correctement, mais vos commentaires ne semble pas être un protobuf.Pour
--decode
, vous devez spécifier le nom du type, comme:Toutefois, si
--decode_raw
signale une erreur d'analyse que--decode
aussi.Il semblerait que les octets que vous avez extrait via gdb ne sont pas valides protobuf. Peut-être vos adresses ne sont pas exactement à droite: si vous avez ajouté ou supprimé d'un octet à la fin, il ne sera probablement pas analyser.
Je note que, selon les adresses que vous avez spécifié, le protobuf n'est que de 9 octets de long, qui est seulement assez d'espace pour trois ou quatre des champs à définir. Est-ce que vous attendez? Vous pourriez peut-être poster les octets ici.
EDIT:
10 octets que vous avez ajouté à votre question semble décoder avec succès à l'aide de
--decode_raw
:Renvois aux numéros de champ, on obtient:
Il me semble que les octets que vous avez donné, en fait, d'analyser avec succès-j'ai édité en réponse à cette fin. En quelque sorte
b.bin
ne doit pas avoir fini contenant exactement les octets. Ledump memory
commande vous a donné dirait qu'il serait seul dump 9 octets. Rappelez-vous que le dump n' pas inclure l'octet à l'adresse de fin -- il comprend jusqu'à l'octet immédiatement avant qu'il.Parfait! Je n'étais pas au courant à propos de la décharge de la mémoire de commande non compris le dernier octet de la sortie. Merci beaucoup!
Est-il possible de passer protoc hex au lieu de le binaire?
Non, mais la commande unix
xxd -r -p
décode hex binaire, de sorte que vous pouvez l'utiliser dans une canalisation, comme indiqué dans ma réponse. Si vous n'exécutez pas le protoc à partir d'une ligne de commande unix, alors vous aurez à venir avec une autre solution...OriginalL'auteur Kenton Varda
protoc --decode [message_name] [.proto_file_path] < [binary_file_path]
,où
package_name.message_name
.Exemple pour la situation en question (en supposant que
my.proto
etb.bin
sont dans votre répertoire de travail en cours):protoc --decode header my.proto < b.bin
package_name.message_name
a été la clé pour moi!OriginalL'auteur Hemaolle