m3u8加密文件原理及下载脚本

2023-11-02

一、加密ts文件解密

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:13
#EXT-X-KEY:METHOD=AES-128,URI="https://j-island.net/movie/hls_key/s/857401e309d8a032c3bb18f4b09b8db2/?f=jj_20190401_hihijets_004",IV=0xaa3dcf6a7acb92ff4fb08d9b3b3d6f51
#EXTINF:12.078733,
https://j-island.stream2.johnnys-net.jp/j-island/jj_20190401_hihijets_004/jj_20190401_hihijets_00400000.ts
#EXTINF:9.009000,
https://j-island.stream2.johnnys-net.jp/j-island/jj_20190401_hihijets_004/jj_20190401_hihijets_00400001.ts
#EXTINF:9.009000,
https://j-island.stream2.johnnys-net.jp/j-island/jj_20190401_hihijets_004/jj_20190401_hihijets_00400002.ts
#EXTINF:12.012000,
https://j-island.stream2.johnnys-net.jp/j-island/jj_20190401_hihijets_004/jj_20190401_hihijets_00400003.ts
#EXTINF:9.009000,
https://j-island.stream2.johnnys-net.jp/j-island/jj_20190401_hihijets_004/jj_20190401_hihijets_00400004.ts
#EXTINF:2.002000,
https://j-island.stream2.johnnys-net.jp/j-island/jj_20190401_hihijets_004/jj_20190401_hihijets_00400005.ts
#EXT-X-ENDLIST

m3u8视频另一种下载方式 如上图中用ts链接直接下载下来的ts视频文件是加密的(为什么要下加密的?虽然加密但是下载速度快啊)。

#EXT-X-KEY 字段已经写明了加密方式是AES-128,key通过URI获取,IV也有。

#EXT-X-KEY:
METHOD=AES-128,
URI="https://j-island.net/movie/hls_key/s/857401e309d8a032c3bb18f4b09b8db2/?f=jj_20190401_hihijets_004",
IV=0xaa3dcf6a7acb92ff4fb08d9b3b3d6f51
 

那怎么解密呢?

1.复制URI地址到网页,你将秒速自动下载得到一个16字节文件 2.打开终端,打开该文件查看16进制:

  • 打开二进制key

vi -b /路径/key文件
  • 输入“ :%!xxd”再把二进制文件切换到16进制

