声明
本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!
请求分析
验证码:aHR0cHM6Ly9kdW4uMTYzLmNvbS90cmlhbC9qaWdzYXc=
我们可以看到这里已经改版了,前面版本不一样,这里删除了bd接口链接,也扫了一些加密参数
第一个 getconf 请求
就需要一个id就行了,其他固定值,下面是获取到的数据
接着就是获取背景图片链接这里需要解决fp以及cb两个参数
背景图片这里需要获取到token 后续加密data中参数需要用到,这里token并不是上面getconf请求得到的
参数分析
pf参数
这个就直接来到pf参数
首先我们先找到栈
点击之后就跳转到这个js文件里面,2.22.0xxx.js文件
更进来之后我们发现他是一个ob混淆代码,这个通过AST解密或者v_jstools解密都可以
AST解密太麻烦了我就直接用v_jstools解密
接着就是替换本地js文件,这里看我的这篇文章:fiddler替换本地文件_fiddler 修改html_qq_2081540885的博客-CSDN博客
全局搜索http
这里就可以看到这个fp参数已经生成,是l,接着网上就可以看到l =s[n(3018)]
接着就是向上跟栈
来到这个地方,此时我们可以看到这个this[t(3220)]中fingerprint已经生成,这里就网上看,t(3220) = state,
接着就是网上看可以找到,this[t(3220)]赋值的地方,这里由于我刷新之后,代码替换格式化之后,这里行数就变了不过也就是网上十几二十行位置
this.state 定义在第 5186 行,打断点后换个模式的滑块即会断住,因为 fp 参数在滑块图片生成之前生成所以这里我们就得重新搜索:
接着向上跟栈到 a 中,此时的 fingerprint 已经生成值,参数 r 定义在第 4006行,为 window["gdxidpyhxde"],可以通过 hook 的方式定位:
(function() {
'use strict';
var fp_hook = "";
Object.defineProperty(window,'gdxidpyhxde',{
set:function(val){
console.log("fp参数的值为: ", val);
debugger;
this._value = val;
return val;
},
get:function(){
return fp_hook;
}
});
})();
清除浏览器缓存后刷新网页即会断住:
此时 fp 参数的值已经生成,向上跟栈到 N 中,由下图可知,fp 参数的值为 Ri + : + 时间戳得到的断住之后往上跟一个栈,就可以看到B()更进去就行了:
这里看着扣就行了,需要注意的是 R 参数,扣完如果缺少环境会导致生成数字不全,校验了 canvas、languages、User-Agent、localStorage,toDataURL 等等,需要注意的是官网请求头中同样校验了 languages,其他的例如知乎登录、某税务局并没发现存在这个问题:
fp参数补的时候需要特别细心,这里面有try语句所以就是需要慢慢看
cb参数
fp参数解决之后这里来到了cb 参数
全局搜索cb,就可以直接找到了生成位置:
接着就是更进去看看,发现这个uuid 就是cb参数,接着就是扣下来即可
扣下来之后我们发现还有一个函数需要扣:P(e)
这里和上面的一样,细心再细心,其中包括了一个try语句。
data参数
接着就是data参数
data 由:d ,m ,p ,ext四个参数组成,这里一个一个看,首先是d
data中d参数
其中包括了轨迹加密,全局搜索 onMouseMove 之后打上日志断点。
可以看到这里 f 就是轨迹位置,这个u 网上上看就可以看到u = this[e(886)].state[e(1050)],
u = this[e(886)].state[e(1050)]
u = this['$store'].state['token']
u就是图片链接返回的token, 接着就是轨迹加密。将h函数扣下来即可
data中o参数
接着就是o
o = p(h(a, parseInt(this.$jigsaw[e(1487)][e(2436)], 10) / this[e(3360)] * 100 + ""));
o = p(h(a, parseInt(this.$jigsaw['style']['left'], 10) / this['width'] * 100 + ""));
其中 a 是图片链接中token,其中width 图片宽度固定值 320, parseInt(this.$jigsaw['style']['left'], 10) 为滑动距离
这个h函数跟进去发现就是轨迹加密时候我们扣的函数,这就直接调用就行了
这里扣下来就行了,cb参数哪里扣下来的函数,让我们少扣了不少。
data中ext参数
ext = p(h(a, this[e(2755)] + "," + this.traceData.length))
ext = p(h(a, this['mouseDownCounts'] + "," + this.traceData.length))
其中 this.traceData.length 是轨迹加密的全部长度,之前我们说过加密只是传入了50个,这里是全部长度并不只是50个,mouseDownCounts 是鼠标按下的次数
最后结果展示
至此复现完毕,有什么问题可以联系博主
结言
如果失败大概率是 data的问题,注意环境问题,校验轨迹严格,无感几乎不校验轨迹,根据观察,最近可能是要更新一些逻辑,官网存在阉割情况,建议去实测,网易严选(js未混淆)、知乎(校验参数acToken)、某苏税务局等。
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,联系作者立即删除!