目录
目标主页
三代:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9jbGljay1iaW5kLmh0bWw=
四代:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
三代抓包情况
通过抓包发现,register-click-official
接口会返回 challenge
和 gt
值,为 get.php
接口的关键请求参数:
get.php
会返回 c
和 s
,同样后面会用到,这个接口的 w
值与三代无感不同,可以置空:
点击按钮进行验证,会弹出文字点选框,此时抓包到第一个 ajax.php
接口,虽然只返回了验证码类型,没什么关键参数,但是不请求会报错,点击文字进行验证后,抓到第二个 ajax.php
接口,返回验证结果及 validate
参数的值,该值登录接口会用到:
w 值逆向
还是老生常谈直接全局搜索 "\u0077" 这里我们就定位到 3.0.9js文件
打个断点,去过一下验证码,就发现这里就是w参数生成的地方 w = p +u
var u = n[$_CADAh(718)]()
h = H[$_CACJT(216)](re[$_CADAh(116)](o), n[$_CACJT(726)]())
p = he[$_CADAh(768)](h)
先来看看u 参数,跟到 n[$_CADAh(718)]() 中 this[$_CBGAy(726)](e) 十六位随机数,跟进去把算法扣下来即可:
因此 t 是将十六位随机字符串加密后得到的,这里为 RSA 加密,从原型链中跟进去即可找到公钥和模值,将代码扣下来或者直接用库都行,至此 u 值分析完了,不会扣RSA加密的,可联系博主
扣代码时候,该补的补,一个 window,ue
var window = {"Navigator": {
"appName": "Netscape",
},}
ue = window['Navigator']
接下来就是后面参数问题 h
n[$_CACJT(726)]() 十六位随机数,需要保持和上面RSA加密一致的随机数,h 参数的加密方法为 H[$_CACJT(216)]
,跟进去打断分析会发现是 AES 加密,初始向量 iv 为 0000000000000000,将o参数
JSON.stringify(o)一下,之后就是十六位随机数作为key,进行AES加密:
o 值的关键参数如下:
- passtime:图片加载时间
- a:点选文字位置
- pic:背景图片链接
- tt:将 c、s、鼠标信息等进行加密,某些值可以固定,加密方法直接扣下来即可
- h9s9: "1816378497":该键值对每天变化
- rp:将 gt、challenge、passtime 经过 MD5 加密
将 h 经过 he[$_CADAh(768)]
方法加密后得到 p,跟进去扣下来即可,三代图标、语序除了 a 的写法,其他逻辑都是一样的。搞过滑块的都知道这些东西
该扣的扣,该补的补,剩下就是点选的坐标问题,这里直接通过打码平台就行了
o 参数中的值寻找:
全局搜索: l = (i - o) / a * 100 直接定位到关键位置 l u 是我们点击是触发的,也就是有关坐标元素
该矩形左上角的顶点坐标为(x, y),宽度为width,高度为height,而top、right、bottom、left则分别表示该矩形上边缘、右边缘、下边缘、左边缘的坐标值。
o---right 图片距离左边距离
a---width
i 938
(i - o)/a *100%
(字体距离right距离 - 图片离right距离)/图片宽度 *100% == 字体在图片占比
都是以图片左边边框为标准
bottom: 620.28125 图片距离底部距离
left: 806.703125 图片距离左边距离
right: 1113.25 图片左边边框距离右边距离
top: 313.734375 图片距离顶部距离
width: 306.546875 图片宽度
height: 306.546875图片高度
x: 806.703125
y: 313.734375
x,y 图片左上角距离左边顶部距离
最后得出结果,字体对图片占比,也不排除点击的位置对图片的占比,之后四舍五入取前四位数字,有x,y 所以需要通过下划线链接,之后就是几个字几组就行了这里我们解决o中的e,参数
接下来是 o 中的轨迹 tt,我们可以看到这个tt是个函数,传入了t,e,n 三个参数,其中 t 是可以写死,e,n就是第二个get.php中返回的c,s。这就解决了tt参数
o 中的 ca 不检测写死
到此复现完毕,有什么问题可以联系博主
四代点选
抓包分析
抓包,load
接口返回值如下:
- captcha_type:验证码类型,文字点选为 word
- gct_path:gct4 文件路径
- lot_number:生成 pow_msg、w 的关键参数
- pow_detail:bits、datetime、hashfunc 都与 w 参数有关
- payload:verify 请求参数
- process_token:verify 请求参数
- ques:各文字图片的链接
点击验证后,verify
接口返回校验结果及 login 请求参数:
- result:校验结果,成功即 success,失败为 fail
- captcha_id:验证码 id
- captcha_output:login 请求参数
- gen_time:login 请求参数
- lot_number:login 请求参数
- pass_token:login 请求参数
login 接口验证登录成功则返回:
w 逆向分析
还是一样的老配方,全局搜索:"\u0077"
var r = (0,d[$_CBGHl(19)])(f[$_CBGHl(19)][$_CBGIS(584)](e), s)
跟进到 d[$_CBHIU(47)]
中,(0, d[$_DIEHV(186)])(c) + u
即 w 值:
接下来跟进到 i[a][$_DGAHG(1213)][$_DGAIA(1246)](e, s)
中,c 为 AES 加密,扣代码或者直接用库:
还是一样的配方。s 上文讲了,为十六位随机字符串,e 中 device_id 固定值、 lot_number 由 load 接口返回,userresponse 为点选坐标,pow_msg 为 "1|0|md5|" + datetime + "|" + captcha_id + "|" + lot_number + "||" + 16位随机数,pow_msg 经过 MD5 加密即为 pow_sign,"f019":"1024281898" 为动态变化的键值对,在往期四代滑块的文章中均有详细介绍,其他值固定即可
其中x,y 坐标 r = (n - t[$_GDGHH(855)]) / t[$_GDGIT(849)] * 100
r = (n - t[$_GDGHH(855)]) / t[$_GDGIT(849)] * 100
i = (s - t[$_GDGHH(661)]) / t[$_GDGIT(809)] * 100
r = (n - 1059.984375) / 300.03125 * 100
i = (s - 388.5) / 200.109375 * 100;
其中 t[$_GDGHH(855)] 和 t[$_GDGHH(661)] 是根据屏幕来决定,n,s 是坐标位置加上坐标位置距离浏览器左上角的距离
接着就是,分别 进行这步Math[$_GDGHH(689)](100 * r), Math[$_GDGIT(689)](100 * i))
Math['round'](100 * r)
Math['round'](100 * i)
全局搜索这个直接定位到,接着就是自己操作,这里需要注意的是,列表不能以字符串方式传进去
例如:
[[8433, 6022], [1367, 1724], [8066, 1824]]
‘[[8433, 6022], [1367, 1724], [8066, 1824]]’
得出的结果不一样
四代图标、字序、九宫格除了 userresponse 的写法,其他逻辑都是一样的。