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

Posts in this series