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

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

二、APP谷歌protobuf 研究

博主研究的app最新版是梆梆企业级加壳,低版本是最新版360,都还引入了同盾的设备指纹做风控,想要的功能没有差别。相比较难度最终选择了低版本。最新版360利用Fdex2脱出的dex无法进行反编译。通过其他方法拿到dex后,通过全局hook,定位到了这段代码

mRequest是正常z字段格式

 

调用toByteArray()方法完成了序列化

只需要仿照上面写的example,注意属性的包含关系和序号,正常序列化请求很容易实现。由于涉及一些app的利益,博客写的比较模糊,有什么问题可以私信博主解答。

如涉及相关利益,请联系博主删除文章。QQ:1458342294.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的protobuf序列是一种将数据结构转为字节流的方法,以便在网络传输、存储或在不同平台之间传递数据。它基于Googleprotobuf (Protocol Buffers)协议,能够高效地序列和反序列复杂的数据结构。 在Unity中使用protobuf序列需要进行以下几个步骤: 1. 定义消息结构:首先需要在.proto文件中定义要序列的数据结构。这包括定义消息的字段、枚举、嵌套消息等。可以指定每个字段的类型(整数、浮点数、字符串等)和标签(用于标识字段的唯一性)等信息。 2. 编译.proto文件:使用protobuf编译器将.proto文件编译为相应语言的代码。在Unity中可以使用Protobuf-net等第三方插件来生成C#代码。 3. 序列数据:在需要序列数据的地方,将数据按照定义好的消息结构进行赋值,并使用protobuf提供的方法将其序列为字节流。 4. 反序列数据:在接收端或需要解析数据的地方,使用protobuf提供的方法将字节流反序列为消息对象,然后可以通过读取字段的方式获取其中的数据。 使用unity protobuf序列的好处是: 1. 空间效率高:protobuf采用二进制格式进行序列,可以将数据压缩为较小的字节流,减少网络传输和存储的空间成本。 2. 速度快:protobuf序列和反序列速度较快,可以更有效地处理大量的数据。 3. 跨平台兼容性好:使用protobuf序列后的数据可以在不同平台、不同语言之间共享和传输,无需担心兼容性问题。 总之,Unity中的protobuf序列是一种在网络传输和数据存储中高效、方便的数据序列方法,可以帮助开发者更好地处理数据结构和跨平台数据传输的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值