【问题标题】:get the binary data transferred from grpc client获取从 grpc 客户端传输的二进制数据
【发布时间】:2019-07-27 16:24:01
【问题描述】:

我是 gRPC 框架的新手,我已经在我的 PC 上创建了一个示例客户端-服务器(参考 this)。

在我的客户端-服务器应用程序中,我实现了一个 simple RPC

service NameStudent {
  rpc GetRoll(RollNo) returns (Details) {}
}

客户发送 RollNo 并收到他/她的详细信息,即姓名、年龄、性别、父母姓名和卷号。

message RollNo{
    int32 roll = 1;
}

message Details {
    string name = 1;
    string gender = 2;
    int32 age = 3;
    string parent = 4;
    RollNo rollid = 5;
}

实际的服务器和客户端代码改编自here解释的示例代码

现在我的服务器能够监听 "0.0.0.0:50051(address:port)" 并且客户端能够在 "localhost:50051" 上发送卷号 em> 并收到详细信息。

我想查看在客户端和服务器之间传输的实际二进制数据。我曾尝试使用 Wireshark,但我不明白我在这里看到的内容。

这是 wireshark 捕获的截图

这里是上面屏幕截图中突出显示的条目的详细信息。

在此处需要帮助理解wireshark,或任何其他可用于查看二进制数据的方式。

【问题讨论】:

    标签: c++ server client-server wireshark grpc


    【解决方案1】:

    Wireshark 使用端口来确定如何解码通信,它不知道任何与 50051 关联的协议。因此您需要将其配置为将其视为 HTTP。

    右键单击一行并在上下文菜单中选择“解码为...”。

    然后将“当前”设置为“HTTP”或“HTTP2”(HTTP 通常会自动检测 HTTP2)并点击“确定”。

    然后应该解码 HTTP/2 帧。如果使用最新版本的 Wireshark,您可能还会看到已解码的 gRPC 帧。

    【讨论】:

      【解决方案2】:

      grpc 的整个想法就是隐藏它。假设我们忽略了这一点,而您知道自己在做什么。

      逆向工程师练习的两个良好起点是:

      • 从简单开始:编译一个发送整数的程序。明白它。闻一闻。然后编译一个发送字符串的程序。尝试几个值。一旦你理解了它,通过解决理解谷歌如何发送你的结构的问题。

      • 使用已知数据并做一些小的变化:如果您开始了解您正在发送的数据,那么了解 505249... 的含义会更容易(例如,发送“Hello world”字符串;然后将其更改为“海拉世界”;查看编码嗅探有什么变化;还要检查发送多次相同的数据是否会产生相同的嗅探输出)。应用前一点:从简单开始,首先是空字符串,然后是“”,然后是“a”,然后是“b”,等等,然后传递给复杂和更大的字符串。不要害怕从简单开始。

      【讨论】:

      • 这是一个非常明智的建议。我会马上开始的。 :) 但是根据您的建议,我认为我在如何在这里使用wireshark 方面朝着正确的方向前进......我是正确的吗?
      • 如果您想查看原始流量,可以。您可以做的另一件事是实现某种代理,这可能会更干净一些(因为您不需要关心很多 TCP 握手)。
      猜你喜欢
      • 2014-12-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多