新闻动态

某度旋转验证码 js逆向分析

2025-11-07

注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除
注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除
注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除

写在前面:本菜鸟刚开始学习js逆向的时候有弄过某度的旋转验证码v1版本,那个时候觉得这种旋转验证码很新颖,现在不知不觉已经在这条道路上走了两三年了,再次回首,发现现在已经更新到v2版本了,好了,废话有点多,今天给大家带来最新版本的某度旋转js逆向分析

1.接口分析

1.1 init接口

	请求参数:ak   ----> 类似于网站特有的id
	返回参数:as、ds、tk 这三个参数后面有用到

在这里插入图片描述

1.2 style接口

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

在这里插入图片描述

1.3 log接口

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

在这里插入图片描述
重要的接口就是以上的这三个

2.参数加密分析

2.1 fuid参数

fuid参数是fingerprint.js文件中,浏览器环境信息然后通过AES ECB模式加密得到

在这里插入图片描述
在这里插入图片描述

2.2 fs参数

	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,轨迹不对后面验证时会出现提示存在安全风险,请再次验证

最后是本菜鸟的运行截图:
在这里插入图片描述
写在最后:本文章只做研究学习使用,请勿用作其他商业用途,如产生其他方面的影响,与本小菜鸟无关,请大家悉知!

在线充值在线咨询在线电话返回顶部

技术支持

电话咨询

19922193247

超10000+ 企业选择我们,快速体验!

温馨提示:我们将在您提交信息后的30分钟内与您取得联系,请您保持电话通畅,谢谢!