快手滑块验证码JS逆向

8,042次阅读
2 条评论

有很多小伙伴在采集快手数据的时候,经常会碰到跳滑块验证码。

验证码链接格式如下:https://captcha.zt.kuaishou.com/mobile/app/index.html?captchaSession=Cgp6dC5jYXB0Y2hhEuoBcz4Gw2gwHfF……

打开后如下是一个拼图验证码。

快手滑块验证码JS逆向

一、JS逆向分析

打开滑块页面,可以看到生成滑块的时候请求了这个地址:https://captcha.zt.kuaishou.com/rest/zt/captcha/sliding/config,请求需要携带滑块captchaSession参数(这个参数滑块链接里有),接口会返回滑块的一些基本信息。

快手滑块验证码JS逆向

滑块信息里有一个很重要的参数captchaSn,我们通过搜索这个参数,可以找到这个位置,直接在这里断点,追进去看一下。

快手滑块验证码JS逆向

可以看到,i是生成加密参数所需要的一些信息:

其中trajectory是滑动轨迹,

relativeX、relativeY是缺口坐标,

captchaExtraParam、gpuInfo是一些设备相关的信息,可以固定。

Object(Ue[“a”])(i)可以得到加密结果。

快手滑块验证码JS逆向

我们直接进Ue[“a”]方法,打个断点,可以看到有个while循环,分别以[‘4’, ‘0’, ‘2’, ‘1’, ‘3’]这个步骤进行执行。

快手滑块验证码JS逆向

在控制台按顺序看下参数,很明显,这里先是对刚刚传进来的参数i进行了一个url字符串拼接,获取加密参数a,然后传到加密方法里。

最终我们可以得到如下这个算法:

c.a[s(“0x1a”)](a, i.a[s(“0x1b”)](f[0]), t[s(“0x18”)](l, {}, x, i.a[s(“0x1b”)](f[1])))[s(“0x1d”)]()

快手滑块验证码JS逆向

我们对刚刚获取的算法进行还原,整理后可以得到如下一个更简洁的算法:

c.a.encrypt(a, i.a.parse(‘djRkajFnMWxmZWtvZjhzeg==’), l({}, ‘iv’, i.a.parse(‘aHMyczhlb3A2cG42Y2Y4OQ==’))).toString()

快手滑块验证码JS逆向

到这里就已经很明显了,是一个AES加密,但是key、iv还要经过一个parse处理,最终结果也要经过一个toString处理,我们直接追进去看一下。

先看一下parse,可以看到最终执行了a(n, t, e),n是key,t是22,e是_reverseMap。

快手滑块验证码JS逆向

看下toString

快手滑块验证码JS逆向

到这里就差不多了,可以扣JS测试了,效果如下。

快手滑块验证码JS逆向

二、缺口、轨迹

除了加密算法,快手滑块还有一个难点那就是缺口计算和轨迹。

2.1 缺口计算

缺口计算有一点需要注意下,实际显示的图片和你拿到的图片是有缩放的,686*400会缩放成316*184,缩放比为0.46。也就是说,你最后识别图片拿到的缺口坐标,需要乘0.46才是真正的坐标(验证码缺口识别可以看我后续的文章)。

2.2 轨迹

轨迹数组里有三个参数,分别为x、y和时间,直接用加速度算法大概率是过不去的,可以考虑下曲线算法。

其中位移量可以参考下这个公式:(relativeX – 5) / (315 – 40) * 1000

三、最终效果

快手滑块验证码JS逆向
正文完
 2
评论(2 条评论)
互联网板砖人
2022-03-16 14:08:35 回复

大佬求轨迹算法啊2584179909@qq.com

    timor
    2022-05-06 15:53:11 回复

    同求,有进展嘛?