Protobuf - это формат сериализации, разработанный Google, и используемый в растущем числе Android, Web, Desktop и большего количества приложений. Он состоит из языка для объявления структур данных , который затем собирается в код или другой вид структуры в зависимости от целевой реализации.
PBTK ( Protobuf Toolkit ) представляет собой полноценный набор сценариев, доступный через унифицированный графический интерфейс, который предоставляет две основные функции:
Извлечение структур Protobuf из программ , преобразование их обратно в читаемые .proto s, поддерживая различные реализации:
Редактирование, воспроизведение и нечеткие данные, отправляемые в конечные точки 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.py
Следующие сценарии также можно использовать отдельно, без графического интерфейса:
./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 в качестве данных POST по 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 и заполняет некоторую информацию о вашей конечной точке.
Вы также можете дать некоторые образцы необработанных данных Protobuf, которые были отправлены в эту конечную точку, захваченную через Mitmproxy или Wireshark, и вы вставьте в шестигранную форму.
Шаг 3 о забавной части нажатия кнопок и просмотра того, что происходит! У вас есть представление дерева, представляющее каждое поле в структуре Protobuf (повторные поля суффиксу «+», требуемые поля нет флажков).
Просто наведите поле, чтобы сосредоточиться. Если поле является целочисленным типом, используйте колесо мыши, чтобы увеличить/уменьшить его. Информация Enum также появляется на Hover.
Вот! Вы можете определить значение каждого поля с этим. Если вы извлеките.
Счастливого возвращения! ? ?
Установки PBTK извлечены .proto Информация в ~/.pbtk/protos/ (или %APPDATA%pbtkprotos в Windows).
Вы можете перемещаться, перемещаться, переименовать, редактировать или стирать данные из этого каталога непосредственно через ваш обычный браузер и текстовый редактор, это ожидаемый способ сделать это и не мешать PBTK.
Конечные точки на основе HTTP хранятся в ~/.pbtk/endpoints/ как объекты 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, настоящим и т. Д.) Я, скорее всего, выбрал бы что-то в противном случае.
Не существует формализованного правила для письма о названии проекта, правило просто следование вашему сердцу ❤