谷歌序列化语法文档 https://colobu.com/2017/03/16/Protobuf3-language-guide/
现在某些app数据加密不仅仅使用常规的加密算法,还会使用一些协议对数据序列化后进行传输,最近就遇到一个采用Google 的 Protobuf 对登录等请求的参数和响应进行了序列化传输,charles和fiddler抓包显示乱码,mitmproxy集成了Protobuf协议,可以解码正常显示。
mitmproxy抓包
一、python安装和实现Protobuf的example
windows系统下载两个文件protobuf-python-3.5.1.zip和protoc-3.5.1-win32.zip解压后在protobuf-python-3.5.1\protobuf-3.5.1\python目录下运行下面命令进行编译
python setup.py
build python setup.py
install python setup.py test
将protoc.exe放在protobuf-python-3.5.1\protobuf-3.5.1\src下,同时配置环境变量,终端可以使用。前者包含协议序列化数据的一些文件,后者用来用来编译proto文件。通过一个example,我们看看如何使用。
1、使用 protobuf 首先需要定义一个 examplepb.proto文件,内容如下
syntax = "proto3";
message Student{
string name = 1;
int32 id = 2;
string sex = 3;
message Performance{
string sbuject = 4;
string score = 5;
}
repeated Performance performance = 4;
}
message School{
string name = 6;
}
message Examplepb{
string age = 1;
repeated Student student = 2;
repeated School school = 3;
}
2、examplepb.proto同级目录下运行命令 protoc examplepb.proto --python_out=./ 会生成 examplepb_pb2.py文件
3、新建xulihua.py编写序列化代码,fanxuliehua.py 反序列化代码
# -*- coding: utf-8 -*-
from example_protobuf import examplepb_pb2
data_pb = examplepb_pb2.Examplepb()
student = data_pb.student.add()
school = data_pb.school.add()
data_pb.age = "18"
student.name = "张xxxxxx"
student.id = 10080
student.sex = 'men'
pfm = student.performance.add()
pfm.sbuject = "math"
pfm.score = "98"
school.name = "xxxxx university"
print(data_pb.SerializeToString())
with open("example.bin", 'wb') as f:
f.write(data_pb.SerializeToString())
# -*- coding: utf-8 -*-
from example_protobuf import examplepb_pb2
data_pb = examplepb_pb2.Examplepb()
student = data_pb.student.add()
school = data_pb.school.add()
def ListExample(data_pb):
print(data_pb.age)
for person in data_pb.student:
print(person.name)
print(person.id)
print(person.sex)
for pf in person.performance:
print(pf.sbuject)
print(pf.score)
for sh in data_pb.school:
print(sh.name)
with open("example.bin", 'rb') as f:
data_pb.ParseFromString(f.read())
ListExample(data_pb)
上面这些一个完整的谷歌序列化和反序列化数据的过程,操作完就知道逆向app的谷歌序列化协议关键就是proto文件的编写
二、APP谷歌protobuf 研究
博主研究的app最新版是梆梆企业级加壳,低版本是最新版360,都还引入了同盾的设备指纹做风控,想要的功能没有差别。相比较难度最终选择了低版本。最新版360利用Fdex2脱出的dex无法进行反编译。通过其他方法拿到dex后,通过全局hook,定位到了这段代码
mRequest是正常z字段格式
调用toByteArray()方法完成了序列化
只需要仿照上面写的example,注意属性的包含关系和序号,正常序列化请求很容易实现。由于涉及一些app的利益,博客写的比较模糊,有什么问题可以私信博主解答。
如涉及相关利益,请联系博主删除文章。QQ:1458342294.