某站弹幕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

相关文章

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编