最近有个新上映的动漫很火,但是——国内没引进,B站外服和类似的网站还都是和谐版,只有jp本土才是完整版,很讨厌
于是我找到能看完整版的网站,而且不光要看,还要下载,好,目标已经明确了
二、侦察
刚打开网站就给我看这个?看来情况比想象的复杂
1.png (28.93 KB, 下载次数: 0)
下载附件
2023-1-9 19:18 上传
一开始以为是检测到使用代{过}{滤}理,后来发现是锁IP,一番折腾后总算进入了网站
F12抓包分析,不出所料是m3u8,aes-128加密
2.png (166.97 KB, 下载次数: 0)
下载附件
2023-1-9 19:19 上传
第一个m3u8里面是好几个不同清晰度的m3u8,区别只有一个参数
3.png (177.59 KB, 下载次数: 0)
下载附件
2023-1-9 19:19 上传
找到包含ts的m3u8,注意#EXT-X-KEY这一行,URI是自定义的格式,肯定要在某个地方处理,但先忽略这个过程,继续翻请求里和key有关的,很快就找到了
4.png (126.08 KB, 下载次数: 0)
下载附件
2023-1-9 19:19 上传
5.png (108.1 KB, 下载次数: 0)
下载附件
2023-1-9 19:19 上传
发现请求的参数lt就是刚才m3u8里的URI,返回的k显然不是真正的key,因为不是16位,但应该有关
这个k是不是固定值呢?经过重复尝试,发现它是个变量,那m3u8应该也不固定,但是。。。整个m3u8却一直不变,本来就不擅长算法,现在更迷惑了,看来逆向算法行不通
三、尝试
看了论坛的一些帖子,大部分思路都是从函数调用栈入手,下断点,分析js,我也先采取这种方法试一下
请求得到参数k之后在什么地方进行处理?看一下调用栈
6.png (164.27 KB, 下载次数: 0)
下载附件
2023-1-9 19:19 上传
7.png (130.22 KB, 下载次数: 0)
下载附件
2023-1-9 19:19 上传
比想象中复杂的多,这个特别大的js直接写在html里,看起来功能只是发送请求,关键代码应该在调用栈中间的部分,但是。。。
8.png (71.57 KB, 下载次数: 0)
下载附件
2023-1-9 19:20 上传
看到这里就知道还原代码几乎不可能了,只好换其他方法(当时没注意到调用栈频繁出现的VM149,其实它就是突破口,但下面是通过另一种思路找到相同的解决方法)
四、灵感
翻看请求的时候,发现了网站使用的播放器
9.png (164.82 KB, 下载次数: 0)
下载附件
2023-1-9 19:20 上传
代码只经过了压缩,没有混淆,解密ts应该也是它做的,如果能定位解密的代码,就离找到密钥不远了
既然是js,那就用Sources打开,结果。。。
10.png (147.9 KB, 下载次数: 1)
下载附件
2023-1-9 19:20 上传
居然是xhr!不是script!暂且不论是不是网站故意挖坑,调试一下子就变得麻烦了
js肯定是在某个VM里执行的,如何定位到这个VM?这时候我灵光一现——很多网站不是喜欢用debugger恶心人吗,我在这个js里加一个debugger,不就找到它在哪了吗?
这个方法真是巧妙,只要它被加载,马上就被断下来,然后在它解密部分的代码下断点,运行到那里,问题就解决了
至于怎么修改响应,方法很多,我用了最简单的Fiddler,先把这个js下载下来,在开头加了一行debugger;,然后打开Fiddler自动回复器,这样填写就可以了
11.png (26.58 KB, 下载次数: 0)
下载附件
2023-1-9 19:20 上传
现在刷新网页,等到这个js被加载,果然断下来了
12.png (135.14 KB, 下载次数: 0)
下载附件
2023-1-9 19:20 上传
然后应该在哪里下断点呢?参考了一些帖子,可以搜索字符串decrypt,发现这里最接近解密的代码
13.png (152.74 KB, 下载次数: 0)
下载附件
2023-1-9 19:21 上传
这段代码比较好理解,参数c非常关键,这里判断c的长度不等于16,就报错“AES-128密钥长度必须为16字节”,显然c就是存储密钥的数组
现在继续运行,等到触发断点,查看变量,果然,c的类型就是Uint8Array(16)
14.png (163.15 KB, 下载次数: 0)
下载附件
2023-1-9 19:21 上传
有了m3u8和key,终于能开始下载了
15.png (132.77 KB, 下载次数: 0)
下载附件
2023-1-9 19:21 上传
最终效果图
16.png (866.34 KB, 下载次数: 0)
下载附件
2023-1-9 19:21 上传
五、结语
本人只是一个前端小白,对于破解更谈不上熟悉,但破解的魅力就在于此——很多时候,你需要的并不是高超的技术,而是独特的思路,和思考中的灵光一现。正是充满了未知和出奇制胜,破解注定不同于循规蹈矩的工作。经过自己的思考最终实现目标,这种成就感也是难以比拟的。