[原创]protobuf还原——从ida中还原.proto文件
2022-6-26 19:28 9433
对于非optimize_for为LITE_RUNTIME的proto文件,protobuf编译器会在编译出的JAVA文件的代码里添加一个fileDescriptor静态字段以描述该proto文件定义时的所有元数据信息、为每个message对象定义一个Descriptor静态字段以描述该message定义时的元数据信息、为每个message对象定义一个FieldAccessorTable静态字段用于使用反射读取/设置某个字段的值等(以提供GeneratedMessage中方法的反射实现)。
基于上述描述,这里提供一种还原.proto文件的方法。我使用C++为案例做演示,user.proto文件为
1 2 3 4 5 6 7 8 |
|
编译成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出这段数据
1 2 3 4 |
|
直接反序列化看下结果
1 |
|
这段pb可以直接使用descriptor.proto进行反序列化后提取文件内容还原成user.proto文件
下图为descriptor.proto文件部分截图,这个文件在protobuf源码里能找到,有兴趣的同学可以自己去阅读
这里贴上我写的测试脚本,根据descriptor.proto还原回原来的.proto文件。
对于LITE_RUNTIME模式下如何还原回proto文件,希望大佬可以给点思路。
|
|
---|---|
mark |
|
感谢楼主热心分享 |
|
推荐一个开源项目已经能很好还原了 |
|
无名侠 推荐一个开源项目已经能很好还原了 https://github.com/marin-m/pbtk 支持从二进制程序、APK、jar 里面提取。 感谢大佬分享,大概看了下他好像也是基于descriptor 和 protoc --decode_raw 这两种方式提取proto, descriptor 方式也就是我上文说的方式,确实能百分百还原.proto文件,但是受限于非LITE_RUNTIME模式下.而decode_raw的方式只能靠猜 除了这两种方式 是否还有其他方式能更好的还原proto文件呢,毕竟知道字段名后可以给逆向或、协议分析减少很多字段溯源的时间 |
|
学习了 |
|
返回