某站弹幕Protobuf协议逆向分析 | Go语言版本

2023-10-29 16:50

本文主要是介绍某站弹幕Protobuf协议逆向分析 | Go语言版本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

​一杯敬明天,一杯敬过往。大家好,我是TheWeiJun,时间过得好快,转眼间春节已过,此刻大家都已经开始复工了吧!首先祝大家新年快乐、2023年一路旺旺旺。小编也是心情激动,才有了前面的开场白。直入主题:今天给大家带来某站弹幕protobuf协议逆向分析,全程高能,在阅读的同时不要忘记点赞+关注哦⛽️

特别声明:本公众号文章只作为学术研究,不用于其它不法用途;如有侵权请联系作者删除。

立即加星标

每天看好文

 目录

一、前言介绍

二、网站分析

三、Protobuf协议还原

四、完整代码实现

五、思路总结


新年展望

这是本公众号2023年的第一篇文章,今天写这篇文章是为了解决某个粉丝提到的问题:如何实现某站弹幕protubuf协议还原,最好是用Go语言去实现。小编看到粉丝提到的问题故写了这篇文章分享给各位,希望对大家提高技术有一定的帮助。然后给大家分享一个好消息,经过2022年坚持不懈的努力,作者创作了32篇文章,官方给予作者科技自媒体黄标认证。能拿到这个官方认证,我要感谢各位粉丝的陪伴和鼓励。也感谢对TheWeiJun提供技术指导的朋友,希望大家在2023年技术能更上一层楼⛽️。黄标公众号如下:

逆向与爬虫的故事

专注于网络爬虫、JS逆向、APP逆向、安全攻防实战经验分享及总结。

公众号


一、前言介绍

什么是protobuf协议?

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


二、网站分析

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

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

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

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

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

环节说明因为该请求是对response进行了protobuf协议编码,所以我们定位到该请求发包位置后,只需要关注后面的协议解码逻辑即可实现明文信息还原。

4、打好断点后,点击操作按钮,截图如下图所示:

说明:此刻r变量即为我们要访问的弹幕url地址,定位到url地址后,我们需要接下来继续执行断点进行跟栈。

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

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

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

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

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

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


三、Protobuf协议还原

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

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

protoc  --go_out=. *.proto

3、运行以上命令后,生成.pb.go代码文件,截图如下图所示:

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


四、完整代码实现

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

package main
​
import ("fmt""github.com/golang/protobuf/proto"resp "hello/bilibili""io/ioutil""log""net/http"
)
​
func main() {client := &http.Client{}req, err := http.NewRequest("GET", "https://xxxx/x/v2/dm/web/seg.so?type=1&segment_index=1", nil)if err != nil {log.Fatal(err)}req.Header.Set("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")req.Header.Set("accept", "*/*")req.Header.Set("accept-language", "zh-CN,zh;q=0.9")req.Header.Set("cache-control", "no-cache")req.Header.Set("origin", "https://www.xxxx.com")req.Header.Set("pragma", "no-cache")req.Header.Set("sec-ch-ua-mobile", "?0")req.Header.Set("sec-ch-ua-platform", `"macOS"`)req.Header.Set("sec-fetch-dest", "empty")req.Header.Set("sec-fetch-mode", "cors")req.Header.Set("sec-fetch-site", "same-site")resp, err := client.Do(req)if err != nil {log.Fatal(err)}defer resp.Body.Close()bodyText, err := ioutil.ReadAll(resp.Body)if err != nil {log.Fatal(err)}processBody(bodyText)
}
​
func processBody(body []byte) {response := resp.Feed{}err := proto.Unmarshal(body, &response)if err != nil {log.Fatal(err)}messages := response.Messagefor _, message := range messages {fmt.Println(message.Content, message.IdStr)}
}

2、代码编辑完毕后,我们运行代码,截图如下图所示:


五、思路总结

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

  • 如何快速定位加密协议的位置

  • 了解并熟练掌握protobuf协议

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

  • 如何在golang中使用protobuf

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


  往期回顾

▶ 某游戏社区App | So层逆向分析

▶ 某容器管理平台模拟登录(Go语言版本)

▶ 某麦最新analysis算法逆向分析(多种语言实现)

▶ B站弹幕protobuf协议还原分析

▶ GoLang - colly爬虫框架


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

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

这篇关于某站弹幕Protobuf协议逆向分析 | Go语言版本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301986

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件