mb_jepgtozh 2025-09-05 18:08 上海
看雪论坛作者ID:mb_jepgtozh

🔑 EME 和 CDM 模块:现代浏览器内置 EME (Encrypted Media Extensions) 标准 API,允许网页与 CDM (Content Decryption Module) 通信,而 CDM 负责实际解密。不同浏览器或操作系统使用不同的 CDM,例如 Chrome 使用 Google Widevine,Safari 使用 Apple FairPlay,Edge 使用 Microsoft PlayReady。
📈 MSE 动态加载:对于 DASH 等自适应流媒体,需要手动加载和解析 MPD 文件,获取视频编码信息、码率、初始化片段和媒体片段 URL。然后通过 MSE (Media Source Extensions) 动态提供媒体数据,将加密片段按顺序 append 到 SourceBuffer 中。
🔑 EME 手动解密流程:选择 DRM 系统,创建 MediaKeys 对象并与 Video 元素关联。监听 'encrypted' 事件,生成许可证请求并发送到许可证服务器。接收许可证并更新 MediaKeySession,CDM 解密媒体片段,视频即可播放。
🔍 接口/方法/事件:包括 navigator.requestMediaKeySystemAccess()、MediaKeySystemAccess.createMediaKeys()、video.setMediaKeys()、mediaKeys.createSession()、video.addEventListener('encrypted', ...)、session.generateRequest()、session.addEventListener('message', ...)、fetch() 和 session.update() 等,用于实现 EME 解密流程。
mb_jepgtozh 2025-09-05 18:08 上海
看雪论坛作者ID:mb_jepgtozh
video.src = "video.mp4"。你必须:1.手动加载和解析 MPD 文件:用 fetch 获取 .mpd 清单文件,然后用 JavaScript 解析这个 XML 文件,找出视频的编码信息、码率、初始化片段和媒体片段的 URL。2.通过 MSE 动态提供媒体数据:◆创建一个 MediaSource 对象。◆将这个对象的 URL 赋给 <video> 元素的 src。◆在 MediaSource 对象上创建一个 SourceBuffer。◆手动下载视频的初始化片段和后续的媒体片段,然后按顺序将它们 appendBuffer() 到 SourceBuffer 中。3.通过 EME 处理加密:在向 SourceBuffer 推送加密片段时,浏览器会触发事件,此时你需要启动 EME 流程来获取解密密钥。EME 手动解密流程详解这是不使用库时最复杂的部分。整个过程是一个精确的“握手”协议:1.选择 DRM 系统:◆使用 navigator.requestMediaKeySystemAccess('com.widevine.alpha', ...) 来询问浏览器是否支持 Widevine。2.创建 MediaKeys:◆如果支持,就调用 createMediaKeys() 来创建一个 MediaKeys 对象。这个对象代表了浏览器中的 CDM(内容解密模块)。3.关联到 Video 元素:◆调用 video.setMediaKeys(mediaKeys),将这个 MediaKeys 对象与你的 <video> 元素关联起来。4.监听加密事件:◆当你通过 MSE 的 appendBuffer() 向 SourceBuffer 推送了一个加密的媒体片段后,MediaSource 会触发一个 'encrypted' 事件。5.生成许可证请求:◆在这个事件的处理器中,你会得到 initData(初始化数据,通常来自 MPD 或媒体片段的'moov'/'moof'盒子)。◆使用 mediaKeys.createSession() 创建一个许可证会话 (MediaKeySession)。◆调用 session.generateRequest('cenc', initData) 来生成一个许可证请求。6.发送请求到许可证服务器:◆generateRequest 是一个Promise,完成后,session 对象会触发一个 'message' 事件。◆这个事件的 message 属性就是需要发送给Widevine许可证服务器的请求体 (Challenge)。◆使用 fetch 将这个请求体(通常是二进制的 ArrayBuffer)POST 到你的许可证服务器 URL。7.提供许可证给 CDM:◆fetch 请求会收到许可证服务器返回的许可证 (License)。◆调用 session.update(license),将这个许可证交给 MediaKeySession。8.解密和播放:◆一旦 CDM 成功处理了你提供的许可证,它就拥有了解密密钥。◆现在,当后续的加密媒体片段被推送到 SourceBuffer 时,CDM 就可以在后台自动解密它们,然后视频就能正常播放了。playurl的请求里可以发现多出了一些奇怪的字段drm_typewidevine_psshKeySystem的InitData值其中KeySystem可能是其中的一个(根据环境变化)this.CLEARKEY_KEYSTEM_STRING = "org.w3.clearkey",this.WIDEVINE_KEYSTEM_STRING = "com.widevine.alpha",this.PLAYREADY_KEYSTEM_STRING = "com.microsoft.playready"
InitData(测试哪些可用)这里可以把所有的 KeySystem 都断点attachExternal调用attachSourceProxyattachSourceProxy内,判断视频流的格式,然后第一次进入该函数会请求***_certificate.bin也就是证书文件。serverCertificateupdateKeySession函数,该函数就是更新 kid 与 key 的地方。只不过传入以上数据它并不是合法的,所以我们会等到第二次调用这个函数,第二次调用才会传入正确值。kid(从playurl接口得到),注意对比两次的 playurl 请求会发现第一次请求是没有bilidrm_uri而只有widevine_pssh的,第二次则相反,因为第二次请求没有加&drm_tech_type=2的参数。bilidrm_uri的最后一个//后的文本得出的,而该值从得出:getKeyDetail内,比较简单,不做分析。{"osStatus":0,"iv":"pIEmSahBQLWILQEUa+yFEw==","key":"c6xChuWnTweKvL8/j0Cm8A==","protectionData":{"org.w3.clearkey":{"clearkeys":{"2PZrk9soSYS05_xQ1xJ4_w":"c6xChuWnTweKvL8_j0Cm8A"},"priority":0}}}
使用 clearkeys 解密即可。BBDown.exe https://www.***.com/cheese/play/ep1302284 --skip-mux
kid 和 key 解码 base64 (注意是 url safe )d8f66b93db284984b4e7fc50d71278ff:73ac4286e5a74f078abcbf3f8f40a6f0
mp4decrypt.exe --key d8f66b93db284984b4e7fc50d71278ff:73ac4286e5a74f078abcbf3f8f40a6f0 "voice.m4a" "voice_.m4a"mp4decrypt.exe --key d8f66b93db284984b4e7fc50d71278ff:73ac4286e5a74f078abcbf3f8f40a6f0 "video.mp4" "video_.mp4"
ffmpeg.exe -i voice_.m4a -i video_.mp4 -c:v copy -c:a copy output.mp4
看雪ID:mb_jepgtozh
*本文为看雪论坛优秀文章,由 mb_jepgtozh 原创,转载请注明来自看雪社区
议题征集倒计时!看雪·第九届安全开发者峰会(SDC 2025)
# 往期推荐
实现简易ARK工具:遍历进程和内核模块
Gepys木马分析与还原C代码
UNC2891银行攻防战:ATM物理后门与Linux反取证揭秘
CVE-2014-0038内核漏洞exp分析
APP登录请求之协议分析
AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。
鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