存档解密之Protobuf反序列化

点击上方蓝字[协议分析与还原]关注我们


 交流一种高效的ProtoBuf反序列化方法,无需编写.proto文件。

Protobuf(Protocol Buffers)是一种轻量级、高效的数据交换格式,广泛应用于分布式系统和网络通信中。Protobuf的序列化和反序列化机制使得数据的传输和存储更加高效,同时提供了可扩展性和跨语言支持。

之前在分析一些应用时对它做过介绍:

连信的protobuf数据格式

在游戏开发中,Protobuf也扮演着重要的角色,部分游戏的存档数据就直接使用Protobuf格式。Protobuf虽然使用过程中有很多优点,但对分析使用了该格式的游戏存档的过程来说,却增加了难度。分析和修改游戏存档,需要获取能直观处理的数据,而Protobuf格式的数据,作为一种便于机器处理的二进制数据,虽然提升了效率,但不够直观,没有可读性,也不方便修改,所以需要将数据反序列化解码成方便分析处理的格式,例如json格式。反序列化是将序列化后的数据重新转换为原始数据结构的过程,序列化和反序列化使用.proto文件进行数据格式的互动。

Protobuf的每个字段都包含两个元数据:字段编号和数据类型。数据类型会告诉解析器如何解析字段的长度,以便在不知道字段类型的情况下跳过,数据字段间可以嵌套。

在游戏中,Protobuf格式的存档,如果在网络中传递,通常会使用base64再封装一层,以方便做文本处理,出现这种现象的原因,一般是游戏开发者知识面的问题,但是是一个普遍的问题。

01

常规的反序列化

对游戏存档数据进行反序列化的常规方法是编辑.proto文件来定义结构,然后进行处理,包括几个步骤:

1. 定义存档消息格式:在Protobuf中,使用.proto文件定义存档消息的结构和字段。需要通过分析来获取存档消息的结构和字段。通过定义好的消息格式,可以确保序列化和反序列化的一致性。

2. 生成代码:使用Protobuf编译器将.proto文件编译成目标语言的代码。直接使用google提供的Protobuf工具protoc即可,编译器会根据存档消息格式生成相应的类或结构体,用于序列化和反序列化操作。

3. 反序列化游戏存档:对游戏数据进行处理,首先读取序列化后的存档数据。然后使用生成的代码将存档数据转换为相应的对象。这个过程是根据存档消息格式中定义的字段类型和顺序进行的。

4. 修改数据:对反序列化后的游戏数据特定字段进行修改,完成修改存档内容的目标。

5. 序列化存档:对修改后的游戏数据序列化处理成原始的存档格式,需要使修改后的数据存档能够被游戏客户端及服务端处理,这是终极目标。

整个过程依赖于.proto文件内的消息结构定义,在我们的特殊场景下,无法获取到原始的.proto文件,只能通过分析已有的数据来自己定义.proto文件,这必然会导致消息结构的不完善,部分数据无法覆盖,需要在出现问题时及时更新。这个定义.proto文件的过程,需要对着解析出来的二进制数据,一个个字段地分析处理,需要用一番蛮力。

例如对下面这种存档,第三方需要解析它,定义.proto文件需要消耗巨大的精力,相当的麻烦,但是,只要定义好了,还是很方便处理的。

