Programa simple que puede analizar blobs codificados en Google Protobuf (versión 2 o 3) sin conocer la definición que los acompaña. Imprimirá una bonita representación en color de su contenido. Ejemplo:
Como puede ver, los nombres de los campos obviamente se pierden, junto con algunos detalles de alto nivel como:
Pero protobuf-inspector puede adivinar correctamente la estructura del mensaje la mayor parte del tiempo. Cuando encuentra datos binarios incrustados en un campo, primero intentará analizarlos como un mensaje. Si eso falla, mostrará los datos como una cadena o un volcado hexadecimal. Puede cometer errores, especialmente con trozos pequeños.
Muestra los campos justo en el orden en que están codificados en el cable, por lo que puede ser útil para aquellos que quieran familiarizarse con el formato del cable o con los desarrolladores de analizadores, además de la ingeniería inversa.
Puedes instalar con pip:
pip install protobuf-inspector
Esto instala el comando protobuf_inspector
. Ejecútelo, alimentando el blob protobuf en stdin:
protobuf_inspector < my-protobuf-blob
Después de leer el primer análisis (ciego) del blob, normalmente comienza a definir algunos de los campos para que protobuf-inspector pueda analizar mejor sus blobs, hasta llegar a un punto en el que tiene una definición completa de protobuf y el analizador ya no tiene que hacerlo. adivina cualquier cosa.
Lea acerca de la definición de campos aquí.
Si se encuentra un error de análisis, el análisis se detendrá dentro de ese campo , pero no se verá afectado en el exterior de la jerarquía. El seguimiento de la pila se imprimirá donde iría el contenido del campo, junto con un volcado hexadecimal que indica dónde se detuvo el análisis en ese fragmento, si corresponde.
Entonces, si especificaste un uint32
y se encuentra una variante más grande, obtendrías algo como:
Si especificaste que algún campo contenía un mensaje incrustado, pero allí se encontraron datos no válidos, obtendrías:
Tenga en cuenta que main.py
saldrá con un estado distinto de cero si se produjeron uno o más errores de análisis.
Hay algunos trucos que puedes utilizar para ahorrar tiempo al acercarte a un blob:
Si está seguro de que una variante no utiliza codificación en zig-zag, pero aún no está seguro de la firma, déjela como varint
. Si usa codificación en zig-zag, use sint64
a menos que esté seguro de que es de 32 bits y no de 64 bits.
Si un fragmento se reconoce erróneamente como un packed chunk
o un mensaje incrustado, o si ve algo extraño en el mensaje analizado y desea ver los bytes sin procesar, especifique un tipo de bytes
. Por el contrario, si por alguna razón no se detecta como un mensaje incrustado y debería hacerlo, fuercelo a message
para ver el motivo.
Si desea extraer los datos sin procesar de un fragmento a un archivo para analizarlos mejor, especifique un tipo de dump
y protobuf-inspector creará dump.0
, dump.1
, etc. cada vez que encuentre un blob coincidente.
protobuf-inspector analiza el blob como un mensaje de tipo root
, pero eso es solo un valor predeterminado. Si tiene muchos tipos de mensajes definidos, puede pasar un nombre de tipo como argumento opcional, y protobuf-inspector lo usará en lugar de root
:
protobuf_inspector request < my-protobuf-blob
Ejemplo sencillo:
from protobuf_inspector . types import StandardParser
parser = StandardParser ()
with open ( 'my-blob' , 'rb' ) as fh :
output = parser . parse_message ( fh , "message" )
print ( output )
Sin embargo, este proyecto no se diseñó inicialmente para su uso como biblioteca y su API podría cambiar. Para ver un ejemplo más complejo, consulte protobuf_inspector/__main__.py
.