Protobuf เป็นรูปแบบการทำให้เป็นอนุกรม ที่พัฒนาโดย Google และใช้ในการเพิ่มจำนวนของ Android, Web, Desktop และแอปพลิเคชันอื่น ๆ ประกอบด้วย ภาษาสำหรับการประกาศโครงสร้างข้อมูล ซึ่งจะถูกรวบรวมเป็นรหัสหรือโครงสร้างประเภทอื่นขึ้นอยู่กับการใช้งานเป้าหมาย
PBTK ( Protobuf Toolkit ) เป็นชุดสคริปต์เต็มรูปแบบที่สามารถเข้าถึงได้ผ่าน GUI แบบครบวงจรซึ่งมีคุณสมบัติหลักสองประการ:
การแยกโครงสร้าง protobuf ออกจากโปรแกรม แปลงกลับเป็น . proto s ที่อ่านได้สนับสนุนการใช้งานที่หลากหลาย:
การแก้ไขการเล่นซ้ำและการฟัซซิงข้อมูล ที่ส่งไปยังจุดสิ้นสุดเครือข่าย Protobuf ผ่านอินเทอร์เฟซกราฟิกที่มีประโยชน์ที่ช่วยให้คุณแก้ไขฟิลด์สดสำหรับข้อความ protobuf และดูผลลัพธ์
PBTK ต้องการ Python ≥ 3.5, Pyqt 5, Python-Protobuf 3 และโปรแกรมปฏิบัติการจำนวนหนึ่ง (โครเมียม, JAD, Dex2jar ... ) สำหรับการใช้สคริปต์สกัด
ผู้ใช้ Archlinux สามารถติดตั้งได้โดยตรงผ่านแพ็คเกจ:
$ yay -S pbtk-git
$ pbtk
ในการแจกแจงอื่น ๆ ส่วนใหญ่คุณจะต้องเรียกใช้โดยตรง:
# For Ubuntu/Debian testing derivates:
$ sudo apt install python3-pip git openjdk-9-jre libqt5x11extras5 python3-pyqt5.qtwebengine python3-pyqt5
$ sudo pip3 install protobuf pyqt5 pyqtwebengine requests websocket-client
$ git clone https://github.com/marin-m/pbtk
$ cd pbtk
$ ./gui.pyWindows ยังรองรับ (ด้วยโมดูลเดียวกัน) เมื่อคุณเรียกใช้ GUI มันควรเตือนคุณเกี่ยวกับสิ่งที่คุณขาดหายไปขึ้นอยู่กับสิ่งที่คุณพยายามทำ
GUI สามารถใช้งานได้ผ่านสคริปต์หลัก:
./gui.py
สคริปต์ต่อไปนี้สามารถใช้แบบสแตนด์อโลนได้โดยไม่ต้องใช้ GUI:
./extractors/jar_extract.py [-h] input_file [output_dir]
./extractors/from_binary.py [-h] input_file [output_dir]
./extractors/web_extract.py [-h] input_url [output_dir]
สมมติว่าคุณเป็นแอปพลิเคชัน Android ย้อนกลับ คุณสำรวจแอปพลิเคชั่นเล็กน้อยด้วย decompiler ที่คุณชื่นชอบและคิดว่ามันขนส่ง protobuf เป็นข้อมูลโพสต์ผ่าน HTTPs ในวิธีทั่วไป
คุณเปิด PBTK และได้รับการต้อนรับอย่างมีความหมาย:
ขั้นตอนแรกคือการรับ. protos ของคุณเป็นรูปแบบข้อความ หากคุณกำลังกำหนดเป้าหมายแอพ Android การวาง APK และการรอคอยควรทำงานเวทย์มนตร์! (เว้นแต่จะเป็นการใช้งานที่แปลกใหม่จริงๆ)
สิ่งนี้ทำคุณข้ามไปที่ ~/.pbtk/protos/<your APK name> (ไม่ว่าจะผ่านบรรทัดคำสั่งหรือปุ่มที่ด้านล่างของหน้าจอต้อนรับเพื่อเปิดเบราว์เซอร์ไฟล์ของคุณตามที่คุณต้องการ) แอพทั้งหมดของแอพพลิเคชั่นทั้งหมดอยู่ที่นี่
ย้อนกลับไปใน decompiler ของคุณคุณสะดุดกับชั้นเรียนที่สร้างข้อมูลที่ส่งไปยังจุดสิ้นสุด HTTPS ที่คุณสนใจ มันทำให้ข้อความ Protobuf เป็นอนุกรมโดยเรียกคลาสที่สร้างจากรหัสที่สร้างขึ้น
ชั้นหลังนี้ควรมีการจับคู่ที่สมบูรณ์แบบภายในไดเรกทอรี. protos ของคุณ (เช่น com.foo.bar.ab จะตรงกับ com/foo/bar/a/b.proto ) ไม่ว่าจะด้วยวิธีใด Grepping ชื่อของมันควรช่วยให้คุณสามารถอ้างอิงได้
เยี่ยมมาก: สิ่งต่อไปคือ ขั้นตอนที่ 2 เลือกอินพุตที่คุณต้องการ proto และกรอกข้อมูลบางอย่างเกี่ยวกับจุดสิ้นสุดของคุณ
นอกจากนี้คุณยังอาจให้ตัวอย่างข้อมูล Raw Protobuf ที่ถูกส่งไปยังจุดสิ้นสุดนี้จับผ่าน Mitmproxy หรือ Wireshark และคุณจะวางในรูปแบบที่เข้ารหัสแบบหกเหลี่ยม
ขั้นตอนที่ 3 เป็นส่วนที่สนุกของการคลิกปุ่มและดูว่าเกิดอะไรขึ้น! คุณมีมุมมองต้นไม้ที่แสดงทุกฟิลด์ในโครงสร้าง protobuf (ฟิลด์ซ้ำจะถูกต่อท้ายโดย "+" ฟิลด์ที่จำเป็นไม่มีช่องทำเครื่องหมาย)
เพียงเลื่อนสนามไปโฟกัส หากฟิลด์เป็นประเภทจำนวนเต็มให้ใช้ล้อเมาส์เพื่อเพิ่ม/ลดลง ข้อมูล enum ปรากฏบนโฮเวอร์ด้วย
นี่คือ! คุณสามารถกำหนดความหมายของทุกสาขาด้วยนั้น หากคุณดึง. protos ออกจากรหัสที่เล็กคุณสามารถเปลี่ยนชื่อฟิลด์ตามสิ่งที่คุณสังเกตเห็นว่าพวกเขาหมายถึงโดยคลิกที่ชื่อของพวกเขา
มีความสุขย้อนกลับ! - -
PBTK เก็บข้อมูล. proto ลงใน ~/.pbtk/protos/ (หรือ %APPDATA%pbtkprotos บน Windows)
คุณสามารถย้ายเข้าย้ายเปลี่ยนชื่อแก้ไขหรือลบข้อมูลจากไดเรกทอรีนี้โดยตรงผ่านเบราว์เซอร์ไฟล์ปกติและตัวแก้ไขข้อความซึ่งเป็นวิธีที่คาดหวังในการทำและจะไม่รบกวน PBTK
จุดสิ้นสุดที่ใช้ HTTP จะถูกเก็บไว้ในวัตถุ ~/.pbtk/endpoints/ AS JSON วัตถุเหล่านี้เป็นอาร์เรย์ของข้อมูลการร้องขอ/การตอบกลับซึ่งมีลักษณะเช่นนี้:
[ {
"request" : {
"transport" : "pburl" ,
"proto" : "www.google.com/VectorTown.proto" ,
"url" : "https://www.google.com/VectorTown" ,
"pb_param" : "pb" ,
"samples" : [ {
"pb" : "!...." ,
"hl" : "fr"
} ]
} ,
"response" : {
"format" : "other"
}
} ] PBTK ใช้โมดูลที่สามารถเสียบได้สองแบบภายใน: สารสกัดและการขนส่ง
Extractors ถูกกำหนดไว้ใน extractors/*.py พวกเขาถูกกำหนดให้เป็นวิธีการที่นำหน้าด้วยมัณฑนากรเช่นนี้:
@ register_extractor ( name = 'my_extractor' ,
desc = 'Extract Protobuf structures from Foobar code (*.foo, *.bar)' ,
depends = { 'binaries' : [ 'foobar-decompiler' ]})
def my_extractor ( path ):
# Load contents of the `path` input file and do your stuff...
# Then, yield extracted .protos using a generator:
for i in do_your_extraction_work ():
yield proto_name + '.proto' , proto_contents
# Other kinds of information can be yield, such as endpoint information or progress to display. การขนส่งถูกกำหนดไว้ใน utils/transports.py พวกเขาถูกกำหนดให้เป็นชั้นเรียนที่นำหน้าด้วยมัณฑนากรเช่นนี้:
@ register_transport (
name = 'my_transport' ,
desc = 'Protobuf as raw POST data' ,
ui_data_form = 'hex strings'
)
class MyTransport ():
def __init__ ( self , pb_param , url ):
self . url = url
def serialize_sample ( self , sample ):
# We got a sample of input data from the user.
# Verify that it is valid in the form described through "ui_data_form" parameter, fail with an exception or return False otherwise.
# Optionally modify this data prior to returning it.
bytes . fromhex ( sample )
return sample
def load_sample ( self , sample , pb_msg ):
# Parse input data into the provided Protobuf object.
pb_msg . ParseFromString ( bytes . fromhex ( sample ))
def perform_request ( self , pb_data , tab_data ):
# Perform a request using the provided URL and Protobuf object, and optionally other transport-specific side data.
return post ( url , pb_data . SerializeToString (), headers = USER_AGENT )ต่อไปนี้อาจจะมาเพื่อเผยแพร่เพิ่มเติม:
ฉันพยายามทำให้ดีที่สุดในการสร้างรหัสที่อ่านได้อย่างละเอียดและแสดงความคิดเห็น (ยกเว้นชิ้นส่วนที่ส่วนใหญ่เป็นคำอธิบายตัวเองเช่นการเชื่อมต่อสัญญาณ GUI) สำหรับโมดูลส่วนใหญ่ดังนั้นคุณจึงสามารถมีส่วนร่วมได้
ในฐานะที่เป็น PBTK ใช้ PYQT มันจะถูกปล่อยออกมาภายใต้ใบอนุญาต GNU GPL (I, ที่นี่ ฯลฯ ) ฉันน่าจะเลือกบางสิ่งที่เหมือนโดเมนสาธารณะเป็นอย่างอื่น
ไม่มีกฎที่เป็นทางการสำหรับกรณีจดหมายของชื่อโครงการกฎนั้นเกี่ยวกับการทำตามหัวใจของคุณ❤