李恒道 发表于 2024-6-24 13:11:56

onlyfans的OB解密及DRM过校验思路(五)

之前我们已经成功拿到了wvd
现在可以直接写代码了
根据网络上的资料
大致是首先拿到pssh,这个一般在mpd文件里
![图片.png](data/attachment/forum/202406/24/122602kmnyce4lnwl006k6.png)
然后用cdm加载wvd
cdm会根据wvd和ppsh请求证书服务器
证书服务器会下发解密的密钥,然后用ffmpeg解密就可以了
为了方便大家动手实践我先以https://bitmovin.com/demos/drm为例
因为m3u8的ppsh不直观,就干脆后续下载mpd了
代码如下
```js
const path = require('path');

const YTDlpWrap = require('yt-dlp-wrap').default;

const ytDlpWrap = new YTDlpWrap(path.join('./yt-dlp_x86.exe'));
let ytDlpEventEmitter = ytDlpWrap
    .exec([
      'https://cdn.bitmovin.com/content/assets/art-of-motion_drm/mpds/11331.mpd',
      "-f",
      "bestvideo+bestaudio/best/best",
      "--allow-u",
      "--no-part",
      "--restrict-filenames",
      "-N 4",
      '-o',
      'F:/vmware/output3.mp4',
    ])
    .on('progress', (progress) =>
      console.log(
            progress.percent,
            progress.totalSize,
            progress.currentSpeed,
            progress.eta
      )
    )
    .on('ytDlpEvent', (eventType, eventData) =>
      console.log(eventType, eventData)
    )
    .on('error', (error) => console.error(error))
    .on('close', () => console.log('all done'));

console.log(ytDlpEventEmitter.ytDlpProcess.pid);
```
下载到的mp4无法正常播放
![图片.png](data/attachment/forum/202406/24/122755r5691x0xyt106x59.png)
接下来抓包看pssh,文件有多个ppsh
![图片.png](data/attachment/forum/202406/24/122853rgavtfairz5aicgo.png)
我们下载的目标文件名是output3.f1_stereo_192000.m4a
所以搜索192000
![图片.png](data/attachment/forum/202406/24/122949weadwcwsejegaq8s.png)
密钥为`AAAAW3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADsIARIQ62dqu8s0Xpa7z2FmMPGj2hoNd2lkZXZpbmVfdGVzdCIQZmtqM2xqYVNkZmFsa3IzaioCSEQyAA==`
然后在网页抓包找到证书服务器,这个还是比较直观的
提交和返回都是乱码的就是证书服务器
![图片.png](data/attachment/forum/202406/24/123119flh4dlcqfhd1flhd.png)
![图片.png](data/attachment/forum/202406/24/123102su7chhnhyfshgdf2.png)
这里我们得到了`https://cwip-shaka-proxy.appspot.com/no_auth`
所以可以写出代码
```go
import json
import re

import requests
from pywidevine.cdm import Cdm
from pywidevine.device import Device
from pywidevine.pssh import PSSH



def get_keys(pssh_value, license_url):
    if pssh_value is None:
      return []
    try:
      device = Device.load("aosp.wvd")
    except:
      return []

    pssh_value = PSSH(pssh_value)
    cdm = Cdm.from_device(device)
    cdm_session_id = cdm.open()

    challenge = cdm.get_license_challenge(cdm_session_id, pssh_value)
    licence = requests.post(
      license_url, data=challenge
    )
    licence.raise_for_status()
    cdm.parse_license(cdm_session_id, licence.content)

    keys = []
    for key in cdm.get_keys(cdm_session_id):
      if "CONTENT" in key.type:
            keys +=
    cdm.close(cdm_session_id)
    return keys

print(get_keys("AAAAW3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADsIARIQ62dqu8s0Xpa7z2FmMPGj2hoNd2lkZXZpbmVfdGVzdCIQZmtqM2xqYVNkZmFsa3IzaioCSEQyAA==","https://cwip-shaka-proxy.appspot.com/no_auth"))

```
请求可以看到返回了许多密钥
```
['ccbf5fb4c2965be7aa130ffb3ba9fd73:9cc0c92044cb1d69433f5f5839a159df', '9bf0e9cf0d7b55aeb4b289a63bab8610:90f52fd8ca48717b21d0c2fed7a12ae1', 'eb676abbcb345e96bbcf616630f1a3da:100b6c20940f779a4589152b57d2dacb', '0294b9599d755de2bbf0fdca3fa5eab7:3bda2f40344c7def614227b9c0f03e26', '639da80cf23b55f3b8cab3f64cfa5df6:229f5f29b643e203004b30c4eaf348f4']
```
前边是kid,后边是解密的密钥
我们返回之前看我们kid是eb676abb-cb34-5e96-bbcf-616630f1a3da
![图片.png](data/attachment/forum/202406/24/130829o6r6d7fcf1udrd4u.png)
刚好对应了`eb676abbcb345e96bbcf616630f1a3da:100b6c20940f779a4589152b57d2dacb`
可以知道我们的密钥是100b6c20940f779a4589152b57d2dacb
(一个小小的冷知识,其实全怼进去,ffmpeg自己也能识别出来正确的)
所以输入
`ffmpeg -decryption_key 100b6c20940f779a4589152b57d2dacb -i output3.f1080_4800000.mp4 -codec copy decrypted_media.mp4 `解密视频
使用同样的密钥
` ffmpeg -decryption_key 100b6c20940f779a4589152b57d2dacb -i output3.f1_stereo_192000.m4a -codec copy decrypted_media.m4a`解密音频
输入`ffmpeg -i decrypted_media.mp4 -i decrypted_media.m4a -vcodec copy -acodec copy video.mp4`合并视频音频
我们就得到了一个DRM视频,当然因为版权保护问题无法截图~
![图片.png](data/attachment/forum/202406/24/131121ukejel7mkplhmm4p.png)
# 待续....









