如何使用protobuf-inspector对Protocol Buffers进行逆向工程分析
关于Protocol Buffers
Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python、Objective C、C#、Ruby、PHP、JavaScript八种编程语言,还可以找到大量的几乎涵盖所有语言的第三方拓展包。
通过它,你可以定义你的数据的结构,并生成基于各种语言的代码。这些你定义的数据流可以轻松地在传递并不破坏你已有的程序。并且你也可以更新这些数据而现有的程序也不会受到任何的影响。值得一提的是,Protocol Buffers经常被简称为Protobuf。
protobuf-inspector介绍
protobuf-inspector是一款功能强大的逆向工程分析工具,该工具可以帮助广大研究人员对Protocol Buffers进行逆向工程分析。这款工具能够解析Google Protobuf编码的代码块(支持v2或v3)并且能够给用户输出格式优美的彩色内容显示。下面给出的是一个输出样例:
正如我们所看到的,工具会显示字段名以及一些详细数据,其中包含:
1、变量是否使用zig-zag编码(假设默认不使用zig-zag编码); 2、32位/64位值是整数还是浮点(默认情况下都显示); 3、签名(默认情况下自动检测);
protobuf-inspector能够在大多数情况下正确解析数据结构,当它在字段上找到嵌入的二进制数据时,它将首先尝试将其解析为消息。如果失败,它会将数据显示为字符串或十六进制转储。
它按照字段在wire格式中的编码顺序显示字段,因此除了逆向工程之外,对于那些希望熟悉wire格式或解析器开发人员的人来说,它也很有用。
工具下载
由于该工具基于Python开发,因此我们首先需要在本地设备上安装并配置好Python环境。接下来,广大研究人员可以使用下列命令将该工具源码克隆至本地:
git clone https://github.com/mildsunrise/protobuf-inspector.git
除此之外,我们也可以使用pip来安装protobuf-inspector:
pip install protobuf-inspector
工具使用
工具安装完成之后,我们就可以使用下列命令通过STDIN向工具提供Protobuf数据了:
protobuf_inspector < my-protobuf-blob
以代码库使用
from protobuf_inspector.types import StandardParser
parser = StandardParser()
with open('my-blob', 'rb') as fh:
output = parser.parse_message(fh, "message")
print(output)
该工具还允许我们以第三方代码库的形式整合进其他代码中,具体使用请参考protobuf_inspector/__main__.py。
解析错误
如果你遇到了解析错误问题,解析将会终止在特定字段,但在层次结构外部不会受到影响。堆栈跟踪将打印到字段内容所在的位置,如果适用,还将打印一个hexdump,指示在该块中停止解析的位置。
如果你指定了uint32,并且找到了更大的变量,则会得到如下结果:
如果指定某个字段包含嵌入消息,但在其中发现无效数据,则会得到:
请注意,如果发生一个或多个分析错误,main.py将以非零状态退出。
许可证协议
本项目的开发与发布遵循ISC开源许可证协议。
项目地址
protobuf-inspector:https://github.com/mildsunrise/protobuf-inspector
参考资料
https://developers.google.com/protocol-buffers/docs/encoding#signed-integers https://developers.google.com/protocol-buffers https://developers.google.com/protocol-buffers/docs/encoding
精彩推荐
相关文章
- 【说站】Python中concurrent.futures模块如何使用
- 如何使用 tcpdump 抓包?如何用 tcpdump 和 wireshark 分析网络流量?
- JsonCpp在Linux下的安装及简单使用
- 如何使用Aced分析活动目录的DACL
- 如何使用tsharkVM分析tshark的输出
- 如何使用 Doris 分析 Mysql 数据库数据?
- 功放使用与选型的若干问题
- 【转载】如何在CentOS 7服务器之间使用NFS共享目录
- 如何使用知行之桥搭建SFTPServer
- 【错误记录】Git 使用报错 ( error: The branch ‘feature1‘ is not fully merged. )
- 使用 B VPS 中转 A VPS 流量
- 如何使用GPT_Vuln-analyzer并利用ChatGPT来进行网络安全分析
- 如何使用log miner分析oracle日志
- 使用nginx做负载均衡详解架构师
- Oracle 视图 DBA_HIST_INTERCONNECT_PINGS 官方解释,作用,如何使用详细说明
- Oracle 视图 REPORT_FORMATS 官方解释,作用,如何使用详细说明
- Oracle 视图 USER_TYPE_VERSIONS 官方解释,作用,如何使用详细说明
- Oracle 视图 DBA_RSRC_CONSUMER_GROUP_PRIVS 官方解释,作用,如何使用详细说明
- Oracle 视图 V$HM_RUN 官方解释,作用,如何使用详细说明
- Oracle 视图 V$QUEUE 官方解释,作用,如何使用详细说明
- Oracle 等待事件 gc buffer busy acquire 官方解释,作用,如何使用及优化方法
- Oracle 等待事件 Enqueues:MM,MountDefinition 官方解释,作用,如何使用及优化方法
- 如何使用MySQL查询并分析SQL计划(mysql查询sql计划)
- MySQL中使用下划线命名字段的实践(mysql下划线字段)
- 如何在MongoDB中查看数据:使用查询和聚合操作进行检索和分析。(mongodb怎么看数据)
- 如何使用Redis连接数据库(怎么进redis数据库)
- 这才是使用数据降维&可视化工具 HyperTools 的正确姿势! | Kaggle 实战教程