安卓秘钥的获取+解密流程

安卓秘钥的获取

注意:改文章原文链接:https://www.freebuf.com/articles/database/375523.html

抄一遍,脑瓜子有点记忆。

1、原理图

image

2、视频解密方法

根据上述原理,只要我们能拿到CDM、抓到license服务器请求url,即可构造解密请求报文,获得解密key。但CDM作为播放器的预置模块,没有任何下载渠道,且官方会实时监测滥用情况,CDM解密太频繁会被吊销,故互联网上没有现成的解密工具,也没有任何CDM供下载。所以我们需要自己提取CDM。

·注意上面的 License 服务器是在网页的。数据包中,比如我使用的Roku站点,

image

这里的URL 就是清单地址,licenseServer 就是license服务器。

1、提取CDM

首先去咸鱼买一个可以Root 的谷歌手机,Root后 dumper 来进行提取即可,

1、提取方法

  1. 安卓安装Frida 运行
  2. 电脑连接adb调试
  3. 电脑运行 dump_keys.py
  4. 手机浏览器随便播放一个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

然后在下面圈起来的地方,放上即可,

image

也可以用如下的代码来生成

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

所需的材料:

  1. mpd 链接 就是上文提到的那个url
  2. PSSH 大部分MPD文件都包含PSSH ,少部分只包括了KID,需要用其他工具转换成PSSH,或者通过加密的mp4 来提取(这个通过mp4来获取,我师傅做的,我不会,我只会mpd提取)用python XML库就可以了。
  3. 获取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 就需要自己实现一个 下载器了。我比较菜 写不出来。直接偷了我是师傅的代码。

posted @ 2024-12-21 17:40  未然king  阅读(10)  评论(0编辑  收藏  举报