B站弹幕文件protobuf协议的逆向和还原

目标是B站弹幕的数据还原,随便打开一个视频,直接三连

image.png

能看到真实文本,但也有一些乱码,看一下 content-type

content-type: application/octet-stream

参考这篇可知,这是一个字节流文件,但浏览器也不知道如何处理

算了,直接google 就可知,这是一个使用了protobuf协议编码 的文件,使用这种协议的好处就是数据量小,传输快,坏处也显而易见,就是使用麻烦!!!

配置和原理的话,跟着这两篇博客走就行,注意把 protoc.exe 配置到环境变量

protobuf 初体验

然后可以写一个小demo玩一玩,首先是自定义 .proto文件

syntax = "proto3";

message Person {
	string name = 1;
	int32 age = 2;
	string phone = 3;
	string gender = 4;
}

然后编译生成python代码,目录下就多了一个 person_pb2.py

protoc --python_out=./ person.proto

然后就可以导入模块, import 的时候可能会报错:

ImportError: cannot import name 'builder' from 'google.protobuf.internal'

这时候需要升级:pip3 install --upgrade protobuf

In [4]: from person_pb2 import Person

In [5]: peron = Person()

In [7]: peron.name = "xxx"

In [8]: peron.age = 25

In [10]: send_bytes = peron.SerializeToString()

# 序列化
In [11]: send_bytes
Out[11]: b'\n\t\xe9\x99\x88\xe6\x99\x93\xe7\x94\x9f\x10\x19'

In [15]: decode_person = Person()

In [16]: decode_person.ParseFromString(send_bytes)
Out[16]: 13

# 反序列化
In [17]: decode_person
Out[17]:
name: "xxx"
age: 25


# 转换字典
from google.protobuf.json_format import MessageToDict
MessageToDict(decoder, preserving_proto_field_name=True)

so文件逆向

有了上面的经验,要来逆向就比较容易上手了,首先下载弹幕的二进制文件:

https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=555856394&pid=809421068&segment_index=2

然后运行命令:protoc --decode_raw < seg.so,先看一下大体内容是怎么样的:

image.png

再打断点调试看看:

image.png

image.png

直接搜索还原后的key值,midHash

image.png

格式化一下,答案呼之欲出:

image.png

这下可以开始编写 .proto文件了,把整个字典扣下来,用代码生成:

image.png

In [4]: for k, v in d.items():
   ...:     print(f"{v['type']} {k} = {v['id']}")

bili.proto 文件如下:

syntax = "proto3";

// 弹幕的数据是放在一个key的大value里,所以需要嵌套多一层
// 字段不需要和 decode_raw 解析出来的完全一致
message BiliDanmu {
	message Message {
		int32 progress = 2;
		int32 mode = 3;
		int32 fontsize = 4;
		uint32 color = 5;
		string midHash = 6;
		string content = 7;
		int64 ctime = 8;
		int32 weight = 9;
		string action = 10;
		int32 pool = 11;
		string dmid = 12;
		int32 attr = 13;
		string animation = 22;
	}
	
	repeated Message message = 1;
}

再走一遍上面的流程:

  1. 生成 pb2.py 文件 protoc --python_out=./ bili.proto

  2. 导入模块 from bili_pb2 import BiliDanmu

  3. 解析字节流

    In [2]: bili_decoder = BiliDanmu()
    In [3]: pb_bytes = open("seg.so", "rb").read()
    In [4]: bili_decoder.ParseFromString(pb_bytes)
    
  4. 转换成字典

    from google.protobuf.json_format import MessageToDict
    
    MessageToDict(bili_decoder, preserving_proto_field_name=True)
    

    image.png

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于处理B站弹幕中的protobuf,可以参考以下步骤: 1. 配置和原理:你可以根据提供的两篇博客,学习如何配置protobuf环境和了解protobuf的基本原理。确保将`protoc.exe`配置到环境变量中。 2. 编译生成Python代码:根据提供的指令`protoc --python_out=./ person.proto`,使用protobuf编译器将`.proto`文件编译成Python代码。编译完成后,会在目录下生成`person_pb2.py`文件。 3. 分析弹幕请求:根据提供的代码`var r = a.protoMessage[t].decode(new Uint8Array(i.data)) , o = a.protoMessage[t].toObject(r)`,可以看到这段代码是对返回的数据进行解码和转换。可以通过在代码中打上断点,跟踪代码的执行过程,查看具体的处理逻辑。 综上所述,处理B站弹幕中的protobuf,需要先配置环境并编译生成Python代码,然后根据具体的代码逻辑进行分析和处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [B站弹幕文件protobuf协议逆向还原](https://blog.csdn.net/qq_40734108/article/details/127455489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [JS逆向加密——B 站弹幕 protobuf 分析](https://blog.csdn.net/qq_39551311/article/details/125933062)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值