逆向工程 Kindle 网页阅读器的新版 DRM Cameron (pixelmelt.dev) 2025-10-31 0 浏览 0 点赞 长文 ## 背景 2025年9月,亚马逊更新了其Kindle网页阅读器(Kindle Cloud Reader),引入了一套全新的数字版权管理(DRM)系统。这次更新导致了像 DeDRM 这样的流行工具失效,使得用户无法再像以前一样轻松地备份自己购买的电子书。新系统采用了Google的Widevine DRM技术,这通常用于保护流媒体视频内容。 ## 目标与挑战 本文作者的目标是找到一种方法来解密自己合法购买的电子书,以便进行个人、离线的备份。挑战在于,Widevine DRM 的设计初衷就是为了防止内容被轻易提取,它通过一个名为“内容解密模块”(Content Decryption Module, CDM)的黑盒组件来处理解密密钥和解密过程,密钥本身永远不会暴露给浏览器或任何JavaScript代码。 ## 逆向分析过程 作者通过浏览器的开发者工具进行了一系列的侦察工作: 1. **网络请求分析**: 作者发现阅读器加载的不是完整的书籍文件,而是一系列 `.mkv` 清单文件和加密的 `.aac` 音频片段。这种分段加载的模式是流媒体服务的典型特征,进一步证实了Widevine的使用。 2. **定位关键代码**: 通过搜索代码,作者定位到了 `shaka-player.ui.js`,这是一个用于播放自适应流媒体的流行JavaScript库。通过分析Shaka Player的初始化配置,作者找到了用于获取解密密钥的许可证服务器URL:`https://asset-key-license-prod.api.amazon.com/...`。 3. **理解许可证流程**: 与许可证服务器的交互是DRM的核心。浏览器(通过CDM)生成一个加密的“挑战”(challenge),发送到许可证服务器。服务器验证请求后,返回一个包含解密密钥的加密“响应”(response)。这个响应只能由发起请求的那个CDM实例解密和使用。 ## 核心解决方案:将CDM用作“解密预言机” 由于无法从CDM中直接提取密钥,作者转变了思路:**既然无法拿到密钥,那就利用CDM本身来完成解密工作**。作者将CDM视为一个“解密预言机”(decryption oracle)——你可以给它加密的数据,它会返回解密后的数据,但绝不透露密钥。 为此,作者开发了一个Chrome浏览器扩展程序,其工作流程如下: 1. **注入与代理**: 扩展程序向Kindle网页阅读器页面注入脚本,并代理了几个关键的JavaScript API,如 `navigator.requestMediaKeySystemAccess`。 2. **获取会话**: 当Kindle页面代码创建一个用于DRM解密的媒体密钥会话(`MediaKeySession`)时,扩展程序会拦截并保存对这个会话对象的引用。这个会话是经过CDM验证并加载了有效密钥的,可以被视为一个“已授权的解密器”。 3. **拦截加密内容**: 扩展程序使用 `chrome.debugger` API 拦截所有从亚马逊服务器下载的加密书籍片段(`.aac` 文件)的网络响应。 4. **调用解密**: 对于每一个拦截到的加密数据块,扩展程序会调用它之前保存的 `MediaKeySession` 对象的 `decrypt()` 方法。 5. **拼接与保存**: `decrypt()` 方法返回一个包含解密后明文的 `ArrayBuffer`。扩展程序将这些解密后的数据片段拼接起来,最终还原成完整的书籍内容(通常是一个大的JSON文件),并提供给用户下载。 ## 结论 通过这种巧妙的方法,作者成功绕过了新的Kindle DRM。该方案的核心在于,它没有试图去破解Widevine或提取密钥,而是利用了浏览器提供的合法DRM机制,将其“武器化”,使其为解密书籍内容服务。这充分展示了在逆向工程中,理解系统工作流程并创造性地利用系统自身功能的重要性。 阅读 Pixel Melt 原文 本文的原始来源。 #DRM #Kindle #Widevine #浏览器扩展 #逆向工程