安卓逆向脱壳||Google Protobuf 序列化请求逆向

    技术2023-08-07  65

    谷歌序列化语法文档 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.

     

     

    Processed: 0.009, SQL: 9