首页 > 其他分享 >腾讯视频js逆向过程

腾讯视频js逆向过程

时间:2023-03-02 11:39:18浏览次数:43  
标签:逆向 程序员 加密

今天很开心,讲一讲腾讯视频的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也能看会员视频,它不绑定登录信息,我觉得很不可思议。还有控制台的信息,输出的调试信息,看着像个女生写的。。。

标签:逆向,程序员,加密
From:

相关文章

  • 从菜鸟程序员到高级架构师,竟然是因为这个字final
    final实现原理简介final关键字,实际的含义就一句话,不可改变。什么是不可改变?就是初始化完成之后就不能再做任何的修改,修饰成员变量的时候,成员变量变成一个常数;修饰方法的......
  • 从菜鸟程序员到高级架构师,竟然是因为这个字final
    final实现原理简介final关键字,实际的含义就一句话,不可改变。什么是不可改变?就是初始化完成之后就不能再做任何的修改,修饰成员变量的时候,成员变量变成一个常数;修饰方法的时......
  • 接口测试必备技能 - 加密和签名
    每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:magetest码同学抖音号:小码哥聊软件测试1、什么是......
  • c#MD5加密
    usingSystem.TextusingSystem.Security.Cryptography; stringmd5string=“123456”;MD5md5=newMD5CryptoServiceProvider();byte[]bytes1=......
  • 考研失败,加入国企当程序员,真香!
    大家好,这里是程序员晚枫,今天分享一位读者的投稿~有想投稿的朋友,可以后台联系我。下面是正文。最近考研出成绩了,大家考得怎么样?分享一个自己考研失败后,入职国企的故事。1......
  • 4 - 高级加密标准 (AES)
    高级加密标准(AES)我的博客原书:《UnderstandingCryptography:ATextbookforStudentsandPractitioners》AES:AdvancedEncryptionStandard是今天使用最广的对......
  • 【UNCTF逆向】Rejunk详解
    进行了一学期的纯理论学习,深感实战的重要性,而在现阶段没有什么项目可以实操,故先从CTF题目开始做起,首先先熟悉熟悉各个工具的使用和逆向思路。题目Rejunk是一道从垃圾代......
  • java AES加密、解密(兼容windows和linux)
     1.准备工作2018年10月24日10点46分importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKe......
  • 加密锁远程升级功能
    加密锁远程升级功能是指通过网络远程更新加密锁设备的固件和授权信息,以保持加密锁的安全性和可用性。这种功能通常是由加密锁厂商提供的服务,通过远程升级,可以及时修复加密......
  • 软件开发商共享加密锁方案
    多个软件开发商共享加密锁方案通常是指采用一种名为“加密锁共享方案”的技术。这种技术是指多个软件开发商使用同一款加密锁设备,将各自的软件产品与该加密锁设备绑定,从而......