是否可以使用protoc从生成的pb2.py中获取proto文件?对于gRPC来说,同样的逆向工程也有可能吗?
发布于 2021-12-26 13:00:05
_pb2.py
文件的格式在protobuf-python版本之间各不相同,但大多数版本中都有一个名为serialized_pb
的字段。它以.proto
格式包含整个FileDescriptorProto文件的结构:
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())
上面的片段将人类可读的版本保存到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
文件可能更容易。
发布于 2021-12-25 16:37:14
这是可能的,但我不知道有任何工具可以做到这一点。
协议缓冲器( Protocol )包括gRPC服务定义由protoc编译成特定于语言的源。你在找一个反编译器。
我们知道这个过程是可逆的,因为它有效;我们能够使用生成的源--甚至跨语言--向对等方发送消息。
https://stackoverflow.com/questions/70479912
复制相似问题