简介

本项目用于辅助逆向开发人员,快速获取和转换Android APP中所使用的protobuf协议的proto文件

当前仅支持基于以下包生成protobuf的相关类

原生通用的脚本编写√

当前转换逻辑可能无法正确处理内部类,但frida_protobuf/configs包含了内部类的信息,如果无法直接转换,请自行处理

特性

原理

环境

安装python包

pip install -r requirements.txt

【可选】安装npm包

有手动编译_agent.js需求

cd agent
npm install
npm run build

使用

手机端开启frida-server

adb push frida-server-14.2.18-android-arm64 /data/local/tmp/fs14218
adb shell
su
chmod +x /data/local/tmp/fs14218
/data/local/tmp/fs14218 -l 0.0.0.0:33333

使用注意

  1. 注入frida脚本,获取proto配置
  2. 将proto的配置文件转换为proto文件
  3. 将proto文件转换为对应的py文件
  4. 样本测试

执行前请删除原来的protos文件夹

当主要proto文件中想额外引用特定的proto时,需要指定对应的包名,多个则使用|隔开,形式如下

--extra-import "package1:proto1,proto2|package2:proto3,proto4"

合理使用--keywords-expected可以避免APP崩溃或卡死

如果存在循环引用的情况,最后转换到py这一步会有问题,请手动处理

如果想知道哪里循环引用了,可以执行一下最后一步转换,会提示出来

案例一

python -m frida_protobuf.main -H 172.16.13.146:22222 -n com.tencent.qqlive --use-default-any --keywords-expected "com.tencent.qqlive.protocol.pb,com.tencent.spp_rpc"
python -m frida_protobuf.generate --proto com.tencent.qqlive.protocol.pb.ChangeSectionResponse --extra-import "com.tencent.qqlive.protocol.pb:Poster,Action,Attent,VideoIdKeyValueSet"
python -m frida_protobuf.proto2py --proto com.tencent.qqlive.protocol.pb.ChangeSectionResponse
python -m frida_protobuf.demo

效果演示

演示视频

案例二

python -m frida_protobuf.main -H 172.16.13.146:22222 -n tv.danmaku.bili --use-default-any --keywords-expected "bili"
python -m frida_protobuf.generate --proto com.bapis.bilibili.app.show.popular.v1.PopularReply
python -m frida_protobuf.proto2py --proto com.bapis.bilibili.app.show.popular.v1.PopularReply
python -m frida_protobuf.demo2

效果演示

效果视频

案例三

python -m frida_protobuf.main -n com.baidu.tieba --use-default-any --keywords-expected "protobuf,tbclient"
python -m frida_protobuf.generate --proto tbclient.GetBubbleList.GetBubbleListResIdl
python -m frida_protobuf.proto2py --proto tbclient.GetBubbleList.GetBubbleListResIdl

补充