某解析 b 站 MP4 视频的逆向获取

本贴最后更新于 1496 天前,其中的信息可能已经物是人非

直接获取 B 站视频 找到的都是分段的合成视频,于是乎在网上看到一个工具他做的视频解析可以解析出 mp4 的地址,遂转而直接研究从解析网站拿到视频地址,

分析思路:

  1. 首先模拟正常的请求,发现网址在这个地方,禁止 js 之后发现这个位置就空白了,很明显这段显示是 js 动态处理了

  2. image.png

  3. 然后,我猜测是不是,有 ajax 请求发送,但是 network 之后发现,并没有 xhr 请求出现,突然在 ifream 请求中看到了 url,但是在网页源码中并没有发现这个网址,那么他是怎么来的?经大佬点播之后,明白了,网址最开始得 post 请求就已经拿到了,然后做了加密,js 渲染部分代码做了混淆,所以看不到请求操作。
    image.png

  4. 继续查看网页源码,通过搜索 bvid,看到了两处很奇怪的代码,sojson.v4 sojson.v5 一种 sojson 字符串加密的方法
    image.png

    image.png

  5. 没见过这两种加密方法,网上百度,截图中的代码一看就是经过加密混淆的,所以首先反混淆解密一下看看

[https://jsdec.js.org/](https://jsdec.js.org/) 1. v4 /* *Progcessed By JSDec in 0.00s *JSDec - [JSDec.js.org](http://jsdec.js.org/) */ $("#mp4-url").attr("href",decrypt(hahaha)); $("#mp4-url2").text(decrypt(hahaha)); $("#player").attr("src", "[https://xbeibeix.com/api/player/?s=1&url=](https://xbeibeix.com/api/player/?s=1&url=)" + encodeURIComponent(decrypt($("#list").val()))); $("#list").change(function() { if ($("#list").val() != "false") { $("#player").attr("src", "[https://xbeibeix.com/api/player/?s=1&url=](https://xbeibeix.com/api/player/?s=1&url=)" + encodeURIComponent(decrypt($("#list").val()))); } }) 2. v5 /* *Progcessed By JSDec in 0.01s *JSDec - [JSDec.js.org](http://jsdec.js.org/) */ function encrypt(_0x336ffa) { var _0x456166 = { 'hhmwg': 'beibeidouyu12345', 'VlneJ': 'beibei1234567890' }; var _0x9fab4 = CryptoJS['enc']['Latin1']['parse'](_0x456166['hhmwg']); var _0x4cc587 = CryptoJS['enc']['Latin1']['parse'](_0x456166['VlneJ']); var _0x518a60 = CryptoJS['AES']['encrypt'](_0x336ffa, _0x9fab4, { 'iv': _0x4cc587, 'mode': CryptoJS['mode']['CBC'], 'adding': CryptoJS['pad']['ZeroPadding'] })['toString'](); return _0x518a60; } function decrypt(_0x55cd15) { var _0x2b29a5 = CryptoJS['enc']['Latin1']['parse']('beibeidouyu12345'); var _0x431fea = CryptoJS['enc']['Latin1']['parse']('beibei1234567890'); var _0x28806e = CryptoJS['AES']['decrypt'](_0x55cd15, _0x2b29a5, { 'iv': _0x431fea, 'mode': CryptoJS['mode']['CBC'], 'adding': CryptoJS['pad']['ZeroPadding'] })['toString'](CryptoJS['enc']['Utf8']); return _0x28806e; }; if (!(typeof encode_version !== 'undefined' && encode_version === 'sojson.v5')) { window['alert']('不能删除sojson.v5'); };

从代码和截图中我们可以很清楚的看到 hahaha 经过了调用 decrypt 方法进行了解密,生了 mp4 得网址,那么我们需要知道,hahaha 字符串是什么加密方法,搜索 decrypt 方法,我们看到了上方左边图片得一对代码,decrypt 就在其中不过全部被混淆了看不到,所以使用工具反混淆一下,看看到底是什么
image.png

对比一看原来是 aes 加密,并且使用得是 cbc 得模式,密钥我么都可以拿到了,接下来直接使用 python 得 AES 解密方法直接解密就可以了,安装 pycryptodomex 模块,好了至此完成一波,逆向破解

import requests import base64 from Crypto.Cipher import AES import re def get_encry_mp4(bvid): headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36', } # bvid = "BV1qJ411c7pA" interface_ini = f"[https://www.bilibili.com/video/](https://www.bilibili.com/video/){bvid}" url = "[https://xbeibeix.com/api/bilibili/](https://xbeibeix.com/api/bilibili/)" data = { "bilibiliurl11081": interface_ini, "zengqiang": "true" } result = requests.post(url, data=data, verify=False, headers=headers) try: encry_mp4_url = re.search('var hahaha = (.*?);', result.text).group(1) return encry_mp4_url except Exception as e: print(e) # 密钥(key), 密斯偏移量(vi) CBC模式加密 def AES_Decrypt(data): key = 'beibeidouyu12345' vi = 'beibei1234567890' data = data.encode('utf8') encodebytes = base64.decodebytes(data) # 将加密数据转换位bytes类型数据 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8')) text_decrypted = cipher.decrypt(encodebytes) text_decrypted = text_decrypted.rstrip(b'\0') # 去补位 text_decrypted = text_decrypted.decode('utf8') return text_decrypted if __name__ == '__main__': vid = 'BV16i4y1L7mw' encry_mp4_url = get_encry_mp4(vid) encry_mp4_url = mp4_decrypted = AES_Decrypt(encry_mp4_url).strip('\x0f') print(repr(mp4_decrypted))
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • 逆向
    6 引用 • 4 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 397 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 3 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖
  • Anytype
    3 引用 • 31 回帖 • 14 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 408 回帖 • 486 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    27 引用 • 196 回帖 • 27 关注
  • 反馈

    Communication channel for makers and users.

    124 引用 • 928 回帖 • 267 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 724 回帖 • 1 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    295 引用 • 749 回帖
  • abitmean

    有点意思就行了

    29 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 640 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 2 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    21 引用 • 196 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖
  • 笔记

    好记性不如烂笔头。

    311 引用 • 796 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 588 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    78 引用 • 430 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 4 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 1 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 73 关注