CjQKBQgCEMBwCgQIAxAACgQIARABEO38vKQGGAEiBuWwj+iQjCgBVQAAgD9ogJK5pAZwwLgBEsUECNGWBhJFCghPZmZpY2VfMRI5CghPZmZpY2VfMRACOgYQvaUGGAE6CAgBEL2lBhgBOggIAhC9pQYYAToICAMQvaUGGAFIKFABWLoLEhgKCE9mZmljZV8yEgwKCE9mZmljZV8yEAISFgoIT2ZmaWNlXzMSCgoIT2ZmaWNlXzMSNAoSUHJvcGVydHlDZW50ZXJfMTAwEh4KElByb3BlcnR5Q2VudGVyXzEwMDoGEMClBhgBSAoSJAoPTWVldGluZ1Jvb21fMTAxEhEKD01lZXRpbmdSb29tXzEwMRIkCgpUb2lsZXRfMTAyEhYKClRvaWxldF8xMDI6BhDFpQYYAUgKEqcBChBTaHVpRGlhbkZhbmdfMTAzEpIBChBTaHVpRGlhbkZhbmdfMTAzEAI6BhDIpQYYAToGEMmlBhgBOggIARDJpQYYAToICAIQyaUGGAE6CAgDEMmlBhgBOggIBBDJpQYYAToICAUQyaUGGAE6CAgGEMmlBhgBOggIBxDJpQYYAToICAgQyaUGGAE6CAgJEMmlBhgBOggIChDJpQYYAToICAsQyaUGGAESIAoIT2ZmaWNlXzQSFAoIT2ZmaWNlXzQ6BhC9pQYYAUgKEiAKCE9mZmljZV81EhQKCE9mZmljZV81OgYQvaUGGAFIChI+Cg9NYW5hZ2VyUm9vbV8xMDQSKwoPTWFuYWdlclJvb21fMTA0EAI6BhDSpQYYAUIMCMqtBhABGNKlBigBSBQiBAgBEA8yADoASgzniankuJrlpKfkuqgatwMaGQjRlgYSEwjRlgYQARgBIP///wEaFwjSlgYSEQjSlgYQASD///8BGhcI05YGEhEI05YGEAEgARoXCNSWBhIRCNSWBhABIP///wEaFwjVlgYSEQjVlgYQASD///8BGhUIkU4SEAiRThACIP///wEaFQiSThIQCJJOEAIgARoVCJNOEhAIk04QAiD///8BGhUIlE4SEAiUThACIP///wEaFwihnAESEQihnAEQAyD///8BGhcIopwBEhEIopwBEAMgARoXCKOcARIRCKOcARADIP///wEaFwiknAESEQiknAEQAyD///8BGhcIpZwBEhEIpZwBEAMgARoMCLHqARIGCLHqARAEGgwIsuoBEgYIsuoBEAQaDAiz6gESBgiz6gEQBBoMCLTqARIGCLTqARAEGgwIteoBEgYIteoBEAQaFwjBuAISEQjBuAIQBSD///8BIjIKBggBEgIIAQoGCAISAggCCgYIAxICCAMKBggEEgIIBAoGCAUSAggFIAEgAiADIAQgBSoGCAEQASABMpkRCAESBggBEgIIARIGCAISAggCEgYIAxICCAMSBggEEgIIBBIKCAYSBggGGBUoARIGCAcSAggHEgYICBICCAgSBggJEgIICRIGCAoSAggKEgYICxICCAsSBggMEgIIDBIGCA0SAggNEgYIDhICCA4SBggPEgIIDxIGCBASAggQEgYIERICCBESBggSEgIIEhIGCBMSAggTEgYIFBICCBQSBggVEgIIFRIGCBYSAggWEgYIFxICCBcSBggYEgIIGBIGCBkSAggZEgYIGhICCBoSBggbEgIIGxIGCBwSAggcEgYIHRICCB0SBggeEgIIHhIGCB8SAggfEgYIIBICCCASBgghEgIIIRIGCCISAggiEgYIIxICCCMSBggkEgIIJBIGCCUSAgglEgYIJhICCCYSBggnEgIIJxIGCCgSAggoEgYIKRICCCkSBggqEgIIKhIGCCsSAggrEgYILBICCCwSBggtEgIILRIGCC4SAgguEgYILxICCC8SBggwEgIIMBIGCDESAggxEgYIMhICCDISBggzEgIIMxIGCDQSAgg0EgYINRICCDUSBgg2EgIINhIGCDcSAgg3EgYIOBICCDgSBgg5EgIIORIGCDoSAgg6EgYIOxICCDsSBgg8EgIIPBIGCD0SAgg9EgYIPhICCD4SBgg/EgIIPxIGCEASAghAEgYIQRICCEESBghCEgIIQhIGCEMSAghDEgYIRBICCEQSBghFEgIIRRIGCEYSAghGEgYIRxICCEcSBghIEgIISBIGCEkSAghJEgYIShICCEoSBghLEgIISxIGCEwSAghMEgYITRICCE0SBghOEgIIThIGCE8SAghPEgYIUBICCFASBghREgIIURIGCFISAghSEgYIUxICCFMSBghUEgIIVBIGCFUSAghVEgYIVhICCFYSBghYEgIIWBIGCFkSAghZEgYIXBICCFwSBghdEgIIXRIGCGASAghgEgYIYRICCGESBghiEgIIYhIGCGMSAghjEgYIZBICCGQS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

处理过程中,将特定字段的内容修改之后,再序列化及base64编码成存档,就完美了。

02


更好的反序列化方法

使用定义.proto文件的方式进行反序列化及游戏存档处理,虽然可以搞,但效率实在低下,没法普适性地处理,每一个新的游戏都需要在分析时根据数据的内容定义自己的.proto文件。

对懒人来讲,肯定会考虑有没有更便捷的方法,来提升分析处理存档的效率,能否在不定义.proto文件的情况下对Protobuf数据进行处理,提升分析效率,加快修改速度。

经过一番探索,已经做好了自己写一个的准备,但最终发现了一款工具,能够在没有消息定义的情况下使用Protobuf,它就是传说中的Blackbox protobuf。它提供了burp插件和python库,刚好方便使用。

Blackbox protobuf会根据提供的数据内容对数据的类型进行尽力猜测,并建立一个可用于重新编码数据的类型定义。一般来说,大多数感兴趣的字段都有可能被解析成可用的形式。

在python中,我们使用bbpb库对游戏存档进行处理,得到一个基本可读的数据字典以及类型定义,可以对数据有直观的感受了,但是对修改内容来说,还是不够,因为数据通常都是嵌套的,我们要定位到具体的字段,才能方便地进行修改,原始的数据字典,是一层一层的,并且里面会有list结构。

通过一番探索,我们将字典压平,就可以对各个字段进行修改,通过类似'2_2_1_8_3'的字符串,来定位各个字段,处理结束后,再恢复字典到原始状态,就可以调用编码函数进行编码,得到修改后的存档数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值