电话咨询
19922193247
注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除
注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除
注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除
写在前面:本菜鸟刚开始学习js逆向的时候有弄过某度的旋转验证码v1版本,那个时候觉得这种旋转验证码很新颖,现在不知不觉已经在这条道路上走了两三年了,再次回首,发现现在已经更新到v2版本了,好了,废话有点多,今天给大家带来最新版本的某度旋转js逆向分析
请求参数:ak ----> 类似于网站特有的id
返回参数:as、ds、tk 这三个参数后面有用到

请求参数:tk ---> 前面init接口返回的
返回参数:backstr(后面fs加密有用到),path(图片url),spin-0(后面this_rzData加密有用到)

请求参数:ak,tk前面接口返回的值,fuid环境相关的加密(可固定),fs旋转角度等加密
返回参数:op = 1 (通过验证),op = 3(旋转角度有问题)

重要的接口就是以上的这三个
fuid参数是fingerprint.js文件中,浏览器环境信息然后通过AES ECB模式加密得到


fs参数含有轨迹,旋转角度计算,以及spin-0的计算等等

我们先看p参数,p参数是由style接口中的spin-0加密得到


这里只需要将pow方法扣下来即可
下面是一部分代码:
const i = {
flag: !1,
start(t) {
const e = {};
return t.list.forEach((r=>{
const i = this.pow(r, t);
e[r] = i
}
)),
e
},
pow(t, e) {
const r = this.fillZero(e.count)
, i = Date.now();
let n, o = 0, s = "0";
for (; s !== r && !this.flag; )
s = sha1(e.originStr[t] + o).substring(0, e.count),
o++;
return n = Date.now() - i,
{
t: n,
an: o - 1
}
},
switch() {
this.flag = !this.flag
},
fillZero(t=1) {
let e = "";
for (var r = 0; r < t; r++)
e += "0";
return e
}
};
function get_p(spin){
var t = "spin-0";
var e = {
"originStr": {"spin-0": spin},
"list": ["spin-0"],
"version": "sha1Pow",
"count": 3
}
return i.pow(t, e)
}
ac_c位置:
跟栈到Number((this.distance / (e - 52)).toFixed(2))

其中 e为固定值290,this.distance为滑动的长度
所以ac = Number((distance / 238).toFixed(2)) 而旋转角度和距离的换算为 distance = pred* 238 / 360
this.secondHandle为最开始init接口返回

将this.rzData和参数this.secondHandle带入到f.Li中进行加密,所以我们进入到f.Li函数中,发现这个函数是一个AES ECB加密(填充方式为ZeroPadding)

由上图我们得知是AES ECB加密,而且加密参数就是前面的this.rzData,那么加密的key是怎么来的呢?
接下来我们看看这个key是如何得到的,我们先记住init接口的as参数

我们跟栈到加密位置

key等于as + appsapi2然后经过加密后取前16个字符所得

好了 第一个n.fs加密就是前面的内容了,后面再将这个加密所得的n.fs和backstr再进行一次aes ecb加密就得到了最终的fs参数

总结:最新版的旋转验证码要请求验证两次,逆向有几个重要的参数,ac_c,p还有轨迹参数,轨迹就留给大家自己去写算法了,p参数不对会返回opp=3,ac_c参数不对会返回op=3,轨迹不对后面验证时会出现提示存在安全风险,请再次验证
最后是本菜鸟的运行截图:

写在最后:本文章只做研究学习使用,请勿用作其他商业用途,如产生其他方面的影响,与本小菜鸟无关,请大家悉知!
温馨提示:我们将在您提交信息后的30分钟内与您取得联系,请您保持电话通畅,谢谢!