protobuf协议逆向解析

VSole2021-09-23 18:43:30

前言

在app抓包的过程中,我们会发现有些app的数据也是存在加密的,抓到的数据是一堆乱码。无法来解析数据。

常见的对于数据的加密方式有三种:

1 第一种是利用常见加密算法,诸如AES等算法,对响应数据进行加密。

2 第二种是利用第三方厂商的协议进行数据序列化,常见的有xml、json、Fastjson、protobuf等。

3 第三种是自己的“私有协议”,自己编写的不开源的协议,进行数据序列化。

这三种方式逆向难度是逐级递增的,特别是私有协议,那完全是搞不清楚的话,头发都掉没了也解不开。

所以为了保护头发,本次给大家分享的是第二种,利用第三方厂商的数据序列化方案,protobuf的数据泛解析。

protobuf流程

对于protobuf的数据序列化,开发师傅们更懂一些,简单介绍一下protobuf,protobuf 是 Google 开发的一套数据存储传输协议。通过将结构化的数据进行序列化,进而来实现数据存储或者是RPC数据交换的功能。

序列化:将数据结构或对象转换成二进制串的过程

反序列化:将在序列化过程中产生的二进制串再转换成数据结构或者对象的过程

首先,protobuf会定义一个.proto文件,其中包括了要传输的字段,字段的数据类型、数据的嵌套关系。

然后定义完成后,protobuf官方工具会编译这个语法文件,使其变成代码,然后根据这个代码来做数据序列化与反序列化。

这个过程在app中的体现就是,服务器端用生成的代码,将明文序列化,然后变成密文,返回到app端。

app客户端就会利用生成的代码,将密文反序列化后,在服务器端解密成明文。

for example:

传输如下类似的数据,

{  'name':"火线安全", //名称  'id':303,  //编号  'mail':"@huoxian.cn" //邮箱    {    'tel':"13111111111"    'type':2   //私人 or 公司    }
}

定义的.proto文件则如下所示

syntax = "proto3"   //固定
message Person {
  string name=1;  int32 id =2;  string mail=3;    enum PhoneType{  MOBILE = 0;  HOME = 1;  WORK = 2;  }
  message PhoneNumber{ //嵌套一个message    string number = 1;  PhoneType type = 2;    }  repeated PhoneNumber phones = 4; }
message AddressBook{  repeated Person people = 1;}

然后利用这个.proto文件来进行后续的序列化和反序列化操作。

逆向分析

对于正向过程来说,有了.proto文件,也有了序列化代码。很轻松,但是对于逆向过程来说,如何分析得到这个.proto文件则是最重要。

这类信息一般是在java层中,普遍的逆向过程是,根据url进行关键词搜索也可以直接利用hook的方式进行寻找。hook的话定位快。

展示一下之前某app的proto文件,因为封装做的很好,所以可以直接重写就可以了。(重申一下,这是网图,网图,不是我分析的)

类似上面那样就可以直接重写了。

当然如果想要根据protobuf提供的官方工具直接解密的话,可以根据解密后的信息来一步一步填充.proto文件。

拿上面那个例子来说,最后肯定是这样一个

  1:"火线安全", //名称  2:303,  //编号  3:"@huoxian.cn" //邮箱    4{    1:"13111111111"    2:2   //家庭 or 公司    }
}

那还原一下就是这样

message Ts1 {
  string field1=1;  int32 field2 =2;  string field3=3;  
  message Ts2{ //嵌套一个message    string field1 = 1;  int32 field2 = 2;    }  repeated Ts2 ts2 = 4; }
message TT{  repeated Ts1 ts1 = 1;}

可以对比一下。手动还原就是这么个思路。当然了,也可以利用脚本来进行这个操作。

https://github.com/SeeFlowerX/frida-protobuf

总结

该方法可以应对可能响应包中会有一些敏感信息泄露,或者是爬虫来进行数据爬取时,对于乱码数据的解密。

protobufprotobuf数据类型
本作品采用《CC 协议》,转载必须注明作者和本文链接
protobuf协议逆向解析
2021-09-23 18:43:30
在app抓包的过程中,我们会发现有些app的数据也是存在加密的,抓到的数据是一堆乱码。无法来解析数据。
近日有研究人员发现,MMRat新型安卓银行恶意软件利用protobuf 数据序列化这种罕见的通信方法入侵设备窃取数据。
GraphFuzz是一个用于构建结构感知、库API模糊器的实验性框架。
JSON 拥有许多优点,使之成为最广泛使用的序列化协议之一。此外,JSON 具备 JavaScript 的先天性支持,被广泛应用于 Web Browser 的应用场景中,并且是 Ajax 的事实标准协议。这种语言被称为接口描述语言,采用IDL撰写的协议约定称之为IDL文件。
仅限安卓平台,测试安卓7、8、9、10、11、12、13 可用 ;无视所有证书校验或绑定,不用考虑任何证书的事情;通杀TCP/IP四层模型中的应用层中的全部协议;通杀协议包括:Http,WebSocket,Ftp,Xmpp,Imap,Smtp,Protobuf等等、以及它们的SSL版本;通杀所有应用层框架,包括HttpUrlConnection、Okhttp1/3/4、Retrofit/Volle
一名安全研究人员发现了Cue Health公司家用COVID-19检测试剂盒的一个漏洞,可能会让用户伪造结果。Cue Health的COVID-19检测试剂盒是一种蓝牙操作的分子测试,可以在20分钟内检测出阳性标本。该系统使用鼻拭子测试冠状病毒,鼻拭子被插入一个一次性盒中,由电池供电的Cue阅读器进行分析,然后通过蓝牙将结果传送到接受测试者手机上的Cue Health应用程序。
通过查阅相关资料得知虚幻引擎是通过'UNetDriver'进行网络交互的,而'UNetDriver'是在'UWorld'下,那么我们就需要对游戏先进行sdk dump拿到实例化对象。
0x0概述 近年来,老式勒索病毒依旧活跃,而新型勒索病毒花样百出,深信服安全云脑就捕获到一款具有“地方特色”的勒索病毒,其加密后缀为.beijing。及lock_XXX文件; 勒索提示文档: 遍历目录下所有文件; 打开待加密文件; 重命名为*.beijing; 使用AES算法加密; 文件末尾写入二次加密后的AES密钥 完成加密后自删除。
CS:GO 从0到0day!
2023-05-31 14:30:11
,并详细介绍了4种不同的逻辑漏洞。公共研究众所周知,该公司并不是第一个在CS:GO游戏中寻找漏洞的组织,因此,可以在互联网上搜索到很多有用的博文和PPT。专门下载旧版本,但同时该功能似乎已被 Valve 公司禁用。为了全面测试并制定漏洞利用策略,该组织决定用 Python 实现自己早期阶段的服务器。函数将字符串的长度限制为 256 个字符,从而从文件名中截断不需要
APP 聊天协议逆向
2023-04-07 09:46:21
环境主机:win10手机:Pixel 4 ,Android 10APP版本:V4.70.0工具IDA、JADX、Frida、Charles、WireShark逆向思路总结:猜流量抓包分析聊天数据一般都为TCP传输,所以直接使用WireShark抓包。经过不断观察以下特征数据很像聊天数据:接下来的思路就是Hook libc.so 的send函数,打印调用堆栈。查壳、脱壳未查到,那就先将APK拖进JADX里进行分析。Frida Hook撸起袖子就准备直接开干,Frida Server已启动,直接运行。不出意外的意外,Process terminated。再次跟进去,发现了重点胖揍对象。再次发起Frida魔法攻击。result结果即为TCP data。
VSole
网络安全专家