本文仅供学习交流使用,请勿用于商业用途或不正当行为
如果侵犯到贵公司的隐私或权益,请联系我立即删除
打开X瓜视频首页,F12,在XHR,我们根据通过分析响应能够找到对应的请求
定位到请求之后,我们去看一下请求需要的参数
很明显,头条系产品,加密参数都是_signature
全局搜索_signature
一下子就找到了
简单分析下代码:
_signature为a的值
而 a = (0,n(679).sign)(t);
可以理解为a = n(679).sign(t)
sign是n(679)这个对象下的方法
因此我们需要先摸清楚n是个啥,我们在这一行下断点,然后在前端页面向下滑动页面,就能暂停到断点处了
我们首先看下n(679).sign具体是啥
噢漏,跟进来了,又是一堆case
顺便解释下,这个vm我们可以理解为浏览器的虚拟机(引擎),chrome是基于v8引擎的,js代码都是在引擎里执行的。
现在这个VM里面呈现的是解密后的代码,这个解释可能不太准确,但可以暂时这么简单理解。
既然这里呈现的是解密后的代码,那解密前的代码在哪呢?我们待会儿分析。
接着我们看看n是什么?
能看到n其实是u函数,我们点击进入u函数看看
因为刚才的n(679)其实是u(679)
那u函数的参数r的值肯定就是679了
if (n[r]) 如果成立,就返回n[r].exports,那这里的n又是个啥?
我们在函数u上面能看到定义了n = {} 空对象,那这里应该是空的呀,而这里又判断了r是否是n里面的值,那n里面的值让我非常好奇
我们在这里打上断点,F8跳到这个断点
控制台输出一下,可以看到这个n是一个大数组
我们看看n数组里面的第679个元素是啥
里面有sign方法,所以我们只要能调用u函数,就能调用u函数下面的sign函数了。
那么问题又来了?u函数和n函数是怎么样的调用关系?为啥在外面调用的是n(679),而不是调用u(679)?
这怎么搞?好像没思路了
这样,我们看看u函数所在的文件其他的代码吧
由于js代码一般比较长,所以我习惯把代码复制到webstorm里面ctrl + shift + - 整体折叠一下看下代码的整体结构
这样是不是清晰多了!
这个文件整体是一个自执行函数!function(){}();
传入的参数是[]
函数体内先定义了几个函数r、t、u
接着就是这句
var c = window.webpackJsonp = window.webpackJsonp || []
判断window对象上是否有webpackJsonp,我们看看webpackJsonp的值
可以看到webpackJsonp里面有一个大数组,那它是哪里来的呢?
既然它是绑定在windows全局对象上的,那我们搜索一下,看看在别的地方是否能找到定义它的地方
我们看到index.xxxxx.chunk.js这个文件里第一行对webpackJsonp进行了push操作,代码太长,复制出来收缩一下看看整体结构
妈呀15W+行代码,电脑太垃圾卡得一逼...
第二个参数是个大数组,里面全部都是定义的函数
明白了吧,webpackJsonp的内容就是这里push进去的
那我们找到并进入第679个函数
嗯,这里就是vm解密前的代码了,刚才的疑问在这里也就摸清楚了。
接下来就是扣代码了,这里直接放我扣下来的代码,小伙伴们自行体会
执行后报错
那我们定义一下
再运行,没有报错了
测试下结果是否正确
“无效的referer”,那我们在headers里加上referer,再试
纳尼?为毛结果不正确?
还是直接说结论吧,这里其实有一个大坑,首页源码里面有个tac,和头条一样,需要加上它才能生成正确的加密值
我们加上tac,再运行
再测试一下,成功拿到数据了
ok,今天先到这里咯~
文章有错误或者有疑问可以随时联系我哦
公众号:一生向风