某网站滑块逆向-1
本文最后更新于:2025年6月30日 下午
目标网站:aHR0cHM6Ly93d3cudmVyaWZ5NS5jb20vZGVtbw==
前期调试
v5推出的滑块验证的demo
首先需要初步调试,弄清楚该网页的调用流程,发现核心代码
这个网页很奇怪,可能是个demo的原因,将生成的token
值嵌入在了返回的页面当中

在数据传输中也是采用了WebSocket
的方式

查看启动器,方法不多,均打上断点

代码用了AST混淆,不过可以动态调试看值。可以发现在上面第一个方法的断点处,初始化了一个套接字对象,那么直接从这里逐步调试分析

下面这三个函数分别对应webSocket
的三种方法,onopen
、onclode
、onmessage

接着调试,发现在创建Socket
之后,也就是即将发送信息,调用了方法F
,接着进入到e[Ga](De)
方法中

调试到下面这个方法中,这个方法是核心部分,我们具体分析

核心部分
下面分析a[Ga] = function(a, b, c)
这个方法:

下面是传入的参数值,整理后b
是一个json
结构
1 |
|
下面走到Y(d,h)
、E(b,a)
,d和h是相同的值

进入到Y(d,h)
,发现这是一个返回输入字符串取奇偶位的拼接字符串的方法,起点通过b
的最后一个字符的Unicode值模2得到,因为这里b[0]
是charCodeAt()
。

接着进入到E(b,a)
,这就是加密函数,只用了AES,然后key是上面Y()
方法的返回值,注意最后返回的是base64(iv + encText)

发现iv
是通过q(16)
产生,看一下这个方法,f[b]
是Math.random
,sc
是一个字符数组,那么这个方法就是返回一个长度为16的随机字符串

加密之后,通过push
方法将a
加入到数组c
中,最后k
由c
中三个字符串拼接而成。c[0]
和c[1]
是方法输入的参数值,一个常量一个token

继续往下面调试,发现将k
赋值给了a
,并且将一些常量拼接进了字符串中

拼接完成后,会回转到上面的e[P][qe](a)
处,这里查看值可以发现就是调用WebSocket.send(a)
,也就是发送最终的加密字符串
还有一点需要注意,这里是分三次将字符串发送出去,每段1024字节,并且前面都有标识号0|3|0

发送完成后,这个方法就分析完了
接着会得到服务端返回的消息,
分析过程中由于不断刷新页面调试,相关数据可能前后不一致。
这里c
仍然为token
;g
为截取的返回字符串前32位;a
为被截断后,32位后面的字符串;这里Y(a,b)
和上面一样,得到解密的key

ja()
是解密函数,iv
是截取了输入a
的前32位,密文是32位之后的部分

下面就是解密之后a
的明文:

得到这个明文后,还需要发送第二次数据,来得到真正的图片地址

关于第二次数据的生成,可以调试得到存在两部分数据,一个常量和一个json
结构的变量,和第一次差不多
1 |
|
然后将两部分拼接进行加密,前面加上1|1|0|
就得到了第二次的发送数据。
下面是第二次返回结果解密后的展示,这里发现密钥和第一次的一样就直接用,发现已经可以获取本次的图片和滑块地址

得到图片地址后,使用ddddocr
库直接滑块识别,最后实际用到的其实是res['left']
1 |
|
得到的移动距离后,需要产生模拟滑块的移动参数:这里需要产生两个时间戳,拼接在轨迹参数的前后,保证前面的时间t1
大于后面的t2
即可。同时发现,只有当request_id
中的时间戳等于t1
才会得到通过。
1 |
|
计算完成后,还需要将滑动产生的轨迹参数加密后发送给服务端,加密的key
和第二次一样,都是first_msg[:32]
,需要注意的是带上2|1|0
的前缀

最后整个流程:得到data:{success:true}
即为通过
