簡單的程序,可以解析 Google Protobuf 編碼的 blob(版本 2 或 3),而無需知道其附帶的定義。它將列印出其內容的漂亮的彩色表示。例子:
正如您所看到的,字段名稱以及一些高級詳細資訊顯然丟失了,例如:
但 protobuf-inspector 大多數時候都能正確猜測訊息結構。當它發現字段上嵌入的二進位資料時,它會首先嘗試將其解析為訊息。如果失敗,它會將資料顯示為字串或十六進位轉儲。它可能會犯錯誤,尤其是小塊時。
它僅按照字段在線路中編碼的順序顯示字段,因此除了逆向工程之外,它對於想要熟悉線路格式或解析器開發人員的人也很有用。
您可以使用 pip 安裝:
pip install protobuf-inspector
這將安裝protobuf_inspector
命令。運行它,在 stdin 上提供 protobuf blob:
protobuf_inspector < my-protobuf-blob
在閱讀 blob 的第一次(盲)分析後,您通常會開始定義一些字段,以便 protobuf-inspector 可以更好地解析您的 blob,直到您擁有完整的 protobuf 定義並且解析器不再需要猜任何東西。
在此閱讀有關定義欄位的資訊。
如果發現解析錯誤,解析將在該欄位內停止,但在層次結構外部將繼續進行,不受影響。堆疊追蹤將列印在欄位內容所在的位置,以及指示該區塊中解析停止位置的十六進位轉儲(如果適用)。
因此,如果您指定了uint32
並且找到了更大的 varint,您會得到類似以下內容的資訊:
如果您指定某個欄位包含嵌入訊息,但在那裡發現了無效數據,您將得到:
請注意,如果發生一個或多個解析錯誤, main.py
將以非零狀態退出。
在接近斑點時,您可以使用一些技巧來節省時間:
如果您確定 varint不使用 zig-zag 編碼,但仍不確定符號性,請將其保留為varint
。如果它確實使用 zig-zag 編碼,請使用sint64
除非您確定它是 32 位元而不是 64 位元。
如果一個區塊被錯誤地識別為packed chunk
或嵌入訊息,或者如果您在解析的訊息中看到一些奇怪的東西並且想要查看原始字節,請指定bytes
類型。相反,如果由於某種原因它沒有被檢測為嵌入訊息(而它應該被檢測到),則強制它發送message
以查看原因。
如果您想將區塊的原始資料提取到檔案中以便更好地分析它,請指定dump
類型,protobuf-inspector 每次找到匹配的 blob 時都會建立dump.0
、 dump.1
等。
protobuf-inspector 將 blob 解析為root
類型的訊息,但這只是預設值。如果定義了許多訊息類型,則可以傳遞類型名稱作為可選參數,protobuf-inspector 將使用它而不是root
:
protobuf_inspector request < my-protobuf-blob
簡單的例子:
from protobuf_inspector . types import StandardParser
parser = StandardParser ()
with open ( 'my-blob' , 'rb' ) as fh :
output = parser . parse_message ( fh , "message" )
print ( output )
不過,該專案最初並不是為用作程式庫而設計的,其 API 可能會發生變化。有關更複雜的範例,請參閱protobuf_inspector/__main__.py
。