全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 4618|回复: 44

腾讯视频js逆向过程

  [复制链接]
发表于 2023-3-1 19:00:16 | 显示全部楼层 |阅读模式
今天很开心,讲一讲腾讯视频的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也能看会员视频,它不绑定登录信息,我觉得很不可思议。还有控制台的信息,输出的调试信息,看着像个女生写的。。。
发表于 2023-3-1 19:09:43 | 显示全部楼层
看着像个女生写的

拳头嚯嚯向楼主
发表于 2023-3-1 19:31:10 | 显示全部楼层
水平一般,那个变量名v不是指的video而是压缩时自动混淆替换掉的仅此而已
发表于 2023-3-2 13:51:37 | 显示全部楼层
Faxlok 发表于 2023-3-1 19:53
是吗?我见的比较少,按这样来说的话,应该也把requestVIdeoInfo也给替换了

理论上都应该替换掉,但实际上有些调用在打包时会出现打包器很难确定是否可以优化所以跳过的情况,导致原始的函数名被保留下来。

通过混淆器的话,一般很少能保留下来,就算留下来也会改成a["requestVideoInfo"]方式调用,然后把其中的字符串再次提取出来做混淆,最终变成a[_O00OoOO00]这种样子
发表于 2023-3-1 19:03:15 | 显示全部楼层
本帖最后由 noamwtcv 于 2023-3-2 14:22 编辑

好!!! 鼓掌 难道的技术贴
发表于 2023-3-1 19:10:46 | 显示全部楼层
打个记号,认准大佬。
发表于 2023-3-1 19:19:06 | 显示全部楼层
我居然看完了
发表于 2023-3-1 19:24:32 | 显示全部楼层
逆向大佬牛B,正缺乏这方面的知识,学习一下
发表于 2023-3-1 19:28:56 来自手机 | 显示全部楼层
标记一下  向大佬鼓掌
发表于 2023-3-1 19:34:39 | 显示全部楼层
大佬牛皮,顺便问问 JS 逆向该如何入门
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-21 15:29 , Processed in 0.067939 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表