最近在网校买课学习,提升自己,不过对方规则是你买的课程过期就不给你学习了。 技术非常好,有效期内可以下载可以看,过期了,对不起,下载的也不给看了。 基于这个来研究下视频加密技术。 首先非常感谢这篇文章 https://www.52pojie.cn/thread-1585958-1-1.html 这篇文章都是对的,但是逻辑上有些地方会让人误解,属于大神一看就懂,小白一看就懵懂。 最后这个小白很执着,提问,终于让人看懂了 https://www.52pojie.cn/thread-1616380-1-1.html 基于以上文章我来重新整理下。写本片文章的目的是为了让小白看懂并操作,特自花了半天时间整理,重新编辑发出。 文章还备份在 https://www.cfw.vip/233.html 1.打开学习教程视频,开发人员工具搜索m3u8,发现2个文件,第1个是清晰度,第二个是实际下载地址 2.该网校的网课有一部分是直接可以下载的,有一部分是加密的。 下载我们要使用一个工具,这里我推荐一格最好用的,https://github.com/HeiSir2014/M3U8-Downloader,是开放源码编译的,所以工具安全性是很可靠,不放心的自己编译,想省事的,直接下载,这款神器叫M3U8-Downloader 3.因为我要保存超清版的,所以把格式切换为超清模式 4.从课程导学开始,将第二个m3u8地址复制(如下图),打开M3U8-Downloader点击“新建下载”,将复制地址填入视频源,其它项为空,详见下图,下载自动完成,该校未加密地址一般可以下14个左右,详见下图。 5.如此重复下载大概第15个就无法下载了,会报错。报错信息详见下图。状态显示“初始化”,长时间等待会变成“多次尝试,下载片段失败”。为什么无法下载呢?m3u8提供有key了,我们需要进一步分析失败原因。 6.分析失败原因就需要下载key,查看这个key的返回值。如下图,我们发现key值像一个乱码数据,正常的key值是16位的16进制编码,比如这样“FF18DDC0BEB30F5C4BD9F3F1733DDE75”,这又这样的key,软件才能识别并计算,把文件下载下来。那么出现非正常的key,就可以断定是对key进行了加密,不许解密还原才可以下载。 7.因为本人也是小白,所以不介绍分析过程,只介绍如何去做,如何分析请看上文引用的大拿地址。 我们来找一个json文件,如下图所示,在响应里body内容是一串看不懂的字符串,还特别长,这个json里的字符串有非常有用的信息,我们下一步就是把这个字符串翻译过来,翻译成我们能够看懂的字符串。 8.算法大拿已经给我们了,遗憾的是他就点到为止,下面我来把他讲明白,这个json的文件名是“4adf37ccc0af24c6ab7f0ba0d3beadd1_4”,这个就是大拿说的vid,有些人取值“4adf37ccc0af24c6ab7f0ba0d3beadd1”是错误的,一定是“4adf37ccc0af24c6ab7f0ba0d3beadd1_4”。要完整的解密我们要用到密码工具箱了,工具叫“ToolsFx”,是“leon406”无偿开发的,在这里致敬下。为了少去东奔西跑,我把地址找出来了,发布的贴子是 https://www.52pojie.cn/thread-1501153-1-1.html ,源码的地址是: https://github.com/Leon406/ToolsFx,如果你有墙访问不了github,那就去论坛下载。为了防止工具丢失你可以github上fork一份或者下载下来存档。国外github太慢,作者也分享了其它下载地址, 下载加速 https://leon.lanzoui.com/b0d9av2kb 提取码:52pj 插件下载 https://leon.lanzoub.com/b0d9w4cof 提取码:ax63 截至今天是V1.13版本,如下图所示,不下载也没关系,百度在线工具也可以,建议下载,按照本文图片省事。 8.工具确定下载完成了,我们要把“4adf37ccc0af24c6ab7f0ba0d3beadd1_4”进行md5加密,注意是不含引号的啊。点击运行一下,得到“142572a1e3661b91ad17ae24ce47f959”,这是32位的取前16位“142572a1e3661b91”为对称加密的key和后16位“ad17ae24ce47f959”为对称加密的iv,注意和m3u8没有一点关系哈。 9.前16位“142572a1e3661b91”为对称加密的key和后16位“ad17ae24ce47f959”为对称加密的iv,复制如下图,选择对称加密“142572a1e3661b91”粘贴到key,把“ad17ae24ce47f959”粘贴到iv,注意不要有空白,把json里的返回值body内容,就是第7步里的看不懂字符串粘贴进工具箱,注意要删除掉前后的引号。待处理后面要选择下,默认raw改为hex 如果没有错误的话,默认为“加密”要选择“解密”,运行一下,输出内容一大推看不懂的字符串,如果没有输出内容,请检查,哪个地方肯定有错误。请看上面的图片选择。 10.把输出内容复制出来,这里要进入“编解码”,而不是“编码转换”,输出内容有网址了,这段内容保存下。 11.把刚才保存内容里搜索seed_const,得到数字24,下图所示我是用工具格式化代码,实际上把代码粘贴到记事本,搜索下也可以。 到此json解密完成,我们只为了取得一个数字,那就是24.卧槽,忙了半天就是要一个数字。感叹下继续。 12.下面解密key了,把seed_const的值24进行md5下得到“1ff1de774005f8da13f42943881c655f”,取前16位“1ff1de774005f8da”为key,“AQIDBQcLDRETFx0HBQMCAQ==”为IV,小白这个地方是比较模糊的,怎么得出的IV?我告诉你大拿给的,你拿着用就好了。 13.打开Pycharm,没有就去安装下,安装教程https://www.cfw.vip/pycharm.html 新建一个Pthon文件,把代码粘贴进去,代码如下: [color=var(—hcb-color—text,#1f1e1e)]import [color=var(—hcb-color—text,#1f1e1e)]osfrom Crypto.Cipher import AES import base64 filename = ‘1.key.txt’ # 把文件内容以byte字节形式读写到缓冲区中。 def read_into_buffer(filename): buf = bytearray(os.path.getsize(filename)) with open(filename, ‘rb’) as f: f.readinto(buf) f.close() return buf print(list(read_into_buffer(filename))) password = ‘1ff1de774005f8da’.encode()#秘钥,b就是表示为bytes类型,此处为必须修改项其它勿动 iv = base64.b64decode(‘AQIDBQcLDRETFx0HBQMCAQ==’) # iv偏移量,bytes类型 text = read_into_buffer(filename)#需要加密的内容,bytes类型 # AES.MODE_CBC 表示模式是CBC模式 aes = AES.new(password,AES.MODE_CBC,iv)#cbc模式下解密需要重新创建一个aes对象 den_text = aes.decrypt(text) print(“明文:“,list(den_text)) keys = list(den_text) hex16 = [] for i in keys[:16]: hex16.append(i) def print_bytes_hex(data): lin = [‘%02X’ % i for i in data] print(” “.join(lin)) print_bytes_hex(hex16) 你要修改代码中的password后面的密钥就是第11步的数字24md5加密的前16位。 14.把加密key下载下来4adf37ccc0af24c6ab7f0ba0d3beadd1_3.key,重命名位1.key.txt,复制到python文件同一个目录下,运行一下 复制最后1行,这个就是key,CF 77 67 B4 C3 59 68 7E F7 8B D7 82 41 47 E8 A4,去掉空格得到“CF7767B4C359687EF78BD7824147E8A4”,这个就是真key了 15.下载测试,打开第4步给大家分享的M3U8-Downloader,按顺序填入m3u8地址和key地址,不填IV,如下图: 16.开心的下载好了,本教程应该结束了。 17.其实还有问题,你发现下载全部完成了,在合并的时候出错了,这是怎么回事? 你的key解密密码不对。