JS逆向:实战X瓜视频_signature参数分析

1,802 阅读4分钟

本文仅供学习交流使用,请勿用于商业用途或不正当行为

如果侵犯到贵公司的隐私或权益,请联系我立即删除

打开X瓜视频首页,F12,在XHR,我们根据通过分析响应能够找到对应的请求

img

定位到请求之后,我们去看一下请求需要的参数

img

很明显,头条系产品,加密参数都是_signature

全局搜索_signature

img

一下子就找到了

img

简单分析下代码:

_signature为a的值

而 a = (0,n(679).sign)(t);

可以理解为a = n(679).sign(t)

sign是n(679)这个对象下的方法

因此我们需要先摸清楚n是个啥,我们在这一行下断点,然后在前端页面向下滑动页面,就能暂停到断点处了

我们首先看下n(679).sign具体是啥

img

噢漏,跟进来了,又是一堆case

img

顺便解释下,这个vm我们可以理解为浏览器的虚拟机(引擎),chrome是基于v8引擎的,js代码都是在引擎里执行的。

现在这个VM里面呈现的是解密后的代码,这个解释可能不太准确,但可以暂时这么简单理解。

既然这里呈现的是解密后的代码,那解密前的代码在哪呢?我们待会儿分析。

接着我们看看n是什么?

img

能看到n其实是u函数,我们点击进入u函数看看

img

因为刚才的n(679)其实是u(679)

那u函数的参数r的值肯定就是679了

if (n[r]) 如果成立,就返回n[r].exports,那这里的n又是个啥?

我们在函数u上面能看到定义了n = {} 空对象,那这里应该是空的呀,而这里又判断了r是否是n里面的值,那n里面的值让我非常好奇

我们在这里打上断点,F8跳到这个断点

img

控制台输出一下,可以看到这个n是一个大数组

我们看看n数组里面的第679个元素是啥

img

里面有sign方法,所以我们只要能调用u函数,就能调用u函数下面的sign函数了。

那么问题又来了?u函数和n函数是怎么样的调用关系?为啥在外面调用的是n(679),而不是调用u(679)?

这怎么搞?好像没思路了

这样,我们看看u函数所在的文件其他的代码吧

由于js代码一般比较长,所以我习惯把代码复制到webstorm里面ctrl + shift + - 整体折叠一下看下代码的整体结构

img

这样是不是清晰多了!

这个文件整体是一个自执行函数!function(){}();

传入的参数是[]

函数体内先定义了几个函数r、t、u

接着就是这句

var c = window.webpackJsonp = window.webpackJsonp || []

判断window对象上是否有webpackJsonp,我们看看webpackJsonp的值

img

img

可以看到webpackJsonp里面有一个大数组,那它是哪里来的呢?

既然它是绑定在windows全局对象上的,那我们搜索一下,看看在别的地方是否能找到定义它的地方

img

我们看到index.xxxxx.chunk.js这个文件里第一行对webpackJsonp进行了push操作,代码太长,复制出来收缩一下看看整体结构

妈呀15W+行代码,电脑太垃圾卡得一逼...

第二个参数是个大数组,里面全部都是定义的函数

img

明白了吧,webpackJsonp的内容就是这里push进去的

那我们找到并进入第679个函数

img

嗯,这里就是vm解密前的代码了,刚才的疑问在这里也就摸清楚了。

接下来就是扣代码了,这里直接放我扣下来的代码,小伙伴们自行体会

img

执行后报错

img

那我们定义一下

img

再运行,没有报错了

img

测试下结果是否正确

img

“无效的referer”,那我们在headers里加上referer,再试

img

纳尼?为毛结果不正确?

还是直接说结论吧,这里其实有一个大坑,首页源码里面有个tac,和头条一样,需要加上它才能生成正确的加密值

img

我们加上tac,再运行

img

再测试一下,成功拿到数据了

img

ok,今天先到这里咯~

文章有错误或者有疑问可以随时联系我哦

公众号:一生向风