上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
12下一页
返回列表 发新帖

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

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    713

    主题

    6002

    回帖

    6788

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6788

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-6-24 13:11:56 | 显示全部楼层 | 阅读模式

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

    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[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best[ext=m4a]",
            "--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
    接下来抓包看pssh,文件有多个ppsh
    图片.png
    我们下载的目标文件名是output3.f1_stereo_192000.m4a
    所以搜索192000
    图片.png
    密钥为AAAAW3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADsIARIQ62dqu8s0Xpa7z2FmMPGj2hoNd2lkZXZpbmVfdGVzdCIQZmtqM2xqYVNkZmFsa3IzaioCSEQyAA==
    然后在网页抓包找到证书服务器,这个还是比较直观的
    提交和返回都是乱码的就是证书服务器
    图片.png
    图片.png
    这里我们得到了https://cwip-shaka-proxy.appspot.com/no_auth
    所以可以写出代码

    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 += [f"{key.kid.hex}:{key.key.hex()}"]
        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
    刚好对应了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

    待续....

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    开心
    昨天 08:34
  • 签到天数: 376 天

    [LV.9]以坛为家II

    7

    主题

    30

    回帖

    252

    积分

    高级工程师

    积分
    252

    挑战者 lv2

    发表于 2024-6-24 17:56:10 | 显示全部楼层
    ggnb                           
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    713

    主题

    6002

    回帖

    6788

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6788

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-6-24 22:24:58 | 显示全部楼层
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    回帖

    6

    积分

    助理工程师

    积分
    6
    发表于 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报错了,请问能指点一下吗

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    713

    主题

    6002

    回帖

    6788

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6788

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-11-11 09:26:38 | 显示全部楼层
    motionmotion 发表于 2024-11-11 09:09
    [md]```
    PS D:\JJJ> & "C:/Program Files/Python311/python.exe" d:/WhisperDesktop/WKS-KEYS-master/52pro ...

    感觉像是依赖有问题
    升级下protobuf试试
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    713

    主题

    6002

    回帖

    6788

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6788

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-11-11 09:27:20 | 显示全部楼层
    motionmotion 发表于 2024-11-11 09:09
    [md]```
    PS D:\JJJ> & "C:/Program Files/Python311/python.exe" d:/WhisperDesktop/WKS-KEYS-master/52pro ...

    另外wvd我论坛也提供了几个从AVD按教程提取的,哥哥可以直接使用
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    回帖

    6

    积分

    助理工程师

    积分
    6
    发表于 2024-11-11 09:50:31 | 显示全部楼层
    李恒道 发表于 2024-11-11 09:27
    另外wvd我论坛也提供了几个从AVD按教程提取的,哥哥可以直接使用

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    713

    主题

    6002

    回帖

    6788

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6788

    荣誉开发者喜迎中秋油中2周年生态建设者

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

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

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

    但是我掏不出来...也是从avd搞得
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    回帖

    6

    积分

    助理工程师

    积分
    6
    发表于 2024-11-12 09:26:15 | 显示全部楼层
    李恒道 发表于 2024-11-11 11:01
    我也不确定,直接升级到最新应该就好了

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    713

    主题

    6002

    回帖

    6788

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6788

    荣誉开发者喜迎中秋油中2周年生态建设者

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

    哪部分返回空白?哥哥直接搞得onlyfans吗
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表