yhzc2023 发表于 2024-6-24 17:56:10

ggnb                           

李恒道 发表于 2024-6-24 22:24:58

yhzc2023 发表于 2024-6-24 17:56
ggnb

谢谢哥哥~

motionmotion 发表于 2024-11-11 09:09:00

```
PS D:\JJJ> & "C:/Program Files/Python311/python.exe" d:/WhisperDesktop/WKS-KEYS-master/52project/52.py
Traceback (most recent call last):
File "d:\JJJ\52.py", line 5, in <module>
    from pywidevine.cdm import Cdm
File "d:\JJJ\pywidevine\__init__.py", line 1, in <module>
    from .cdm import *
File "d:\JJJ\pywidevine\cdm.py", line 21, in <module>
    from pywidevine.device import Device, DeviceTypes
File "d:\JJJ\pywidevine\device.py", line 17, in <module>
    from pywidevine.license_protocol_pb2 import ClientIdentification, DrmCertificate, FileHashes, SignedDrmCertificate      
File "d:\JJJ\pywidevine\license_protocol_pb2.py", line 9, in <module>
    from google.protobuf.internal import builder as _builder
ImportError: cannot import name 'builder' from 'google.protobuf.internal' (C:\Program Files\Python311\Lib\site-packages\google\protobuf\internal\__init__.py)
PS D:\JJJ>
```
大佬你好,一路跟着大佬的教程跟到这一步,vscode报错了,请问能指点一下吗


李恒道 发表于 2024-11-11 09:26:38

motionmotion 发表于 2024-11-11 09:09
```
PS D:\JJJ> & "C:/Program Files/Python311/python.exe" d:/WhisperDesktop/WKS-KEYS-master/52pro ...

感觉像是依赖有问题
升级下protobuf试试

李恒道 发表于 2024-11-11 09:27:20

motionmotion 发表于 2024-11-11 09:09
```
PS D:\JJJ> & "C:/Program Files/Python311/python.exe" d:/WhisperDesktop/WKS-KEYS-master/52pro ...

另外wvd我论坛也提供了几个从AVD按教程提取的,哥哥可以直接使用

motionmotion 发表于 2024-11-11 09:50:31

李恒道 发表于 2024-11-11 09:27
另外wvd我论坛也提供了几个从AVD按教程提取的,哥哥可以直接使用

wvd跟着52的贴子已经成功弄到啦,就是从安卓手机提取的那个没看懂,最后从模拟器提成功了。protobuf的话是不是要求低于20版本才行?

李恒道 发表于 2024-11-11 11:01:02

motionmotion 发表于 2024-11-11 09:50
wvd跟着52的贴子已经成功弄到啦,就是从安卓手机提取的那个没看懂,最后从模拟器提成功了。protobuf的话 ...

我也不确定,直接升级到最新应该就好了

安卓提取需要真机,稳定性好像更好一些

但是我掏不出来...也是从avd搞得

motionmotion 发表于 2024-11-12 09:26:15

李恒道 发表于 2024-11-11 11:01
我也不确定,直接升级到最新应该就好了

安卓提取需要真机,稳定性好像更好一些


请问用脚本返回空白是不是代表 wvd 不行,,要重新提取?(完全按照思路(五)的操作来的){:4_88:}昨晚弄了好几个钟没弄明白

李恒道 发表于 2024-11-12 09:57:38

motionmotion 发表于 2024-11-12 09:26
请问用脚本返回空白是不是代表 wvd 不行,,要重新提取?(完全按照思路(五)的操作来的)昨晚弄了好几个钟没弄 ...

哪部分返回空白?哥哥直接搞得onlyfans吗
页: [1] 2
查看完整版本: onlyfans的OB解密及DRM过校验思路(五)