ProtoBufは、Googleが開発し、Android、Web、デスクトップ、およびその他のアプリケーションの数を増やすシリアル化形式です。データ構造を宣言するための言語で構成され、ターゲットの実装に応じてコードまたは別の種類の構造にコンパイルされます。
PBTK( Protobuf Toolkit )は、統合されたFrightsのセットであり、統一されたGUIを介してアクセス可能で、2つの主要な機能を提供します。
プロトブフ構造をプログラムから抽出し、それらを読み取り可能な.protoに戻し、さまざまな実装をサポートします。
編集、リプレイ、およびファジングデータは、 ProtoBufメッセージのライブフィールドを編集して結果を表示できる便利なグラフィカルインターフェイスを介して、ProtoBufネットワークエンドポイントに送信されます。
PBTKには、抽出器スクリプトを実行するには、Python≥3.5、Pyqt 5、Python-Protobuf 3、および実行可能ファイルプログラム(Chromium、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アプリケーションをリバースエンジニアリングしてください。お気に入りの逆コンパイラを使用してアプリケーションを少し調査し、典型的な方法でhttpsのポストデータとしてProtobufを輸送すると考えました。
あなたはPBTKを開き、意味のある方法で迎えられます:
最初のステップは、.protosをテキスト形式にすることです。 Androidアプリをターゲットにしている場合は、APKをドロップして待機する必要があります。 (それが本当にエキゾチックな実装でない限り)
これにより、 ~/.pbtk/protos/<your APK name>にジャンプします(コマンドラインまたはウェルカム画面の下部にあるボタンを介して、ファイルブラウザを開きます。すべてのアプリの.protosは確かにここにあります。
逆コンパイラに戻って、あなたが興味を持っているHTTPSエンドポイントに送信されたデータを構築するクラスに出くわしました。生成されたコードで作られたクラスを呼び出すことにより、ProtoBufメッセージをシリアル化します。
この後者のクラスは、.protosディレクトリ内で完全に一致する必要があります(つまり、 com.foo.bar.ab com/foo/bar/a/b.protoと一致します)。いずれにせよ、その名前をグレッピングすると、参照できるようになります。
それは素晴らしいことです。次はステップ2になり、目的の入力.protoを選択し、エンドポイントに関する情報を入力します。
また、MitmproxyまたはWiresharkを介してキャプチャされたこのエンドポイントに送信された、RAW Protobufのサンプルデータを提供することもできます。
ステップ3は、ボタンをクリックして何が起こるかを見ることの楽しい部分についてです!プロトブフ構造内のすべてのフィールドを表すツリービューがあります(繰り返されるフィールドは「+」で接尾辞が付けられ、必須フィールドにはチェックボックスがありません)。
焦点を合わせるためにフィールドをホバリングするだけです。フィールドが整数タイプの場合は、マウスホイールを使用してインクリメント/デクリメントします。列挙情報もホバーに表示されます。
ここにあります!それを使用して、すべてのフィールドの意味を決定できます。 Minified Codeから.Protosを抽出した場合、名前をクリックすることで、それらが意味することに応じてフィールドを変更できます。
ハッピーリバーシング! ? ?
PBTKストアは、.proto情報を~/.pbtk/protos/ (またはWindows上の%APPDATA%pbtkprotos )に抽出しました。
通常のファイルブラウザとテキストエディターを介して、このディレクトリからのデータを移動、移動、変更、編集、編集、または消去できます。これは、それを行うための期待される方法であり、PBTKに干渉しません。
HTTPベースのエンドポイントは~/.pbtk/endpoints/ in 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は、抽出器と輸送という2種類のプラグ可能なモジュールを内部的に使用します。
抽出器は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、これなど)の下でリリースされます。
プロジェクト名の文字ケースに正式なルールはありません。ルールはあなたの心を追っているだけです❤