โปรแกรมง่ายๆ ที่สามารถแยกวิเคราะห์ blobs ที่เข้ารหัสของ Google Protobuf (เวอร์ชัน 2 หรือ 3) โดยไม่ต้องทราบคำจำกัดความที่มาพร้อมกัน มันจะพิมพ์เนื้อหาที่สวยงามและมีสีสัน ตัวอย่าง:
อย่างที่คุณเห็น ชื่อฟิลด์หายไปอย่างเห็นได้ชัด พร้อมด้วยรายละเอียดระดับสูงบางอย่าง เช่น:
แต่ตัวตรวจสอบ protobuf สามารถเดาโครงสร้างข้อความได้อย่างถูกต้องเกือบตลอดเวลา เมื่อพบข้อมูลไบนารีที่ฝังอยู่ในฟิลด์ อันดับแรกจะพยายามแยกวิเคราะห์เป็นข้อความ หากไม่สำเร็จก็จะแสดงข้อมูลเป็นสตริงหรือการถ่ายโอนข้อมูลฐานสิบหก สามารถทำผิดพลาดได้ โดยเฉพาะกับชิ้นเล็กๆ
โดยจะแสดงฟิลด์ตามลำดับที่เข้ารหัสใน wire ดังนั้นจึงมีประโยชน์สำหรับผู้ที่ต้องการทำความคุ้นเคยกับรูปแบบ wire หรือผู้พัฒนา parser นอกเหนือจากวิศวกรรมย้อนกลับ
คุณสามารถติดตั้งด้วย pip:
pip install protobuf-inspector
สิ่งนี้จะติดตั้งคำสั่ง protobuf_inspector
เรียกใช้โดยป้อน protobuf blob บน stdin:
protobuf_inspector < my-protobuf-blob
หลังจากอ่านการวิเคราะห์ Blob ครั้งแรก (ตาบอด) โดยทั่วไปคุณจะเริ่มกำหนดฟิลด์บางส่วนเพื่อให้ Protobuf-inspector สามารถแยกวิเคราะห์ Blob ของคุณได้ดีขึ้น จนกว่าคุณจะไปถึงจุดที่คุณมีคำจำกัดความของ Protobuf แบบเต็มและ Parser ไม่ต้องอีกต่อไป เดาอะไรก็ได้
อ่านเกี่ยวกับการกำหนดฟิลด์ที่นี่
หากพบข้อผิดพลาดในการแยกวิเคราะห์ การแยกวิเคราะห์จะหยุด ภายในฟิลด์นั้น แต่จะดำเนินต่อไปโดยไม่มีผลกระทบที่ด้านนอกของลำดับชั้น การติดตามสแต็กจะถูกพิมพ์ในตำแหน่งที่เนื้อหาฟิลด์จะไป พร้อมกับการถ่ายโอนข้อมูลฐานสิบหกที่ระบุว่าการแยกวิเคราะห์ถูกหยุดในส่วนนั้น ถ้ามี
ดังนั้น หากคุณระบุ uint32
และพบตัวแปรที่ใหญ่กว่า คุณจะได้สิ่งที่ต้องการ:
หากคุณระบุว่าบางฟิลด์มีข้อความฝังอยู่ แต่พบข้อมูลที่ไม่ถูกต้อง คุณจะได้รับ:
โปรดทราบว่า main.py
จะออกโดยมีสถานะไม่เป็นศูนย์ หากเกิดข้อผิดพลาดในการแยกวิเคราะห์อย่างน้อย 1 ข้อ
มีเทคนิคบางอย่างที่คุณสามารถใช้เพื่อประหยัดเวลาเมื่อเข้าใกล้ Blob:
หากคุณแน่ใจว่า varint ไม่ได้ ใช้การเข้ารหัสแบบซิกแซก แต่ยังไม่แน่ใจในลายเซ็น ให้ปล่อยไว้เป็น varint
หากใช้การเข้ารหัสแบบซิกแซก ให้ใช้ sint64
เว้นแต่คุณจะแน่ใจว่าเป็นแบบ 32 บิต ไม่ใช่ 64 บิต
หากระบบรับรู้อันผิดพลาดว่าเป็นอัน packed chunk
หรือข้อความที่ฝังไว้ หรือหากคุณเห็นสิ่งแปลก ๆ ในข้อความที่แยกวิเคราะห์และต้องการดูไบต์ดิบ ให้ระบุประเภทของ bytes
ในทางกลับกัน หากไม่ถูกตรวจพบว่าเป็นข้อความที่ฝังไว้ด้วยเหตุผลบางประการ และควรบังคับให้ส่ง message
เพื่อดูเหตุผล
หากคุณต้องการแยกข้อมูลดิบของก้อนข้อมูลไปยังไฟล์เพื่อวิเคราะห์ได้ดีขึ้น ให้ระบุประเภทของ dump
และ protobuf-inspector จะสร้าง dump.0
, dump.1
ฯลฯ ทุกครั้งที่พบหยดที่ตรงกัน
protobuf-inspector แยกวิเคราะห์หยดเป็นข้อความประเภท 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