Protobuf adalah format serialisasi yang dikembangkan oleh Google dan digunakan dalam peningkatan jumlah android, web, desktop, dan lebih banyak aplikasi. Ini terdiri dari bahasa untuk mendeklarasikan struktur data , yang kemudian dikompilasi ke kode atau jenis struktur lain tergantung pada implementasi target.
PBTK ( Protobuf Toolkit ) adalah satu set skrip penuh, dapat diakses melalui GUI terpadu, yang menyediakan dua fitur utama:
Mengekstraksi Struktur Protobuf dari Program , Mengubahnya kembali menjadi .Proto S, mendukung berbagai implementasi:
Mengedit, memutar ulang data yang dikirim ke titik akhir jaringan protobuf, melalui antarmuka grafis yang berguna yang memungkinkan Anda untuk mengedit live bidang untuk pesan protobuf dan melihat hasilnya.
PBTK membutuhkan Python ≥ 3,5, Pyqt 5, Python-Protobuf 3, dan beberapa program yang dapat dieksekusi (Chromium, Jad, Dex2Jar ...) untuk menjalankan skrip ekstraktor.
Pengguna Archlinux dapat menginstal langsung melalui paket:
$ yay -S pbtk-git
$ pbtk
Pada sebagian besar distribusi lainnya, Anda ingin menjalankannya secara langsung:
# 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 juga didukung (dengan modul yang sama diperlukan). Setelah Anda menjalankan GUI, itu harus memperingatkan Anda tentang apa yang Anda lewatkan tergantung pada apa yang Anda coba lakukan.
GUI dapat dibatasi melalui skrip utama:
./gui.py
Script berikut juga dapat digunakan mandiri, tanpa 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]
Katakanlah Anda merekayasa aplikasi Android terbalik. Anda menjelajahi sedikit aplikasi dengan dekompiler favorit Anda, dan mengira itu mengangkut protobuf sebagai data pos di atas https dengan cara yang khas.
Anda membuka PBTK dan disambut dengan cara yang bermakna:
Langkah pertama adalah membuat .Protos Anda ke format teks. Jika Anda menargetkan aplikasi Android, mampir di APK dan menunggu harus melakukan pekerjaan ajaib! (Kecuali itu implementasi yang sangat eksotis)
Ini sedang dilakukan, Anda melompat ke ~/.pbtk/protos/<your APK name> (baik melalui baris perintah, atau tombol di bagian bawah layar selamat datang untuk membuka browser file Anda, cara yang Anda inginkan). Semua Aplikasi .protos memang ada di sini.
Kembali ke dekompiler Anda, Anda menemukan kelas yang membuat data yang dikirim ke titik akhir HTTPS yang menarik minat Anda. Ini membuat serial pesan protobuf dengan memanggil kelas yang terbuat dari kode yang dihasilkan.
Kelas terakhir ini harus memiliki pasangan yang sempurna di dalam direktori .protos Anda (yaitu com.foo.bar.ab akan cocok dengan com/foo/bar/a/b.proto ). Either way, grepping namanya harus memungkinkan Anda untuk merujuknya.
Itu bagus: hal berikutnya adalah langkah 2 , memilih input yang Anda inginkan .proto, dan mengisi beberapa informasi tentang titik akhir Anda.
Anda juga dapat memberikan beberapa contoh data protobuf mentah, yang dikirim ke titik akhir ini, ditangkap melalui mitmproxy atau wireshark, dan bahwa Anda akan menempel dalam bentuk yang dikodekan hex.
Langkah 3 adalah tentang bagian yang menyenangkan dari mengklik tombol dan melihat apa yang terjadi! Anda memiliki tampilan pohon yang mewakili setiap bidang dalam struktur protobuf (bidang yang diulang dijulur dengan "+", bidang yang diperlukan tidak memiliki kotak centang).
Cukup arahkan lapangan untuk memiliki fokus. Jika bidang adalah tipe integer, gunakan roda mouse untuk menambah/mengurangi. Informasi enum juga muncul di hover.
Ini dia! Anda dapat menentukan arti dari setiap bidang dengan itu. Jika Anda mengekstraksi .Protos dari kode yang lebih kecil, Anda dapat mengganti nama bidang sesuai dengan apa yang Anda perhatikan, dengan mengklik nama mereka.
Senang membalikkan! ? ?
PBTK Stores Diekstraksi .Proto Informasi ke ~/.pbtk/protos/ (atau %APPDATA%pbtkprotos di windows).
Anda dapat pindah, pindah, mengganti nama, mengedit atau menghapus data dari direktori ini secara langsung melalui browser file dan editor teks Anda, itu adalah cara yang diharapkan untuk melakukannya dan tidak akan mengganggu PBTK.
Titik akhir berbasis http disimpan ke dalam objek ~/.pbtk/endpoints/ sebagai JSON. Objek -objek ini adalah array dari pasangan informasi permintaan/respons, yang terlihat seperti ini:
[ {
"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 menggunakan dua jenis modul pluggable secara internal: ekstraktor, dan transportasi.
Ekstraktor didefinisikan dalam extractors/*.py . Mereka didefinisikan sebagai metode yang didahului oleh dekorator, seperti ini:
@ 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. Transportasi didefinisikan dalam utils/transports.py . Mereka didefinisikan sebagai kelas yang didahului oleh dekorator, seperti ini:
@ 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 )Berikut ini bisa datang untuk rilis lebih lanjut:
Saya telah mencoba melakukan yang terbaik untuk menghasilkan kode yang dapat dibaca dan dikomentari secara menyeluruh (kecuali untuk bagian-bagian yang sebagian besar menggambarkan diri sendiri, seperti menghubungkan sinyal GUI) untuk sebagian besar modul, sehingga Anda dapat berkontribusi.
Karena PBTK menggunakan PYQT, ia dirilis di bawah lisensi GNU GPL (saya, dengan ini, dll.) Saya mungkin akan memilih sesuatu seperti domain publik sebaliknya.
Tidak ada aturan formal untuk kasus huruf dari nama proyek, aturannya hanya tentang mengikuti hati Anda ❤