首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从用protoc生成的pb2.py中反向工程.proto文件

从用protoc生成的pb2.py中反向工程.proto文件
EN

Stack Overflow用户
提问于 2021-12-25 12:06:33
回答 2查看 1.9K关注 0票数 3

是否可以使用protoc从生成的pb2.py中获取proto文件?对于gRPC来说,同样的逆向工程也有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-26 13:00:05

_pb2.py文件的格式在protobuf-python版本之间各不相同,但大多数版本中都有一个名为serialized_pb的字段。它以.proto格式包含整个FileDescriptorProto文件的结构:

代码语言:javascript
复制
serialized_pb=b'\n\x0c...'

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

代码语言:javascript
复制
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())

上面的片段将人类可读的版本保存到myproto.txt中,并保存了一种名义上与protocmyproto.pb兼容的格式。文本表示形式如下:

代码语言:javascript
复制
file {
  name: "XYZ.proto"
  dependency: "dependencyXYZ.proto"
  message_type {
    name: "MyMessage"
    field {
      name: "myfield"
      number: 1
     label: LABEL_OPTIONAL
     type: TYPE_INT32
    }
   ...

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

代码语言:javascript
复制
protoc --cpp_out=. --descriptor_set_in=myproto.pb XYZ.proto

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

票数 5
EN

Stack Overflow用户

发布于 2021-12-25 16:37:14

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

协议缓冲器( Protocol )包括gRPC服务定义由protoc编译成特定于语言的源。你在找一个反编译器。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70479912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档