今天很开心,讲一讲腾讯视频的js逆向过程,是过程,不是破解方法,也没有什么源代码,当然你可以看懂之后自己写出来。再顺便说下腾讯视频程序员的加密手段很狡猾。比爱奇艺不知道好多少。
打开控制台,看network,刷新几次也没有看到关于m3u8的请求,但是有切片ts。
所以只能从切片这里切入,打个断点刷新一下。
可以看到t是想要的数据,所以沿着栈慢慢找,一直找到最底部就能看到很有用的信息。
e看起来很像是m3u8里的内容。
在请求之前打个断点看看,刷新。
看到栈这里的函数名很有可疑。
点击跳转到e.load,上下查看代码可以看得出很接近了。有videoInfo这些字眼,还有一些log的输出,搜索一下没搜索到什么东西,就继续往栈走
这时候就跳到superplayer.js里,在loadInner里,看到一个很关键的:
this._videoInfos = [].concat(e).map((function(e) {
return new VideoInfo(e,o._config)
}
new了一个配置,在这里打个断点,刷新
可以看到这个e里面的url,是一个m3u8文件,所以只要找到这个从哪里来就知道了
e是函数的参数,所以找调用者,在start看到了getVideoRsp Rsp就是Response的缩写,响应数据的意思,打个断点,进去
眼前一亮!请求视频信息,进去
看到请求信息,然后下面是设置请求信息,进去看看
看了看,没看出有用的东西,但是后面又个call的调用,打个断点看看会进去嘛?因为前面有判定。
能进去,有个判断,打个断点过去,看看t的值是什么,t有值的,所以走parseExternalVideoInfo
parseExternalVideoInfo的函数调用正好在下面,看到了一个很关键的:sendRequestMiddleWare好像是向中间件发什么东西,但是它并没有调用,只是赋值到r上面,this._config.sendRequestMiddleWare没有定义,所以赋的是值sendRequestMiddleWare$2,点开看看函数
我们不知道它会不会执行,先打个断点,让程序执行,最后是能到的。一步一步单走。
达到e.reqPath,看到了getvinfo v是video,它缩写了,不想让人从整个代码中搜索到关键的字眼。
这看出是获取请求的网址,也就是准备开始请求了,代码(A = e.resData)的时候,匪夷所思的地方来了,还没有请求,才刚获取网址就已经有数据了??? 其实是缓存阻碍了我的分析
res也是response的缩写,也就是当一个有值赋值操作,它的boolean是true,也就是这程序会走[3,4] 不会走o.start。
看看o.start里面,query?还是一个什么netTool的东西,jsonp?难道?这里暂时放下,因为过去过不了,是true。所以就在Console里把e.resData赋一个null或者0都可以。
然后执行就能进去了
再进去就可以看懂了。好像是创建了什么,插入到了body里。
其实在这里已经有些人猜到了,就是jsonp而已,但是很奇怪为什么没有网络请求,jsonp也是会有网络请求的。把C的值用浏览器打开,发现不知道报了什么错误,但是至少来说已经知道了怎样请求了。发生错误的原因是我们把e.resData的数据改没了,本来它是不走这里的。
其实后来弄懂了,我想到了一个其他更简单的方法,就是切换一下画质,就立马有网络请求了
用浏览器打开就能看到里面的数据了,这不得不说腾讯做的很好,我当时觉得很神奇,为什么没有任何网络请求却能够获取到数据。
这些请求参数,我就长话短说了,这个cKey是最关键的。找到怎么生成就可以了。
返回代码,搜索一下cKey看看有没有信息,找到了
在更新key的时候,这个getckey非常的显眼,打个断点,有两个getckey,你可以都打,刷新一下,就到断点处了
通过对比可以看出:n是网址最后那部分,也叫vid,视频id。u是一个时间戳,a是开发的版本号,l其实是一个随机生成的值,但是这个值第一次生产之后会永远保留到腾讯服务器里,相当于唯一标志了。p是平台代码。这些不难找,我就直接说了出来。
进去看看怎么加密的,然后再进去,往上翻,看到getckey = function就可以从这里开始抽离函数了。
但是但是,程序员这有个比较用心的地方,看图,case 0:的时候会调用window。都知道的,脱离了浏览器,根本没什么window。所以要关注一下这里代码,看了一下这里的代码,明显是人写的,不会是那种复杂算法。还有还有,case 3:那里(没截取到),调用了window的URL,useAgent什么的,这明显,程序员太狡猾了,我没有见过加密放这些进去的。不得不说很聪明。
有趣的是,有很多乱七八糟的字符串,我想程序员的用意是在你复制的时候,可能会导致一些编码转换错误,倒是识别成其他字符串,但是我并没有遇到
最后这个cKey生成参数也很有讲究,首先是vid,每个视频都不一样。然后是时间戳,每次都不一样。然后到开发版本,每次大更新都可能变化。然后是全局唯一标志,根据用户不同而不同。最后是平台代码,每个平台生成的都不一样,这么多不一样生成一个cKey,可以说动一发牵全身
爱奇艺的呢?太搞笑了,不用vip也能看会员视频,它不绑定登录信息,我觉得很不可思议。还有控制台的信息,输出的调试信息,看着像个女生写的。。。