-
-
[原创]protobuf还原——从ida中还原.proto文件
-
发表于:
2022-6-26 19:28
17545
-
[原创]protobuf还原——从ida中还原.proto文件
对于非optimize_for为LITE_RUNTIME的proto文件,protobuf编译器会在编译出的JAVA文件的代码里添加一个fileDescriptor静态字段以描述该proto文件定义时的所有元数据信息、为每个message对象定义一个Descriptor静态字段以描述该message定义时的元数据信息、为每个message对象定义一个FieldAccessorTable静态字段用于使用反射读取/设置某个字段的值等(以提供GeneratedMessage中方法的反射实现)。
基于上述描述,这里提供一种还原.proto文件的方法。我使用C++为案例做演示,user.proto文件为
编译成C++文件后在.cc文件里能找到
descriptor_table_protodef_user_2eproto
这个静态变量
这个字节数组就是以descriptor.proto为格式生成的保存user.proto文件内容信息的。
我在测试的dll里使用这个user.pb.cc,在ida里反编译这个dll,字符串搜索user.proto后得到下面的结果。(不知道proto文件的名字可以直接字符串搜索.proto)
这里搜索到了descriptor_table_protodef_user_2eproto的内容
交叉引用unk_100D22E0查看长度
使用下面idapython的脚本dump出这段数据
直接反序列化看下结果
这段pb可以直接使用descriptor.proto进行反序列化后提取文件内容还原成user.proto文件
下图为descriptor.proto文件部分截图,这个文件在protobuf源码里能找到,有兴趣的同学可以自己去阅读
这里贴上我写的测试脚本,根据descriptor.proto还原回原来的.proto文件。
对于LITE_RUNTIME模式下如何还原回proto文件,希望大佬可以给点思路。
syntax
=
"proto2"
;
message User{
optional string name
=
1
;
optional int32 age
=
2
;
}
message UserGroup{
repeated User userList
=
1
;
}
syntax
=
"proto2"
;
message User{
optional string name
=
1
;
optional int32 age
=
2
;
}
message UserGroup{
repeated User userList
=
1
;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课