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

谷歌序列化语法文档 https://colobu.com/2017/03/16/Protobuf3-language-guide/

现在某些app数据加密不仅仅使用常规的加密算法,还会使用一些协议对数据序列化后进行传输,最近就遇到一个采用Google 的 Protobuf 对登录等请求的参数和响应进行了序列化传输,颇费了一番功夫。

一、python安装和实现Protobuf的example

windows系统下载两个文件protobuf-python-3.5.1.zipprotoc-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文件的编写。未完待续

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章