如何 unpack/decompress 原始 grpc 数据?
how to unpack/decompress raw grpc data?
我拦截了 grpc http2 请求,但我无法理解 mitmproxy 将其打印为十六进制的数据,这是 headers
的一部分
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 消息
(
&\x12e445f2e-9b64-5c7f-88bc-**
这是2个解压后的数据
1 {
1 {
2: 3e445f2e-9b64-5c7f-88bc-**
}
}
gRPC 协议在 this document 中定义。特别是关于“Length-Prefixed-Message”的部分描述了数据是如何编码的:
The repeated sequence of Length-Prefixed-Message items is delivered in DATA frames
- Length-Prefixed-Message → Compressed-Flag Message-Length Message
- Compressed-Flag → 0 / 1 # encoded as 1 byte unsigned integer
- Message-Length → {length of Message} # encoded as 4 byte unsigned integer (big endian)
- Message → *{binary octet}
换句话说,要读取消息,读取压缩位的 1 个字节,然后读取长度的 4 个字节,然后读取消息的那么多字节。如果设置了压缩位,您将需要使用“grpc-encoding”header 中描述的格式解压缩邮件。那么消息的格式就是application-specific。 Protobuf 很常见。
我拦截了 grpc http2 请求,但我无法理解 mitmproxy 将其打印为十六进制的数据,这是 headers
的一部分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 消息
(
&\x12e445f2e-9b64-5c7f-88bc-**
这是2个解压后的数据
1 {
1 {
2: 3e445f2e-9b64-5c7f-88bc-**
}
}
gRPC 协议在 this document 中定义。特别是关于“Length-Prefixed-Message”的部分描述了数据是如何编码的:
The repeated sequence of Length-Prefixed-Message items is delivered in DATA frames
- Length-Prefixed-Message → Compressed-Flag Message-Length Message
- Compressed-Flag → 0 / 1 # encoded as 1 byte unsigned integer
- Message-Length → {length of Message} # encoded as 4 byte unsigned integer (big endian)
- Message → *{binary octet}
换句话说,要读取消息,读取压缩位的 1 个字节,然后读取长度的 4 个字节,然后读取消息的那么多字节。如果设置了压缩位,您将需要使用“grpc-encoding”header 中描述的格式解压缩邮件。那么消息的格式就是application-specific。 Protobuf 很常见。