DRM Pentesting Toolkit 是一个模块化、基于插件的 DRM 渗透测试工具包,附带 CustomTkinter 图形界面,旨在帮助开发者进行 DRM 安全测试、编写自定义插件并自动化密钥提取流程。
用途 该工具包用于 DRM 相关的安全测试,主要围绕 Widevine 和 PlayReady 两类 DRM 系统展开,覆盖从设备加载、PSSH 提取、许可证请求到内容下载解密的完整链路。
主要能力
- 加载并验证 Widevine(.wvd)与 PlayReady(.prd)设备文件。
- 从 DASH/MPD 清单中解析 PSSH(Protection System Specific Header)数据。
- 与许可证服务器通信,从许可证服务器提取解密密钥。
- 生成内嵌密钥的 M3U 播放列表。
- 通过 N_m3u8DL-RE 下载并解密受保护内容。
- 管理凭据、代理和 HTTP 配置。
- 通过插件栈系统串联多个操作。
安装 克隆仓库并安装依赖:
git clone https://github.com/fairy-root/drm-pentesting-toolkit.git cd drm-pentesting-toolkit pip install -r requirements.txt mkdir -p devices/widevine devices/playready credentials proxies N_m3u8DL-RE OUTPUT
requirements.txt 中的依赖包括:customtkinter>=5.2.0、pywidevine>=1.8.0、pyplayready>=1.3.0、requests>=2.31.0、Brotli>=1.1.0、protobuf>=4.25.0。
额外设置:将 DRM 设备文件放入 devices/widevine/.wvd 或 devices/playready/.prd;将 N_m3u8DL-RE 和 shaka-packager 可执行文件下载到 N_m3u8DL-RE/;在 credentials/ 中创建凭据文件(格式:username:password);在 proxies/ 中创建代理文件(格式:host:port:user:pass)。
运行应用 启动 GUI:
python main.py
GUI 提供以下标签页:MPD Data(配置清单 URL、请求头、Cookie)、License Data(设置许可证服务器 URL 和认证)、Logs & Output(监控插件执行)、Downloads(跟踪 N_m3u8DL-RE 下载进度)。
核心架构:插件系统 插件是 plugins/ 目录下的 Python 文件,需定义 run() 函数。插件管理器通过内省自动检测所需参数、将 UI 上下文映射到函数参数,并在链式插件之间传递结果。可用的插件上下文变量包括:device_path、device_type、cdm、session_id、pssh、license_url、mpd_url、mpd_headers、mpd_cookies、license_headers、license_cookies、license_post_data、keys、credentials、proxy_line、search_query。
创建插件示例:
def run(mpd_url, mpd_headers, log_callback=None): import requests if log_callback: log_callback(f"Fetching MPD from: {mpd_url}") response = requests.get(mpd_url, headers=mpd_headers, timeout=10) response.raise_for_status() mpd_content = response.text return {'mpd_content': mpd_content, 'mpd_size': len(mpd_content)}
常见工作流 密钥提取工作流通常按以下插件顺序执行:加载设备、解析 PSSH、发送许可证请求、提取密钥。示例插件包括 1_load_devices.py(加载 Widevine 设备并打开 CDM 会话)、2_parse_pssh.py(从 MPD 中提取 PSSH)、4_send_license.py(生成许可证挑战、发送请求、解析许可证并提取 CONTENT 类型密钥)。
下载工作流示例 6_n_m3u8dl_re.py 通过 subprocess 调用 N_m3u8DL-RE,传入 --key 参数、--save-dir、--save-name、--auto-select、--no-log 等选项。
凭据集成 当启用“Expose Credentials”时,插件可访问 credentials 字典,其中可能包含 username、password、api_key、mac_address 等字段,用于向许可证服务器进行认证。
配置 环境设置位于 settings/environment.ini,可配置凭据类型的正则表达式(EMAIL_PASSWORD、USERNAME_PASSWORD、API_KEY、MAC_ADDRESS)。应用状态保存到 settings/savestate.json,包含 mpd_url、mpd_headers、license_url、selected_device、selected_credentials、plugin_stack 等字段。代理文件格式支持非认证(host:port)和认证(host:port:user:pass)两种形式。
编程式使用 可直接使用 PluginManager:
from core.plugin_manager import PluginManager pm = PluginManager(plugins_dir='plugins') pm.scan_plugins() context = {...} for plugin_name in plugin_stack: plugin_info = pm.plugins[plugin_name] result = pm.run_plugin(plugin_info, context, log_callback=print) if isinstance(result, dict): context.update(result)
设备文件验证可使用 pywidevine 的 Device.load 与 Cdm.from_device,检查安全级别和 Client ID。
故障排查 文档涵盖以下常见问题及解决方向:插件未检测到参数(检查函数签名与上下文键名匹配)、PSSH 提取失败(尝试不同 HTTP 方法或替代 PSSH 位置)、许可证请求失败(检查请求头与凭据处理、POST 数据格式)、下载进程挂起(检查可执行文件路径与权限)、设备加载错误(验证设备文件格式与依赖版本)、凭据未暴露(确保 GUI 中启用相应复选框且凭据文件格式正确)。
高级模式 包括多密钥内容处理(遍历去重后的 PSSH 列表逐个提取密钥)以及从环境变量读取敏感请求头(避免硬编码令牌)。
适用场景与限制 该工具面向 DRM 安全测试场景,需要使用者自行准备合法的 DRM 设备文件、凭据与代理配置,并自行下载 N_m3u8DL-RE 与 shaka-packager 可执行文件。工具本身不提供设备文件、密钥或内容,具体使用须遵守相关法律法规与授权范围。