如何解压/解压原始grpc数据?

问题描述 投票:0回答:1

我拦截了 grpc http2 请求,但我无法理解 mitmproxy 将其打印为十六进制的数据,这是一些标头

te: trailers
content-type: application/grpc
grpc-accept-encoding: identity,deflate,gzip
accept-encoding: identity,gzip

但是数据没有任何意义我在cyberchef上尝试了gunzip,它一直说“Gunzip - 无效的文件签名:”我尝试了protobuf解码器,它说“错误:缓冲区耗尽” 有什么想法我应该如何处理这个问题吗?

编辑: 这是我试图解压缩的数据

\x12
\x10\xb8z =P\xdeCw\x89\x1e}\xbb\x8c*\x1f\x11\x10\xff\xc7\xa0\xad\xaa\xd9\xbe\xcf\xb6\x01\x1a\x16
\x14
\x12
\x10>D_.\x9bd\\\x7f\x88\xbc\xd0\x00}\xab')"\x0b\x10\x01"\x05\x12\x03
\x01E8\x02"

这是 mitmproxy 成功解压的另一条 protobuf 消息

(
&\x12$3e445f2e-9b64-5c7f-88bc-**

这是2个解压后的数据

1 {
  1 {
    2: 3e445f2e-9b64-5c7f-88bc-**
  }
}
encryption compression protocol-buffers grpc packing
1个回答
2
投票

gRPC 协议在本文档中定义。特别是,有关“长度前缀消息”的部分描述了数据的编码方式:

长度前缀消息项目的重复序列在数据帧中传递

  • 长度前缀消息 → 压缩标志消息长度消息
  • 压缩标志 → 0 / 1 # 编码为 1 字节无符号整数
  • 消息长度 → {消息长度} # 编码为 4 字节无符号整数(大端)
  • 消息 → *{二进制八位组}

换句话说,要读取消息,请读取 1 个字节的压缩位,然后读取 4 个字节的长度,然后读取那么多字节的消息。如果设置了压缩位,则需要使用“grpc-encoding”标头中描述的格式解压缩消息。那么消息的格式是特定于应用程序的。 Protobuf 很常见。

© www.soinside.com 2019 - 2024. All rights reserved.