【问题标题】:Reverse engineering .proto files from pb2.py generated with protoc从使用 protoc 生成的 pb2.py 逆向工程 .proto 文件
【发布时间】:2022-01-25 11:59:19
【问题描述】:

是否可以使用 protoc 从生成的 pb2.py 中获取 proto 文件? gRPC 是否可以进行相同的逆向工程?

【问题讨论】:

    标签: protocol-buffers grpc protoc grpc-python protobuf-python


    【解决方案1】:

    _pb2.py 文件的格式因 protobuf-python 版本而异,但其中大多数都有一个名为 serialized_pb 的字段。这包含FileDescriptorProto 格式的.proto 文件的整个结构:

    serialized_pb=b'\n\x0c...'
    

    这可以传递给protoc 编译器以生成其他语言的标头。但是,必须首先将其放入 FileDescriptorSet 中才能正确匹配格式。这可以使用 Python 完成:

    import google.protobuf.descriptor_pb2
    fds = google.protobuf.descriptor_pb2.FileDescriptorSet()
    fds.file.append(google.protobuf.descriptor_pb2.FileDescriptorProto())
    fds.file[0].ParseFromString(b'\n\x0c... serialized_pb data ....')
    open('myproto.txt', 'w').write(str(fds))
    open('myproto.pb', 'wb').write(fds.SerializeToString())
    

    上面的 sn-p 将人类可读的版本保存到myproto.txt 和名义上与protoc 兼容的格式到myproto.pb。文本表示如下所示:

    file {
      name: "XYZ.proto"
      dependency: "dependencyXYZ.proto"
      message_type {
        name: "MyMessage"
        field {
          name: "myfield"
          number: 1
         label: LABEL_OPTIONAL
         type: TYPE_INT32
        }
       ...
    

    例如,现在可以使用以下方法生成 C++ 标头:

    protoc --cpp_out=. --descriptor_set_in=myproto.pb XYZ.proto
    

    请注意XYZ.proto 必须与描述符集中的文件名匹配,您可以在myproto.txt 中查看。但是,如果文件具有依赖项,这种方法很快就会变得困难,因为所有这些依赖项都必须收集在同一个描述符集中。在某些情况下,仅使用文本表示手动重写.proto 文件可能更容易。

    【讨论】:

      【解决方案2】:

      这是可能的,但我不知道有什么工具可以做到这一点。

      包括 gRPC 服务定义的协议缓冲区 (protos) 由 protoc 编译为特定于语言的源。您正在寻找反编译器。

      我们知道这个过程是可逆的,因为它有效;我们能够使用生成的源(甚至跨语言)向同行发送消息。

      【讨论】:

        猜你喜欢
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-11
        • 2016-09-27
        相关资源
        最近更新 更多