李恒道 发表于 2024-7-1 11:09:52

【结束大吉】onlyfans的OB解密及DRM过校验思路(八)

所以我们接下来只需要给cdmServer拓展一下设置证书,在node部分拿到证书就可以了
剩下的不算很难了,我就只罗列一些关键的代码
获取pssh,这里我偷懒排序取了个最小pssh
```js
function getPSSH(url, Cookie) {
return new Promise(async (resolve, reject) => {
    try {
      const { data } = await axios.request({
      method: 'get',
      url: url,
      headers: {
          'Cookie': Cookie
      },
      })
      const reg = /<cenc\:pssh>(.*)<\/cenc\:pssh>/g
      const psshArray = sortArray([...data.matchAll(reg)].map(item => item))
      resolve(psshArray)
    } catch (error) {
      console.log(error)
      reject()
    }

})
}
```
然后获取证书
```js
                  const certificate = await new Promise((resolve) => {
                  axios.post(domain + cdmServer, buf, {
                      headers: cdmHeader,
                      responseType: "arraybuffer"
                  }).then((response) => {
                      resolve(response.data.toString('hex'))
                  }).catch((err) => {
                      console.log('err', err)
                  })
                  })
```
在服务器端判断是否有证书,有的话就设置
```python
    certificate= form.get("certificate")
    if not certificate is None:
         certificate=bytes.fromhex(certificate)
         cdmInstance.set_service_certificate(cdm_session_id,certificate)
```
那么我们就可以拿到密钥了,先在js创建一个密钥数组
```js
    const keyList = data.data.map((item) => item.key).map((key) => {
      return '-decryption_key ' + key
    })
```
分别解密mp4和m4a
```js
    const fileList = await downloadDRMViedeo(mpd, baseDir, mediaItem.id, Cookie)
    const mergeFile = []
    for (let index = 0; index < fileList.length; index++) {
      const filePath = fileList
      await new Promise((resolve) => {
      ffmpeg().input(baseDir + '/' + filePath).inputOptions([
          ...keyList,
      ]).audioCodec('copy').videoCodec('copy').output(baseDir + '/drm_' + filePath).on("end", () => {
          mergeFile.push(baseDir + '/drm_' + filePath)
          resolve();
      }).run()
      })
    }
```
然后将两个视频合并到一起就可以了
```js
    await new Promise((resolve) => {
      ffmpeg().input(mergeFile).input(mergeFile).audioCodec('copy').videoCodec('copy').output(baseDir + '/decrypt_drm_' + mediaItem.id + '.mp4')
      .on('error', function (err) {
          console.log('An error occurred: ' + err.message);
      })
      .on('end', function () {
          resolve();
      })
      .run();
    })
```
最后调用deleteVideoFiles分别删除残余文件
```js
await deleteVideoFiles(baseDir, mediaItem.id + '')
await deleteVideoFiles(baseDir, 'drm_' + mediaItem.id)
```
这里的删除是我组合的功能函数,也抄了网上的
传入路径和文件前缀就可以自动删除
```js
function deleteFiles(files, callback) {
if (files.length == 0) {
    callback()
}
var i = files.length;
files.forEach(function (filepath) {
    fs.unlink(filepath, function (err) {
      i--;
      if (err) {
      callback(err);
      return;
      } else if (i <= 0) {
      callback(null);
      }
    });
});
}
async function deleteVideoFiles(path, id) {
return new Promise(async (resolve) => {
    const files = await getVideoFiles(path, id)
    deleteFiles(files, resolve)
})
}
```
那么就实现了onlyfans的drm解密啦!
因为没法贴图,所以这里贴个玩偶姐姐代替图吧
![图片.png](data/attachment/forum/202407/01/110945xhq5w27qdqlx3gfj.png)
完结撒花~

qwe1 发表于 2024-7-2 15:28:58

ggnbbbbbbbbbbbbbbbbbb

pein 发表于 5 天前

这个是注入浏览器的js代码来用的么
没接触过js看的一脸懵

李恒道 发表于 5 天前

pein 发表于 2025-3-28 16:32
这个是注入浏览器的js代码来用的么
没接触过js看的一脸懵

不是的,这个是drm视频下载的处理分析
方便爬虫用的

pein 发表于 前天 17:09

李恒道 发表于 2025-3-28 18:24
不是的,这个是drm视频下载的处理分析
方便爬虫用的

{:4_88:}最近在做下载器项目,遇到了这些drm视频加密,完全没头脑,这个帖子看完,发现基础差太多了...好多地方不太懂
我再多看几遍{:4_88:}

李恒道 发表于 前天 20:51

pein 发表于 2025-3-31 17:09
最近在做下载器项目,遇到了这些drm视频加密,完全没头脑,这个帖子看完,发现基础差太多了...好多地方不太懂 ...

慢慢来
我当时写这个陆陆续续其实折腾了快一个月QAQ

pein 发表于 昨天 16:46

李恒道 发表于 2025-3-31 20:51
慢慢来
我当时写这个陆陆续续其实折腾了快一个月QAQ
膜拜大佬~
我是搞了好三周了hhhhh
在做网飞和of还有一些音乐网站的下载器
一开始信心满满,以为就是个请求逆向,算法逆向,后来发现什么drm pssh license 乱七八糟一堆东西,网上资料又少之又少
好在有游猴看到大佬的帖子,学习了解了不少,照着三个月做去了{:4_88:}

李恒道 发表于 昨天 22:07

pein 发表于 2025-4-1 16:46
膜拜大佬~
我是搞了好三周了hhhhh
在做网飞和of还有一些音乐网站的下载器


国内资料是比较少
也可以去看看videohepler论坛
我很多资料都是根据那里大佬得来的
页: [1]
查看完整版本: 【结束大吉】onlyfans的OB解密及DRM过校验思路(八)