安卓秘钥的获取+解密流程
安卓秘钥的获取
注意:改文章原文链接:https://www.freebuf.com/articles/database/375523.html
抄一遍,脑瓜子有点记忆。
1、原理图
2、视频解密方法
根据上述原理,只要我们能拿到CDM、抓到license服务器请求url,即可构造解密请求报文,获得解密key。但CDM作为播放器的预置模块,没有任何下载渠道,且官方会实时监测滥用情况,CDM解密太频繁会被吊销,故互联网上没有现成的解密工具,也没有任何CDM供下载。所以我们需要自己提取CDM。
·注意上面的 License 服务器是在网页的。数据包中,比如我使用的Roku站点,
这里的URL 就是清单地址,licenseServer 就是license服务器。
1、提取CDM
首先去咸鱼买一个可以Root 的谷歌手机,Root后 dumper 来进行提取即可,
1、提取方法
- 安卓安装Frida 运行
- 电脑连接adb调试
- 电脑运行 dump_keys.py
- 手机浏览器随便播放一个Drm视频。例如:https://bitmovin.com/demos/drm
电脑的key_dumps文件夹里就有两个设备文件了。
注意:DRM视频需要播放成功,才能提取到CDM。若播放失败一般是由于网络问题,可能需要挂代理。如果沒抓到可以多换几个浏览器。
获取好了两个设备文件分别名称为: private_key.pem client_id.bin
前文提到过,
合成一个文章是由一个指令来完成的
pywidevine create-device -k device_private_key -c device_client_id_blob -t "ANDROID" -l 3
然后在下面圈起来的地方,放上即可,
也可以用如下的代码来生成
from pywidevine.device import Device
from pathlib import Path
# e.g., for an Android L3:
device = Device(
type_=Device.Types.ANDROID,
security_level=3,
flags=None,
private_key=Path(r"private_key.pem").read_bytes(),
client_id=Path(r"client_id.bin").read_bytes()
)
# save it to a .wvd file for easier loading next time
device.dump(r"./device.wvd")
2、获取key
所需的材料:
- mpd 链接 就是上文提到的那个url
- PSSH 大部分MPD文件都包含PSSH ,少部分只包括了KID,需要用其他工具转换成PSSH,或者通过加密的mp4 来提取(这个通过mp4来获取,我师傅做的,我不会,我只会mpd提取)用python XML库就可以了。
- 获取license 服务器地址
然后将参数放入以下脚本即可获取到key
from pywidevine.cdm import Cdm
from pywidevine.device import Device
from pywidevine.pssh import PSSH
import requests
# prepare pssh
pssh = PSSH("AAAAW3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADsIARIQ62dqu8s0Xpa7z2FmMPGj2hoNd2lkZXZpbmVfdGVzdCIQZmtqM2xqYVNkZmFsa3IzaioCSEQyAA==")
# load device
device = Device.load("./device.wvd")
# load cdm
cdm = Cdm.from_device(device)
# open cdm session
session_id = cdm.open()
# get license challenge
challenge = cdm.get_license_challenge(session_id, pssh)
# send license challenge (assuming a generic license server SDK with no API front)
proxies = {
'http': 'http://127.0.0.1:1080',
'https': 'http://127.0.0.1:1080',
}
licence = requests.post("https://cwip-shaka-proxy.appspot.com/no_auth", data=challenge,proxies=proxies)
licence.raise_for_status()
# parse license challenge
cdm.parse_license(session_id, licence.content)
# print keys
for key in cdm.get_keys(session_id):
print(f"[{key.type}] {key.kid.hex}:{key.key.hex()}")
# close session, disposes of session data
cdm.close(session_id)
得到的key数量不固定,需要全部保存下来。
下载并解密视频。
这里使用到的工具是 N_m3u8DL-RE + shaka
将N_m3u8DL-RE和packager-linux-x64放在同一目录,运行以下命令即可下载+解密
./N_m3u8DL-RE -M format=mp4 "https://cdn.bitmovin.com/content/assets/art-of-motion_drm/mpds/11331.mpd"
--key ccbf5fb4c2965be7aa130ffb3ba9fd73:9cc0c92044cb1d69433f5f5839a159df
--key 9bf0e9cf0d7b55aeb4b289a63bab8610:90f52fd8ca48717b21d0c2fed7a12ae1
--key eb676abbcb345e96bbcf616630f1a3da:100b6c20940f779a4589152b57d2dacb
--key 0294b9599d755de2bbf0fdca3fa5eab7:3bda2f40344c7def614227b9c0f03e26
--key 639da80cf23b55f3b8cab3f64cfa5df6:229f5f29b643e203004b30c4eaf348f4
--use-shaka-packager --save-name day6.mp4 --live-real-time-merge -sv best -sa best
注意这里只是L3级的加密保护的解密相对于无保护的视频更安全,大大提高了解密门槛。但安全性不足,理论上都可以解密,流媒体内容
注意后面这个N_m3u8-RE 就需要自己实现一个 下载器了。我比较菜 写不出来。直接偷了我是师傅的代码。