一:抓包,将得到的protobuf数据的hex保存为bin文件,后续使用一下代码,将得到的乱码数据打印出来对应的类型
import blackboxprotobuf
with open("pb.bin", "rb") as f:
data = f.read()
parsed_data = blackboxprotobuf.decode_message(data)
二:得到的类型数据如下:
({'1': 1, '2': 20, '3': 7, '6': {'1': b'csyh_yingyongbao', '2': b'cn.dylovemm.csyh', '3': b'4.79.4(c371).20240202-11:21:34', '4': b'AC3743A8AAA1', '5': b'b4dfadd0-ec97-8b8d-24f0-ec4cf3224c5b', '6': 1, '7': b'9', '10': 2, '11': {}, '12': b'20240516192210c500d0f4018094081117621732c7342201d349bdc12a047d', '14': b'b4dfadd0-ec97-8b8d-24f0-ec4cf3224c5b', '15': b'Pixel', '16': 1, '18': 1565, '21': {}, '22': b'Pixel', '24': b'eca6f6fbac727eb0', '25': 2}}, {'1': {'type': 'int', 'name': ''}, '2': {'type': 'int', 'name': ''}, '3': {'type': 'int', 'name': ''}, '6': {'type': 'message', 'message_typedef': {'1': {'type': 'bytes', 'name': ''}, '2': {'type': 'bytes', 'name': ''}, '3': {'type': 'bytes', 'name': ''}, '4': {'type': 'bytes', 'name': ''}, '5': {'type': 'bytes', 'name': ''}, '6': {'type': 'int', 'name': ''}, '7': {'type': 'bytes', 'name': ''}, '10': {'type': 'int', 'name': ''}, '11': {'type': 'message', 'message_typedef': {}, 'name': ''}, '12': {'type': 'bytes', 'name': ''}, '14': {'type': 'bytes', 'name': ''}, '15': {'type': 'bytes', 'name': ''}, '16': {'type': 'int', 'name': ''}, '18': {'type': 'int', 'name': ''}, '21': {'type': 'message', 'message_typedef': {}, 'name': ''}, '22': {'type': 'bytes', 'name': ''}, '24': {'type': 'bytes', 'name': ''}, '25': {'type': 'int', 'name': ''}}, 'name': ''}})
是一个tuple元组,拿出其中的数据,前面的数据为正常的参数数据,后面的为对应的数据类型,开始编写,test.proto文件,如下:
syntax = "proto3"; // 定义proto的版本
//对应的是第一层的循环数据
message TopicBody {
int32 a1 = 1; // page翻页
int32 a2 = 2; // init返回数据的大小
int32 a3 = 3; // 不知道是啥
TopicBodyKey a6 = 6; // 不知道啥
}
//对应的是方法a6里面的参数定义
message TopicBodyKey {
bytes b1 = 1;
bytes b2 = 2;
bytes b3 = 3;
bytes b4 = 4;
bytes b5 = 5;
int32 b6 = 6;
bytes b7 = 7;
int32 b10 = 10;
TopicBodyKey11 b11 = 11;
bytes b12 = 12;
bytes b14 = 14;
bytes b15 = 15;
int32 b16 = 16;
int32 b18 = 18;
TopicBodyKey21 b21 = 21;
bytes b22 = 22;
bytes b24 = 24;
int32 b25 = 25;
}
//对应a6里面的参数对应
message TopicBodyKey11 {}
message TopicBodyKey21 {}
执行命令:protoc ./test.proto --python_out=./ 第一个为文件路径,第二个为存储路径,执行完成后目录下得到:test_pb2.py
新建py文件,导入该文件,根据规则开始编写数据需要一一对应::
import test_pb2 as pb2
pb1 = pb2.TopicBody() //定义的第一个方法名称,对下面的参数赋值
pb1.a1 = 1
pb1.a2 = 20
pb1.a3 = 7
pb3 = pb2.TopicBodyKey() //定义的第二个方法名称,对下面的参数赋值
pb3.b1 = b'csyh_yingyongbao'
pb3.b2 = b'cn.dylovemm.csyh'
pb3.b3 = b'4.79.4(c371).20240202-11:21:34'
pb3.b4 = b'AC3743A8AAA1'
pb3.b5 = b'b4dfadd0-ec97-8b8d-24f0-ec4cf3224c5b'
pb3.b6 = 1
pb3.b7 = b'9'
pb3.b10 = 2
pb4 = pb2.TopicBodyKey11() //定义的第二个方法名称,对下面的参数赋值
pb3.b11.CopyFrom(pb4) //将该定义赋值给前面方法内部定义的对应参数
pb3.b12 = b'20240516192210c500d0f4018094081117621732c7342201d349bdc12a047d'
pb3.b14 = b'b4dfadd0-ec97-8b8d-24f0-ec4cf3224c5b'
pb3.b15 = b'Pixel'
pb3.b16 = 1
pb3.b18 = 1565
pb5 = pb2.TopicBodyKey21()
pb3.b21.CopyFrom(pb5)
pb3.b22 = b'Pixel'
pb3.b24 = b'eca6f6fbac727eb0'
pb3.b25 = 2
pb1.a6.CopyFrom(pb3)
//将数据格式化
req_bytes_string = pb1.SerializeToString()
//作为data参数传递即可
res = requests.post(url, data=req_bytes_string, verify=False, headers=headers)