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