一、抓取请求
以下是请求的大致内容:
是乱码,需要解析。
二、解析
通过分析 request
和 response
的 Content-Type: application/x-protobuf
得知:使用了谷歌的 protobuf 协议来传输数据,需要破解。
大致破解过程:
乱码 --> protobuf 数据 --> protobuf 文件 --> Java实体类 --> 序列化与反序列化 --> 传输数据。
三、破解
1. 获取 request
和 response
源文件
使用抓包工具 Fiddler 保存该请求的 request
和 response
源文件。不能直接复制 request Payload
和 response body
数据。直接复制的是富文本内容,我们需要的是原始的二进制数据。
2. 下载 Protoc
下载地址
下载解压之后,配置环境变量,路径配置到 bin
目录。
需要的两个控制台命令:
protoc --decode_raw < filename
--命令一protoc --java_out=./ filename
--命令二
3. 获取 protobuf 原始数据
使用命令一,对 request
和 response
源文件操作。就会把 protobuf 原始数据打印到控制台。
4. 获取 protobuf 文件
这一步比较难,需要大致掌握 protobuf
语法,根据 protobuf
原始数据手动逆向出 protobuf
文件,并不断正向测试,修正 protobuf
文件。
官网文档由于是谷歌域名,所以被墙无法访问。
只能看些其他的网络资源
5. 生成 Java 实体类
使用命令二,对手动生成的 proto
文件操作。
在文件中需要加两行:
option java_package = "com.xxx.xxxx.xxxxx";
option java_outer_classname = "Filename";
会在 proto
文件同目录下,生成一个 com/xxx/xxxx/xxxxx/Filename.java
文件。
6. 序列化与反序列化
把该实体类放到工程内对应的目录下,在 pom
文件中加两个依赖,对应 protoc
版本。
<!-- Protoc相关依赖 -->
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.23.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.23.1</version>
<scope>runtime</scope>
</dependency>
序列化并传输:
ProtoBuf.Message.Builder builder = ProtoBuf.Message.newBuilder();
builder.setF1();
builder.setF2();
ProtoBuf.Message data = builder.build();
byte[] payLoad = data.toByteArray();
HttpRequest request = HttpRequest.post(url).body(payLoad);
反序列化:
ProtoBuf.Message msg = ProtoBuf.Message.parseFrom(data);