00000000: 283d cc2d 3747 e965 0a81 ead3 1e04 fa8a  (=.-7G.e........

获取到key就是 283dcc2d3747e9650a81ead31e04fa8a 3.打开终端,转化

openssl aes-128-cbc -d -in /路径/media_0.ts -out /路径/media_decryptd_0.ts -nosalt -iv $iv -K $strkey

*media_0.ts* : 加密ts文件(无法播放) *media_decryptd_0.ts* : 解密后ts文件(可以直接播放) *$iv* : aa3dcf6a7acb92ff4fb08d9b3b3d6f51(#EXT-X-KEY字段中获取,注意去掉0x) *$strkey* : 283dcc2d3747e9650a81ead31e04fa8a(上一步获得)

例子:

openssl aes-128-cbc -d -in /Users/用户名/Downloads/001.ts -out /Users/用户名/Downloads/001_dec.ts -nosalt -iv aa3dcf6a7acb92ff4fb08d9b3b3d6f51 -K 283dcc2d3747e9650a81ead31e04fa8a

命令执行完秒速转化(也可能我文件特别短,都切成ts了,一般都不长吧…… 4.到对应路径下去,就能看到转化成功到ts视频了

二、案例

1、m3u8文件

通过连接:

https://XXXXXXX/video/20210713/48466f15b9094154a3dc405efd5b54fd/cloudv-transfer/555555552773r8qq5556n265646r92r4_e8f05058b8c14e679738b91d96fa6d60_0_3.m3u8?t=1652097774&k=a062691ead867c707b07b5c6caf87385&vid=9e74e191017a1000dd3e822700000000&r=a8aede38018010004b91ff8f00000000
下载文件内容如下
​
​

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:11
#EXT-X-KEY:METHOD=AES-128,URI="https://api.cloudv.haplat.net/vod/videoManage/getHlsKeyByVideoId?cid=882006&t=1652097774&k=a062691ead867c707b07b5c6caf87385&vid=9e74e191017a1000dd3e822700000000&r=a8aede38018010004b91ff8f00000000",IV=0x993181d25c49657b7b6bfeff30f13d8c
#EXTINF:1.200000,
a08a0c0364dc4000b46560e905564520_0000000.ts
#EXTINF:1.000000,
a08a0c0364dc4000b46560e905564520_0000001.ts

2、key值

https://api.cloudv.haplat.net/vod/videoManage/getHlsKeyByVideoId?cid=882006&t=1652097774&k=a062691ead867c707b07b5c6caf87385&vid=9e74e191017a1000dd3e822700000000&r=a8aede38018010004b91ff8f00000000
找到请求的返回值


​将字符串进行16进制编码

 

3 、下载ts文件

通过分析,ts下载网址为

https://xxxxxxx/video/20210713/48466f15b9094154a3dc405efd5b54fd/cloudv-transfer/a08a0c0364dc4000b46560e905564520_0000000.ts
​
构造ts的下载网址为https://xxxxxxx/video/20210713/48466f15b9094154a3dc405efd5b54fd/cloudv-transfer/ + m3u8文件中的数据

4、解码

下载的ts为加密后的,需要进行解码,采用openssl解码

openssl aes-128-cbc -d -in 0.ts -out 0_1.ts -nosalt -iv 993181d25c49657b7b6bfeff30f13d8c -K f370739f5a517a4724c677a73e156126
​5脚本:
#!C:\Python3.7
# -*- coding:utf-8 -*-
# coding=utf-8
import requests
import os
headers = {
    "User - Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 84.0.4147.105 Safari / 537.36"
    }


def download(baseurl,file_m3u8,path_in):
    url_list=[]
    with open(file_m3u8,"r") as f:
        for r in f.readlines():
            if ".ts" in r :
                url_list.append(r.replace("\n","").strip())
    # print(url_list)

    for r in url_list:
        url = baseurl+r
        filename=os.path.join(path_in,r.split("_")[1])
        # print(url,filename)
        try:
            re = requests.get(url=url,headers=headers)
        except Exception as e:
            print(e)
            pass
        with open(filename,"ab") as f:
            f.write(re.content)
            print("[*]download:"+filename)


def mergeFileToMP4(pathname):
    os.chdir(pathname)
    cmd = "copy /b *.ts new.tmp"
    os.system(cmd)
    os.system('del /Q *.ts')
    os.system('del /Q *.mp4')
    os.rename("new.tmp", "new.mp4")
    os.chdir('..')
    print("merge file is :",str(os.path.join(pathname,"new.mp4")))

def key_test(key):
    print(len(key))
    key_hex=""
    for c in key:
        tem=hex(ord(c))[2:]
        key_hex=key_hex+tem
    print(key_hex)
    return  key_hex

def decode_openssl(key,iv,path_in,path_out):
    for file in os.listdir(path_in):
        file_in=os.path.join(path_in,file)
        file_out = os.path.join(path_out,file)
        # print(file_in,file_out)
        cmd=f"openssl aes-128-cbc -d -in {file_in} -out {file_out} -nosalt -iv {iv} -K {key}"
        print(cmd)
        os.system(cmd)

def clear_ts(path):
    os.chdir(path)
    os.system("del /Q *.ts")

def main(baseurl,key,iv,file_m3u8):
    # print("main")
    basepath = os.path.split(file_m3u8)[0]
    basepath_in = os.path.join(basepath, "in")
    basepath_out = os.path.join(basepath, "out")
    if not os.path.exists(basepath_in):
        os.mkdir(basepath_in)
    if not os.path.exists(basepath_out):
        os.mkdir(basepath_out)

    download(baseurl=baseurl, file_m3u8=file_m3u8,path_in=basepath_in)
    key = key_test(key)
    decode_openssl(key,iv,basepath_in,basepath_out)
    mergeFileToMP4(basepath_out)
    clear_ts(basepath_in)



if __name__ == '__main__':
    # https://xxxxxxx/video/20210713/ea044c31965940559162b816ec8e152a/cloudv-transfer/a08a0bff11c84000b465638605564520_0000001.ts
    baseurl="https://xxxxxxxxx/video/20210713/ea044c31965940559162b816ec8e152a/cloudv-transfer/"
    key="±úx£Ú:êh'ÿs{câ"
    iv="131f71ed838a8019b731be5b7f2a1703"
    file_m3u8="./jixian/3.m3u8"
    file_m3u8 = os.path.join(os.getcwd(),file_m3u8)
    if(os.path.exists(file_m3u8)):
        main(baseurl,key,iv,file_m3u8)
    else:
        print("[-]"+file_m3u8+" not found:\n")
    # download(baseurl)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

m3u8加密文件原理及下载脚本 的相关文章

  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 在本地网络上运行 Bokeh 服务器

    我有一个简单的 Bokeh 应用程序 名为app py如下 contents of app py from bokeh client import push session from bokeh embed import server do
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解

随机推荐

  • 如何对已经打包好的ipa包进行签名

    iOS证书学习推荐博客代码签名探析 本文重点在于介绍ios8 1 3系统ipa包重签名 如企业证书 无法安装的问题 苹果在iOS8 1 3系统以后加强了对ipa安装包签名的验证 主要区别在于ipa唯一标识在原有Bundle Identifi
  • react中的状态机_使用状态机增强您的React

    react中的状态机 Mixing React and state machines is a great productivity boost for you as a developer It also improves the usu
  • C#WinForm界面: 使用IrisSkin4实现软件界面美化换肤

    前言 本篇文章主要用于记录IrisSkin4应用过程 方便以后参考 功能实现 步骤1 在网上下载IrisSkin4 dll和它的对应的皮肤文件 下载地址 步骤2 复制以下两个文件到winfrom项目的Debug文件夹下 步骤3 在项目解决方
  • RabbitMq queue异常导致consumer停止

    偶发性rabbitmq出问题或者认为操作错误 访问不了queue 导致消费端停止消费 org springframework amqp rabbit listener QueuesNotAvailableException Cannot p
  • C++中的模板及其使用

    一 什么是模板 模板是C 中自动生成代码的技术 例如我们在C 若想实现一个函数的形参可以是多种数据类型就必须使用重载 模板则可以更加简单方便地实现这一点 二 为什么使用模板 假1如我们想实现一个通用的排序算法 C语言 通过回调函数实现 使用
  • centos docker容器化部署nginx php项目(详细版)

    一 nginx和php的一些原理 1 nginx 是一个 web 服务器 它只能处理静态文件 无法处理 PHP Python 等具体程序语言的请求 所以 原理是这样 用户统一先请求到 nginx nginx 会再把请求转发给 php fpm
  • 城市联动功能

    掌握 本题需要熟练掌握表单事件的运用 select 以及 option 的知识内容 以下为知识点详解及代码 表单字段不包label 因为它只是增强交互的标签 通常来说我们把表单字段分为 input select button textare
  • gcc编译器、Makefile

    一 编译程序的基础知识 1 gcc对程序的编译过程 预编译 编译和优化 汇编 链接 预编译 将程序中引用的头文件包含进源代码中 并对宏进行替换 gcc E hello c o hello i 编译 将用户可识别的语言翻译成处理器可识别的汇编
  • macOS 中 聚焦搜索 的使用教程

    macOS中的聚焦搜索是一个强大的工具 它可以帮助你快速找到文件 应用程序 联系人 电子邮件 互联网搜索结果等 下面是macOS中聚焦搜索的使用教程 1 打开聚焦搜索 使用键盘快捷键 按下键盘上的Command键和空格键 空格 即可打开聚焦
  • 密码方向国家相关政策(含等保2.0)

    听说目前业内都有这样一个基本共识 不做等保 违法 不做密码测评 违法 2018年2月国家密码管理局发布 GM0054 2018 信息系统密码应用基本要求 从信息系统的物理和环境安全 网络和通信安全 设备和计算安全 应用和数据安全四个层面提出
  • 苹果笔记本怎么查看计算机基本信息,怎么区分查找苹果电脑笔记本macBook pro的年份、型号及序列号...

    苹果笔记本每年都更新 新的产品在配置和大小等都有所不同 然而 每年都叫MacBook 那么 如何区别自己的MacBook是哪一年生产的 怎么查看具体型号以及序列号呢 识别自己的苹果笔记本的Mac 机型也很重要 因为查看保修保障范围 创建个人
  • 解决双系统出现的windows时间错误

    首先确定Ubuntu系统的时间正确 查看系统时间 date R 我需要的是东八区 而这里显示的是 0500 很明显不对 因此 1 运行tzselect tzselect 在这里我们选择亚洲 Asia 确认之后选择中国 China 最后选择北
  • 定时每天凌晨一点在linux系统上执行一个autobuild.sh脚本如何实现?

    定时每天凌晨一点在linux系统上执行一个autobuild sh脚本如何实现 可以使用linux的计划任务功能crontab来实现定时执行脚本 具体步骤如下 编辑crontab计划任务列表 bash crontab e 这会打开一个文本编
  • Android实现Activity的跳转(Android学习笔记2)

    Android实现Activity的跳转 一 创建新的Activity 二 设计主界面和菜单界面 三 实现Activity的跳转 1 显示意图跳转Activity的三种方式 1 1 方式一 1 2 方式二 1 3 方式三 2 隐式意图跳转A
  • 【安全研究】从mimikatz学习Windows安全之访问控制模型(三)

    作者 Loong716 Amulab 0x00 前言 在之前的文章中 分别向大家介绍了Windows访问控制模型中的SID和Access Token 本篇文章中将为大家介绍最后一个概念 特权 Windows操作系统中许多操作都需要有对应的特
  • Antv G2plot学习笔记(一)

    Antv G2plot学习笔记 一 官方网址 https g2plot antv vision zh 在执行官方的实例中 发现无法将数据进行图表展示 经过好友的分享和实践发现是出在变量引用不到的问题 之前的const linePlot ne
  • opencv2与opencv的不同

    一 Opencv2与opencv1的区别 Opencv1 0版本于2006年面世 主要基于C语言 2009年发布opencv2 主要基于C 此时OpenCV库被划分成多个模块 这些模块被编译成库文件后 位于lib文件夹中 主要有以下模块 版
  • AIX 文件 打包 与 压缩 tar gzip compress 的使用

    今天在Aix用tar cvf 备份 打成tar包 占有硬盘空间过大 没有压缩比 尝试使用tar zcvf linux系统下可以用 z 命令 z 用gzip来压缩 解压缩文件 加上该选项后可以将档案文件进行压缩 但还原时也一定要使用该选项进行
  • (Visual Grounding 论文研读) Pseudo-Q: Generating Pseudo Language Queries for Visual Grounding, 2022 CVPR

    最近在看关于visual grounding的文章 对于文章中理解不恰当的内容欢迎批评指正 本文将根据论文的结构来组织结构并且展开一定的拓展 Abstract visual grounding VG 即根据自然语言查询在图像中定位对象 是视
  • m3u8加密文件原理及下载脚本

    一 加密ts文件解密 EXTM3U EXT X VERSION 3 EXT X MEDIA SEQUENCE 0 EXT X ALLOW CACHE YES EXT X TARGETDURATION 13 EXT X KEY METHOD