Protobuf는 Google에서 개발하고 점점 더 많은 Android, 웹, 데스크탑 및 더 많은 응용 프로그램에 사용되는 직렬화 형식입니다 . 데이터 구조를 선언하기위한 언어 로 구성되며 대상 구현에 따라 코드 또는 다른 종류의 구조로 컴파일됩니다.
PBTK ( Protobuf Toolkit )는 Unified GUI를 통해 액세스 할 수있는 본격적인 스크립트 세트로 두 가지 주요 기능을 제공합니다.
프로그램에서 Protobuf 구조를 추출하여 읽기 가능한 .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 응용 프로그램을 리버스 엔지니어링한다고 가정 해 봅시다. 좋아하는 디 컴파일러로 응용 프로그램을 조금 탐색하고 Protobuf를 전형적인 방식으로 HTTPS를 통해 게시물로 전송한다고 생각했습니다.
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를 선택하고 엔드 포인트에 대한 정보를 채우는 것입니다.
또한 샘플 원시 프로토 부프 데이터를 제공 할 수도 있습니다.
3 단계는 버튼을 클릭하고 어떤 일이 일어나는지 보는 재미있는 부분에 관한 것입니다! Protobuf 구조의 모든 필드를 나타내는 트리 뷰가 있습니다 (반복 된 필드는 "+"로 접미사되며 필수 필드에는 확인란이 없습니다).
초점을 맞추기 위해 필드를 가져 가십시오. 필드가 정수 유형 인 경우 마우스 휠을 사용하여 증가/감소하십시오. 열거 정보는 호버에도 나타납니다.
여기 있습니다! 당신은 그것으로 모든 분야의 의미를 결정할 수 있습니다. 미니저 코드에서 .protos를 추출한 경우 이름을 클릭하여 의미하는 바에 따라 필드 이름을 바꿀 수 있습니다.
행복한 반전! ? ?
PBTK 상점은 .proto 정보를 ~/.pbtk/protos/ (또는 Windows의 %APPDATA%pbtkprotos 로 추출했습니다).
일반 파일 브라우저 및 텍스트 편집기를 통해이 디렉토리에서 데이터를 직접 이동, 이동, 이름 바꾸기, 편집 또는 지우기 위해 이동할 수 있으며,이를 수행하는 방법이며 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/*.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, 이에 따라)에 따라 릴리스되면 공개 도메인과 유사한 것을 선택했을 것입니다.
프로젝트 이름의 편지 사례에 대한 공식화 된 규칙은 없으며, 규칙은 당신의 마음을 따르는 것입니다.