Dumping Your Own L3 CDM From Android Simulator
背景
最近在整理家里的 iptv
的播放列表,家里的 iptv
播放列表是通过运营商的 iptv
网络组播转单播实现的。央视和卫视基本满足需求。可能是因为我最近在学英文,也可能是我最近 tiktok
刷的比较多,想看一些国外的电视台。在网上找了一些公开出来的直播链接,基本上都不太靠谱,要么视频质量差,要么就是不能正常播放,总之各种问题。
经过一翻调研,我发现有很多官方 app
或是 网站是提供一些直播源的,只是想直接在电视上观看(融合到自己的 iptv
m3u8
播放列表里,是需要做一些破解的工作的。基本上分两大类:
- 获取直播链接加密
- 视频流加密(DRM)
第一类的之前写了一篇破解文章 《关于4gtv(四季线上) APP 逆向 —— 免费看台湾频道》, 大多数都是类似的,如果只爱看凤凰卫视,那破解更简单了,后面等我整理好了再分享出来。
视频流加密的(DRM)就比较复杂了,其中比较重要的一步就是要获取一个有效的设备证书,本文只分享这部分内容。(原因是之前在网上看了一些文章,发现很多都不行了)
本文以macbook m2芯片为例
创建虚拟机
使用命令行创建可以参考之前的文章 《Manually installing the Flutter development environment on MacOS.》 去搭建环境以及创建虚拟机
- Create a Pixel 5 with API Level 28 and Target Android 9.
注意,这里需要选择 28 版本,不是所有的版本都能成功, 28 亲测是可以的。选择 googel_apis image, 可以正常 su 还有底层 google 框架。
1create avd --name "pixel5-googleapi-28" --package "system-images;android-28;google_apis;arm64-v8a" --device "pixel_5"
- Start Pixel 5 simulator
1emulator -avd pixel5-googleapi-28
下载安装 frida-server
- Install frida-server
download frida-server from github: https://github.com/frida/frida/releases Select latest version
frida-server-16.5.2-linux-arm64.xz
1xz -dk frida-server-16.5.2-linux-arm64.xz
2adb push frida-server-16.5.1-android-arm64 /data/local/tmp/
- Start frida-server
1adb devices
2adb shell
3cd /data/local/tmp/
4su
5chmod +x frida-server-16.5.1-android-arm64
6./frida-server-16.5.1-android-arm64
Dump 证书
- 创建需要的目录
1mkdir keydive
2cd keydive
- 创建python的虚拟环境
我习惯使用虚拟环境,这样依赖只是安装在虚拟环境中,不想要了可以整个虚拟环境全部删掉,比较方便。
1python -m venv venv
2source venv/bin/active
3pip install frida
4pip install frida-tools
5pip instlal keydive
- Dump
1keydive -a
keydive 功能列表
1» keydive -h
2usage: keydive [-h] [-d <id>] [-v] [-l <dir>] [--delay <delay>] [--version] [-a] [-c <file>] [-w] [-o <dir>]
3 [-f <file>]
4
5Extract Widevine L3 keys from an Android device.
6
7options:
8 -h, --help show this help message and exit
9
10Global options:
11 -d <id>, --device <id>
12 Specify the target Android device ID to connect with via ADB.
13 -v, --verbose Enable verbose logging for detailed debug output.
14 -l <dir>, --log <dir>
15 Directory to store log files.
16 --delay <delay> Delay (in seconds) between process checks in the watcher.
17 --version Display KeyDive version information.
18
19Cdm options:
20 -a, --auto Automatically open Bitmovin's demo.
21 -c <file>, --challenge <file>
22 Path to unencrypted challenge for extracting client ID.
23 -w, --wvd Generate a pywidevine WVD device file.
24 -o <dir>, --output <dir>
25 Output directory path for extracted data.
26 -f <file>, --functions <file>
27 Path to Ghidra XML functions file.
证书文件
执行上述步骤后,在
keydive
目录里就会生成一个device
目录,证书文件就在这个目录里。
- private_key.pem
- client_id.bin
1» find device
2device
3device/unknown
4device/unknown/Android SDK built for arm64
5device/unknown/Android SDK built for arm64/7283
6device/unknown/Android SDK built for arm64/7283/2442013296
7device/unknown/Android SDK built for arm64/7283/2442013296/private_key.pem
8device/unknown/Android SDK built for arm64/7283/2442013296/client_id.bin
CREATE WVD File
- install pywidevine
1pip install pywidevine
- create wvd file
1pywidevine create-device -k ./private_key.pem -c ./client_id.bin -t "ANDROID" -l 3