首页
社区
课程
招聘
[原创]protobuf还原——从ida中还原.proto文件
发表于: 2022-6-26 19:28 17545

[原创]protobuf还原——从ida中还原.proto文件

2022-6-26 19:28
17545

对于非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直播授课

收藏
免费 12
支持
分享
最新回复 (5)
雪    币: 282
活跃值: (4151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2022-6-26 23:44
0
雪    币: 79
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢楼主热心分享
2022-6-27 06:48
0
雪    币: 6911
活跃值: (9064)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
4
推荐一个开源项目已经能很好还原了
https://github.com/marin-m/pbtk
支持从二进制程序、APK、jar 里面提取。
2022-6-30 22:54
1
雪    币: 198
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
无名侠 推荐一个开源项目已经能很好还原了 https://github.com/marin-m/pbtk 支持从二进制程序、APK、jar 里面提取。
感谢大佬分享,大概看了下他好像也是基于descriptor 和 protoc  --decode_raw 这两种方式提取proto, descriptor 方式也就是我上文说的方式,确实能百分百还原.proto文件,但是受限于非LITE_RUNTIME模式下.而decode_raw的方式只能靠猜 除了这两种方式 是否还有其他方式能更好的还原proto文件呢,毕竟知道字段名后可以给逆向或、协议分析减少很多字段溯源的时间
2022-7-1 11:08
0
雪    币: 3907
活跃值: (163295)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习了
2022-7-6 14:35
0
游客
登录 | 注册 方可回帖
返回
//