B站弹幕protobuf协议还原分析

     时间过得飞快,转眼间本公众号文章已经连续更新了四个月。感恩这三个月里结交了很多志同道合的朋友;我也会持之以恒,继续创造更好的文章给各位读者朋友。废话不多说,今天给大家带来B站弹幕protobuf协议分析,全程高能,在阅读的同时不要忘记点赞+关注哦⛽️

特别声明:本公众号文章只作为学术研究,不用于其它用途。

 目录

一、什么是protobuf?

二、网站调试分析

三、protobuf协议还原

四、完整代码实现

五、心得分享及总结


趣味模块

      小红是一名数据分析工程师,自从上次小红解决了字体反爬的问题后,小红还未遇到过有难度的问题。但是天有不测风云,今天小红在分析弹幕君的时候,遇到了新的问题。数据乱码无规律,据说是protobuf,那么今天我们去分析下小红同学遇到的新问题吧!


一、什么是protobuf协议?

前言:Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为proto文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过Protobuf序列化的数据。目前官方提供c++,java,go等语言支持。


二、网站调试分析

1、首先打开我们本次分析的网站,搜索指定弹幕内容,截图如下所示:

说明:由于弹幕内容使用了protobuf协议,所以无法直接搜索定位,我们需要分析数据包请求,去定位具体的url链接。

2、分析数据包请求,定位到弹幕链接,截图如下所示:

说明:从截图中我们可以清楚看出,这就是弹幕的内容。但是毕竟使用了protobuf协议编码,我们如果想还原出明文信息,接下来需要去进行JS断点调试分析了。

3、使用xhr/fetch对该请求打断点调试,截图如下所示:

说明:因为该请求是对response进行了protobuf协议编码,所以我们在定位到该请求发包位置后,只需要关注后面的解码逻辑即可。

4、执行断点操作按钮后,截图如下所示:

说明:此刻r变量即为我们要访问的弹幕url地址;接下来继续执行断点。

5、继续执行断点,持续更近,截图如下所示:

此刻我们打印变量r的值,截图如下所示:

说明:这不就是我们想要的明文信息么?接下来,我们只需要找到protobuf协议初始化参数id定义就可以还原明文了。

6、经过JS断点调试,最终定位到protobuf协议初始化参数如下:

7、将Console中的数据复制后进行JSON在线格式化解析,截图如下:

总结:知道response明文及protobuf协议定义的参数及id后,接下来我们只需要构建proto文件即可完成对整个明文信息的还原。


三、protobuf协议还原

1、还原protobuf协议,编辑代码结构如下:

2、执行如下命令,编译为python protobuf可执行文件:

protoc  --python_out=. *.proto

3、运行命令后,生成protobuf文件,截图如下所示:

总结:走到这里protobuf协议就完全还原了,接下来让我们进入完整代码实现环节吧。


四、完整代码实现

1、整个项目完整代码如下

# -*- coding: utf-8 -*-# --------------------------------------# @author : 公众号:逆向与爬虫的故事# --------------------------------------import requestsfrom feed_pb2 import Feedfrom google.protobuf.json_format import MessageToDictdef start_requests():    cookies = {        'rpdid': '|(J~RkYYY|k|0J\'uYulYRlJl)',        'buvid3': '794669E2-CEBC-4737-AB8F-73CB9D9C0088184988infoc',        'buvid4': '046D34538-767A-526A-8625-7D1F04E0183673538-022021413-+yHNrXw7i70NUnsrLeJd2Q%3D%3D',        'DedeUserID': '481849275',        'DedeUserID__ckMd5': '04771b27fae39420',        'sid': 'ij1go1j8',        'i-wanna-go-back': '-1',        'b_ut': '5',        'CURRENT_BLACKGAP': '0',        'buvid_fp_plain': 'undefined',        'blackside_state': '0',        'nostalgia_conf': '-1',        'PVID': '2',        'b_lsid': '55BA153F_18190A78A34',        'bsource': 'search_baidu',        'innersign': '1',        'CURRENT_FNVAL': '4048',        'b_timer': '%7B%22ffp%22%3A%7B%22333.1007.fp.risk_794669E2%22%3A%2218190A78B5F%22%2C%22333.788.fp.risk_794669E2%22%3A%2218190A797FF%22%2C%22333.42.fp.risk_794669E2%22%3A%2218190A7A6C5%22%7D%7D',    }    headers = {        'authority': 'xxxxxx',        'accept': '*/*',        'accept-language': 'zh-CN,zh;q=0.9',        'cache-control': 'no-cache',        'origin': 'https://www.xxxxx.com',        'pragma': 'no-cache',        'referer': 'https://www.xxxxxx.li.com/video/BV1434y1L7rb?spm_id_from=333.851.b_7265636f6d6d656e64.1&vd_source=8d45ec9ed78652f966b3625afe95e904',        'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',        'sec-ch-ua-mobile': '?0',        'sec-ch-ua-platform': '"macOS"',        'sec-fetch-dest': 'empty',        'sec-fetch-mode': 'cors',        'sec-fetch-site': 'same-site',        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',    }    params = {        'type': '1',        'oid': '729126061',        'pid': '896926231',        'segment_index': '1',    }    response = requests.get('https://xxxx.xxxx.com/x/v2/dm/web/seg.so', params=params, cookies=cookies,                            headers=headers)    info = Feed()    info.ParseFromString(response.content)    _data = MessageToDict(info, preserving_proto_field_name=True)    messages = _data.get("message") or []    for message in messages:        print(message.get("content"))if __name__ == '__main__':    start_requests()

2、运行代码后,截图如下所示:


五、心得分享及总结

回顾整个分析流程,本次难点主要概括为以下几点:

  • 如何快速定位加密参数的位置

  • 了解并熟练掌握protobuf协议

  • 能够通过源码还原proto文件

  • 如何在python中使用protobuf

今天分享到这里就结束了,欢迎大家关注下期文章,我们不见不散⛽️


作者简介

我是TheWeiJun,有着执着的追求,信奉终身成长,不定义自己,热爱技术但不拘泥于技术,爱好分享,喜欢读书和乐于结交朋友,欢迎扫我微信与我交朋友💕

分享日常学习中关于爬虫及逆向分析的一些思路,文中若有错误的地方,欢迎大家多多交流指正💕

文章来源:逆向与爬虫的故事(公众号)

原文链接:B站弹幕protobuf协议还原分析

微信搜:逆向与爬虫的故事;给我一个关注!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆向与爬虫的故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值