本文仅讲述 bilibili DRM 视频解密密钥的获取与整体流程简介,不包含任何实现与算法分析浏览器角色: 现代浏览器 (如 Chrome, Firefox, Edge) 都内置了“加密媒体扩展” (Encrypted Media Extensions, EME)。EME 是一个 W3C 标准的 API,它允许网页通过 JavaScript 与浏览器的内容解密模块 (Content Decryption Module, CDM) 进行通信,而无需了解解密过程本身。
CDM (内容解密模块): 这是浏览器中真正负责解密的部分。每个浏览器或操作系统都有自己的 CDM,用于处理特定的 DRM 系统。例如:
Google Widevine: 通常用于 Chrome 浏览器和 Android 设备。
Apple FairPlay: 用于 Safari 浏览器和 iOS/macOS 设备。
Microsoft PlayReady: 用于 Edge 浏览器和 Windows 设备。这里我们只需要了解 DRM 用到了 EME 和 CDM 模块即可对于 DASH 这种自适应流媒体,你不能像播放普通 MP4 一样直接设置 video.src = "video.mp4"。你必须:这是不使用库时最复杂的部分。整个过程是一个精确的“握手”协议:40eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7r3W2Q4x3X3g2T1K9h3I4A6j5X3W2D9K9g2)9J5k6h3y4G2L8g2)9J5c8Y4m8#2k6%4k6Q4x3V1k6H3L8r3q4&6k6i4u0Q4x3V1k6%4k6h3u0Q4x3V1k6H3L8r3q4&6N6i4u0D9i4K6y4r3j5i4k6A6k6q4)9K6c8q4!0q4x3W2)9^5x3q4!0m8y4W2)9J5y4X3q4E0M7q4)9K6b7X3c8J5L8g2)9#2k6Y4c8W2j5$3S2Q4y4h3k6@1P5i4m8W2i4K6y4p5x3R3`.`. 视频元信息270K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1N6X3y4Q4x3X3c8V1M7X3#2Q4x3X3g2T1K9h3I4A6N6X3W2V1k6h3!0Q4x3X3g2U0L8$3#2Q4x3V1k6U0k6i4u0Q4x3V1k6T1K9h3I4A6j5X3W2D9K9g2)9#2k6X3y4W2M7Y4c8A6k6X3W2U0j5i4c8W2i4K6u0W2j5X3W2F119eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1N6X3y4Q4x3X3c8V1M7X3#2Q4x3X3g2T1K9h3I4A6N6X3W2V1k6h3!0Q4x3X3g2U0L8$3#2Q4x3V1k6T1K9h3I4A6i4K6g2X3N6$3W2V1k6i4k6A6L8X3f1`.ff7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7r3W2Q4x3X3g2T1K9h3I4A6j5X3W2D9K9g2)9J5k6h3y4G2L8g2)9J5c8Y4m8#2k6%4k6Q4x3V1k6H3L8r3q4&6k6i4u0Q4x3V1k6%4k6h3u0Q4x3V1k6H3L8r3q4&6N6i4u0D9i4K6y4r3j5i4k6A6k6q4)9K6c8q4!0q4x3W2)9^5x3q4!0m8y4R3`.`. 注意这个和上面那个用途不一样1cdK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6x3g2)9J5k6h3S2V1M7$3I4T1i4K6u0W2j5$3!0E0i4K6u0r3j5X3k6K6i4K6u0r3M7%4c8S2N6r3W2U0i4K6u0r3M7r3I4S2P5h3g2J5i4K6u0r3L8h3q4A6L8W2)9J5c8Y4N6A6k6r3N6W2N6s2y4Q4x3V1k6F1M7r3c8Q4x3X3g2V1M7X3#2Q4y4h3k6K6k6r3E0Q4x3X3f1%4k6o6S2W2x3h3f1#2k6W2)9J5k6h3A6K6 CKC 解密模块80dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1N6X3y4Q4x3X3c8V1M7X3#2Q4x3X3g2T1K9h3I4A6N6X3W2V1k6h3!0Q4x3X3g2U0L8$3#2Q4x3V1k6U0k6i4u0Q4x3V1k6T1K9h3I4A6k6s2u0E0i4K6g2X3M7s2g2T1i4K6u0W2K9$3g2&6 DRM 公钥文件273K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1N6X3y4Q4x3X3c8V1M7X3#2Q4x3X3g2T1K9h3I4A6N6X3W2V1k6h3!0Q4x3X3g2U0L8$3#2Q4x3V1k6T1K9h3I4A6k6s2u0E0 CKC 数据在 playurl 的请求里可以发现多出了一些奇怪的字段 drm_type widevine_pssh加载请求中的 widevine_pssh 数据到每个音频 / 视频流数据上该数据将作为 KeySystem 的 InitData 值其中 KeySystem 可能是其中的一个(根据环境变化)通过以下方式解码,注意该处会先调用所有可用的 KeySystem 进行 InitData(测试哪些可用)这里可以把所有的 KeySystem 都断点在请求结果处理函数中,我们注意到有一个 setMpdBody 的函数,很明显是用于设定 Mpd 元信息的函数跟踪进去attachExternal 调用 attachSourceProxy在 attachSourceProxy 内,判断视频流的格式,然后第一次进入该函数会请求 bilibili_certificate.bin 也就是证书文件获取到证书文件后 base64 作为 serverCertificate然后 POST 请求 bili_widevine 接口得到一个奇怪的字符串(请求数据 TODO )在请求完成回调处断点,我们会得到这样的东西接着他会进入 updateKeySession 函数,该函数就是更新 kid 与 key 的地方只不过传入以上数据它并不是合法的,所以我们会等到第二次调用这个函数,第二次调用才会传入正确值抛出错误后他会再进行一次请求,不过这次请求的接口是 playurl ,请求函数见上接着它就能获取到 kid (从 playurl 接口得到),注意对比两次的 playurl 请求会发现第一次请求是没有 bilidrm_uri 而只有 widevine_pssh 的,第二次则相反,因为第二次请求没有加 &drm_tech_type=2 的参数该值是获取 bilidrm_uri 的最后一个 // 后的文本得出的,而该值从 得出最后获取 key 的函数均在 getKeyDetail 内,比较简单,不做分析最后我们能
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287970.htm
[原创][首发] b 站 drm 视频流程简析
257 浏览
4 回复
tql
b站用的是clearkey吗
mb_fcgcghat
b站用的是clearkey吗
这个示例是
b站用的是clearkey吗
这个示例是
感谢分享 用这套方法解密成功了
现在是2026年4月9日 截止当前时间 b站依然是这套逻辑
最后于 2026-4-9 11:26
被git_8924912redcircle编辑
,原因:
现在是2026年4月9日 截止当前时间 b站依然是这套逻辑
最后于 2026-4-9 11:26
被git_8924912redcircle编辑
,原因: