@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
=@@@@
@@@@
@@@@
@@@@ @@@@
@@@@ @@@@@
@@@@@ @@@@@
@@@@@ @@@@@
:@@@@ *@@@@
@@@@ :@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@= @@@@
@`
[deroad's blog]
[home]
# 2019-11-06 | radare2 - protobuf
{
Today I've release, for radare2, raw protocol buffers decoding.
It's quite easy to use, just type pFb @ 0x1234 and it will print the decoded protobuf.
protocol buffer decoding in C:
/* protocol buffers are a series of key-value pairs.
* each key-value is encoded in a single byte.
* this byte is encoded as follows. */
typedef struct _proto_head {
uint8_t wire : 3;
uint8_t number : 5;
} __attribute__((packed)) proto_head_t;
/* wire is the type of the data in the next bytes,
* number is the id that you define in the .proto files for a key-value pair.
* all the possible values of wire can be found below */
#define WIRE_VARINT 0 // int32, int64, uint32, uint64, sint32, sint64, bool, enum
#define WIRE_64_BIT 1 // fixed64, sfixed64, double
#define WIRE_LEN_DELIM 2 // string, bytes, embedded messages, packed repeated fields
#define WIRE_START_GRP 3 // groups (deprecated)
#define WIRE_END_GRP 4 // groups (deprecated)
#define WIRE_32_BIT 5 // fixed32, sfixed32, float
/* WIRE_VARINT is a variable-length code (also known as LEB128) compression to store a large integer in a small number of bytes.
* WIRE_64_BIT is a fixed sized 64 bit number, it can be a [u]int64_t or double
* WIRE_32_BIT is a fixed sized 32 bit number, it can be a [u]int32_t or float
* WIRE_LEN_DELIM can be string, bytes, packed/repeated structs/fields
* WIRE_START_GRP and WIRE_END_GRP are deprecated structures.
*
* strings can be easily spotted in the decoding by checking if the bytes are utf-8 encoded printable chars
* repeated are hard to be spotted since they are arrays of a specific type and look like normal bytes.
* the full implementation i wrote for r2 can be found here: https://github.com/radareorg/radare2/blob/master/libr/util/protobuf.c */
}
# References:
https://developers.google.com/protocol-buffers/docs/encoding