[原创]protobuf还原——从ida中还原.proto文件
2022-6-26 19:28:0 Author: bbs.pediy.com(查看原文) 阅读量:22 收藏

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

2022-6-26 19:28 9433

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

对于非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

syntax="proto2";

message User{

    optional string name=1;

    optional int32 age=2;

}

message UserGroup{

    repeated User userList=1;

}

编译成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

import idautils

with open("./test_dump_pb_buff.bin", "wb") as out:

    data = GetManyBytes(0x100D22E0, 0x55)

    out.write(data)

图片描述
直接反序列化看下结果

1

protoc --decode_raw < test_dump_pb_buff.bin > out1.txt

图片描述
这段pb可以直接使用descriptor.proto进行反序列化后提取文件内容还原成user.proto文件
下图为descriptor.proto文件部分截图,这个文件在protobuf源码里能找到,有兴趣的同学可以自己去阅读
图片描述
这里贴上我写的测试脚本,根据descriptor.proto还原回原来的.proto文件。
对于LITE_RUNTIME模式下如何还原回proto文件,希望大佬可以给点思路。

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

最新回复 (5)

雪    币: 38

活跃值: 活跃值 (1023)

能力值:

( LV2,RANK:10 )

在线值:

发帖

回帖

粉丝

EX呵呵 活跃值 2022-6-26 23:44

2

0

mark

雪    币: 79

能力值:

( LV1,RANK:0 )

在线值:

发帖

回帖

粉丝

悟皈 活跃值 2022-6-27 06:48

3

0

感谢楼主热心分享

雪    币: 4984

活跃值: 活跃值 (5331)

能力值:

( LV17,RANK:787 )

在线值:

发帖

回帖

粉丝

无名侠 活跃值 12 2022-6-30 22:54

4

0

推荐一个开源项目已经能很好还原了
https://github.com/marin-m/pbtk
支持从二进制程序、APK、jar 里面提取。

雪    币: 318

能力值:

( LV1,RANK:0 )

在线值:

发帖

回帖

粉丝

天会晴心会暖 活跃值 2022-7-1 11:08

5

0

无名侠 推荐一个开源项目已经能很好还原了 https://github.com/marin-m/pbtk 支持从二进制程序、APK、jar 里面提取。

感谢大佬分享,大概看了下他好像也是基于descriptor 和 protoc  --decode_raw 这两种方式提取proto, descriptor 方式也就是我上文说的方式,确实能百分百还原.proto文件,但是受限于非LITE_RUNTIME模式下.而decode_raw的方式只能靠猜 除了这两种方式 是否还有其他方式能更好的还原proto文件呢,毕竟知道字段名后可以给逆向或、协议分析减少很多字段溯源的时间

雪    币: 376

活跃值: 活跃值 (12048)

能力值:

( LV2,RANK:10 )

在线值:

发帖

回帖

粉丝

飘零丶 活跃值 2022-7-6 14:35

6

0

学习了

游客

登录 | 注册 方可回帖

返回


文章来源: https://bbs.pediy.com/thread-273455.htm
如有侵权请联系:admin#unsafe.sh