关于某乎的请求头参数详解
有个x96 和x81
x-96: 2.0_G9RD9Sl3aKjZh3Wjb5HqU6JQ85t=NV9=Hy0o928Graxo3y7ihdl2G4oYfD3QNaz5
x-96: 2.0_+2NHgL5Cy6DaswnHTlUbkzfQSO2sSGZD3HZSKhPfU=4DSL8lZMix7j3Js09wQGub
可以看出x96是变化的,x81在一段时间内多次请求是固定的
就分析下x96的生成
在代码中可以发现 x96是通过 “2.0_” + 一个加密字符串生成的
看看这个_是怎么来的
_ = T.signature;
, T = function(e, t, n, r) {
var i = n.zse93
, o = n.dc0
, a = n.xZst81
, c = H(e)
, u = q(t)
, s = [i, c, o, W(u) && u, a].filter(Boolean).join("+");
return {
source: s,
signature: (0,
F(r).encrypt)(f()(s))
}
}(t, c.body, {
zse93: g,
dc0: E,
xZst81: m
}, l)
, _ = T.signature;
从以上可以分析出 就是这个T.signature
然后signature又是通过(0, F(r).encrypt)(f()(s))
这里来的
就是这个F(r).encrypt
函数生成
先看看这个参数s
s像是一个url拼接上x81而来
再看看
这有点像md5 去试试
可以看出 是把这个参数md5了一下
最后看看这个encrypt函数
点进去这个encrypt函数之后 跳到了这里 这就像是jsvmp加密了
然后我们再到js文件头部看看
这里可以看到有一个标准化的webpack的加载器代码
搜索一下也能发现webpack的关键字
遇到这种 就直接先copy js代码到本地吧
复制代码到本地的时候 把这个函数列表直接删掉 到时候用到哪些函数再补就行了 不然代码太多了。。
再回过来看看F(r).encrypt(f()(s))
这里面的r是undefined,再看看这个F是什么
可以发现 F是一个对象 里面包含了一个encrypt函数和一个version
这个version是3.0 应该是加密的版本吧
这里关键的是这个encrypt函数
encrypt: u.a,
这里可以发现encrypt是等于u.a 再往上面找找u
这里发现 , c = n(424) , u = n.n(c)
那么再看看这个n是什么
点进n看看
可以发现 n是加载器的代码
那么c=n(424)就代表执行的函数列表里面的第424个函数
接着就去找找这个函数
在代码的开头部分 发现了c.m=e,
这里把webpack的函数列表赋值给了c.m
我们就可以直接通过c.m[424]找到这个函数
这里果然就找到这个函数了 进去看看
从这里开始
到这里结束
可以发现 也就是那段jsvmp的部分的代码
好了 直接把这段代码扣到本地
然后把加载器函数在本地挂载到变量上
然后运行下试试
可能需要补下环境 window document location navigator什么的都补下
缺啥补啥
发现是没有问题的 (如果424函数代码里面遇到n(数字)的情况就需要去找对
应的函数扣下来,这里是没有用到其他函数的,较简单)
这里这个default就是encrypt加密函数
然后再试试调用
就是这个了
需要用到webpack相关知识。不熟悉的可以百度下
ok!