Program sederhana yang dapat mengurai gumpalan yang dikodekan Google Protobuf (versi 2 atau 3) tanpa mengetahui definisi yang menyertainya. Ini akan mencetak representasi isinya yang bagus dan berwarna. Contoh:
Seperti yang Anda lihat, nama bidang jelas hilang, bersama dengan beberapa detail tingkat tinggi seperti:
Namun protobuf-inspector sering kali mampu menebak struktur pesan dengan benar. Saat ia menemukan data biner yang tertanam di suatu bidang, ia akan mencoba menguraikannya terlebih dahulu sebagai pesan. Jika gagal, data akan ditampilkan sebagai string atau hexdump. Itu bisa membuat kesalahan, terutama dengan potongan kecil.
Ini menunjukkan bidang sesuai urutan pengkodeannya dalam wire, sehingga dapat berguna bagi mereka yang ingin mengenal format wire atau pengembang parser, selain rekayasa balik.
Anda dapat menginstal dengan pip:
pip install protobuf-inspector
Ini menginstal perintah protobuf_inspector
. Jalankan, beri makan gumpalan protobuf di stdin:
protobuf_inspector < my-protobuf-blob
Setelah membaca analisis blob (buta) pertama, Anda biasanya mulai mendefinisikan beberapa bidang sehingga protobuf-inspector dapat mengurai blob Anda dengan lebih baik, hingga Anda mencapai titik di mana Anda memiliki definisi protobuf lengkap dan parser tidak lagi harus melakukannya tebak apa pun.
Baca tentang mendefinisikan bidang di sini.
Jika kesalahan penguraian ditemukan, penguraian akan berhenti di dalam bidang tersebut , namun tidak akan terpengaruh di luar hierarki. Pelacakan tumpukan akan dicetak ke tempat tujuan isi bidang, bersama dengan hexdump yang menunjukkan di mana penguraian dihentikan dalam potongan tersebut, jika berlaku.
Jadi, jika Anda menentukan uint32
dan ditemukan varian yang lebih besar, Anda akan mendapatkan sesuatu seperti:
Jika Anda menentukan bahwa beberapa bidang berisi pesan yang disematkan, tetapi ditemukan data yang tidak valid di sana, Anda akan mendapatkan:
Harap perhatikan bahwa main.py
akan keluar dengan status bukan nol jika terjadi satu atau lebih kesalahan penguraian.
Ada beberapa trik yang dapat Anda gunakan untuk menghemat waktu saat mendekati blob:
Jika Anda yakin bahwa suatu varint tidak menggunakan pengkodean zig-zag, namun masih tidak yakin dengan penandatanganannya, biarkan sebagai varint
. Jika menggunakan pengkodean zig-zag, gunakan sint64
kecuali Anda yakin itu 32-bit dan bukan 64-bit.
Jika suatu bongkahan salah dikenali sebagai packed chunk
atau pesan tersemat, atau jika Anda melihat sesuatu yang aneh dengan pesan yang diurai dan ingin melihat byte mentah, tentukan jenis bytes
. Sebaliknya, jika karena alasan tertentu pesan tersebut tidak terdeteksi sebagai pesan tersemat padahal seharusnya, paksa message
tersebut untuk melihat alasannya.
Jika Anda ingin mengekstrak data mentah potongan ke file untuk menganalisisnya dengan lebih baik, tentukan jenis dump
dan protobuf-inspector akan membuat dump.0
, dump.1
, dll. setiap kali ia menemukan gumpalan yang cocok.
protobuf-inspector mem-parsing gumpalan sebagai pesan bertipe root
, tapi itu hanya default. Jika Anda memiliki banyak tipe pesan yang ditentukan, Anda bisa meneruskan nama tipe sebagai argumen opsional, dan protobuf-inspector akan menggunakannya sebagai ganti root
:
protobuf_inspector request < my-protobuf-blob
Contoh sederhana:
from protobuf_inspector . types import StandardParser
parser = StandardParser ()
with open ( 'my-blob' , 'rb' ) as fh :
output = parser . parse_message ( fh , "message" )
print ( output )
Proyek ini awalnya tidak dirancang untuk digunakan sebagai perpustakaan, dan API-nya mungkin berubah. Untuk contoh yang lebih kompleks, lihat protobuf_inspector/__main__.py
.