前言
在app抓包的过程中,我们会发现有些app的数据也是存在加密的,抓到的数据是一堆乱码。无法来解析数据。
常见的对于数据的加密方式有三种:
第一种是利用常见加密算法,诸如AES等算法,对响应数据进行加密。
第二种是利用第三方厂商的协议进行数据序列化,常见的有xml、json、Fastjson、protobuf等。
第三种是自己的“私有协议”,自己编写的不开源的协议,进行数据序列化。
这三种方式逆向难度是逐级递增的,特别是私有协议,那完全是搞不清楚的话,毛都掉没了也解不开。
所以为了保护头发,本次给大家分享的是第二种,利用第三方厂商的数据序列化方案,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;
}
可以对比一下。手动还原就是这么个思路。当然了,也可以利用脚本来进行这个操作。[地址][0]
总结
该方法可以应对可能响应包中会有一些敏感信息泄露,或者是爬虫来进行数据爬取时,对于乱码数据的解密。