个人声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
此文章重在学习调试技巧。模拟参数生成。
目标网站: aHR0cHM6Ly9kZW1vcy5nZWV0ZXN0LmNvbS8=

简述:
个人觉得极验三难度比数美和易盾难
接口分析:
一个需要请求五次,五个接口
第一次gt/register-slide 第一个接口
返回challenge和gt加密要用的,都是三十二位。challenge在后续接口会重新生成,为三十四位
第一次get.php,第二个接口

携带gt,challenge,和第一个w值
返回
后面加密需要s和c,但是s的值在后面有接口重新生成s,所以这个接口返回的s值直接忽略掉就行。c一般不变
第一次 ajax.php,第三个接口

会有第二个w值
响应结果

PS:必须经过这个接口,才能获取最后结果。这个接口失败可能也会返回正确的结果
第二次get.php,第四次接口


这个接口生成被打乱的背景图和和缺口图
生成背景图是打乱的

除此之外,还重新生成了三十四位的challenge,这个challenge非常有误导性,除了最后两位不一样,其它都一样,我在这里吃过坑。
还有s值跟上次生成不一样,后续加密以这个s值为准。
第二次ajax.php,最后一个接口

第三个加密的w值,注意challenge是第二次返回的三十位的。
正确响应结果

score越低越代表是真人,越高越代表是机器人。
逆向流程
第一个w值
定位
第一个w值最好找,直接跟栈即可
在这个js文件里guwyxh,直接搜i + r即可

r值分析
每次输出值不一样

可以考虑是RSA加密
直接进去函数




直接跟到低发现

被加密的是随机十六加密值

密钥直接进去,搜索下断点

还有一个技巧,对于非对称,密钥设置,会有setpublic
而代码又被混淆
事实上类似ob混淆,都是有解密函数的
随机找个混淆进去

这个就是解密函数,插个桩

瞬间断住


至此r值分析完毕,不混淆,扣代码记得把解密函数也得扣了
i值分析

r值是对称加密

明文和密钥


密钥要跟rsa要加密值是一致的。
明文除了challenge和狗头,其它写死

至此i值分析完毕
第二个w值
定位
第二个w值是相对难找的,并没有迭代循环,也没有几层控制流嵌套控制流(我又想起了被阿里滑块支配的恐惧了)。纯跟栈下去,然后细心点就行

搜t

找到这个$_CEAp,搜不到,说明被混淆了
直接解密函数插桩,插这个桩会很卡,可能是因为经过很多次判断

断住了

跟上一个栈,很明显在这里加密


很明显也是一个对称加密,


密钥不要重新获取,跟w1密钥保持一致只分析r值就行
r值分析
需要分析的也就是一个值,rp是一个标签MD5加密值

r值主要由i[$_CFGDn(1150)]赋值


i[$_CFGDn(1150)]值在这里被循环增加

浏览器向右拖过去,最后发现rp值加这里加密


s也就是passtime,要对应
rp分析完毕,至此第二个w值分析完毕
第三个w值
第三个其实和前二个加密完全一样,除了轨迹加密。无论是哈希加密还是对称还是非对称,完全一样。不过是在另一个js文件加密的,slide文件
搜h + u就行了,再来

u和第一个加密r一样,省略
分析是o

userresponse分析
直接搜o =


t为缺口x坐标,另一个是三十四位challenge。扣代码或是补环境都比较容易。这个参数传参固定值是会变化的
rp值


忽略
aa分析


这是一大段轨迹

这是接口返回的c值

这是接口返回的s值

用补环境直接秒杀的 ,导出对象,然后传参

轨迹模拟分析
极验轨迹没有对y值进行检测,都为0也行。
其实有多公开轨迹方法都比较不错的,像这个大佬的博文
【JS逆向练习】极验三代滑块模式验证码逆向分析_极验3代滑块-CSDN博客
他的轨迹函数就非常不错。
不过我在想有一种邪修模拟轨迹方式,切割轨迹法
直接把滑块慢慢拖到底,记住要慢()

然后从网页直接获取轨迹

其实观察极验轨迹,发现一开始都是负数,然后再从0开始

一开始两个数可以这样表示

然后观察当滑块正确最后两个值,x和y值一样,时间浮动较大

坐标一样但是时间浮动比较大
所以最后一个特殊处理,时间浮动较大

至于中间可以用随机数特殊处理,比如时间,比如x坐标
完整代码
python
def gen_track_2(self, x):
track = track=[[-25,-30,0],[0,0,0],[1,0,902],[2,0,926],[3,0,934],
[4,0,942],[5,0,958],[6,0,966],[7,0,1030],[8,0,1054],
[9,0,1070],[10,0,1206],[11,0,1222],[13,0,1230],[15,0,1238],[16,0,1246],[17,0,1253],
[19,0,1262],[20,0,1278],[21,0,1446],[22,0,1462],[23,0,1470],[24,0,1486],[26,0,1494],
[27,0,1510],[28,0,1518],[29,0,1526],[30,0,1542],[32,0,1726],[34,0,1737],[37,0,1745],
[42,1,1752],[44,1,1758],[46,2,1767],[47,3,1774],[48,3,1782],[49,3,1791],[50,3,1808],[51,3,2134],
[52,3,2142],[53,3,2150],[54,3,2158],[55,3,2207],[56,3,2214],[57,3,2222],[59,3,2230],[61,3,2238],[63,3,2246],
[64,3,2254],[65,3,2262],[66,3,2326],[67,3,2342],[69,3,2350],[72,3,2358],[74,3,2366],[75,3,2495],[76,3,2521],[77,3,2529],
[78,3,3006],[79,3,3119],[81,3,3134],[82,3,3150],[83,3,3158],[84,3,3166],[85,3,3647],[86,3,3662],[87,3,3678],[88,3,3735],
[89,3,3750],[90,3,3767],[91,3,3782],[92,3,3790],[93,3,3878],[94,3,4231],[95,3,4246],[96,3,4392],[96,2,4401],[96,1,4408],
[97,0,4416],[97,-1,4423],[97,-2,4448],[98,-2,4552],[98,-3,4566],[98,-4,4575],[99,-4,4584],[100,-4,4592],[100,-5,4600],
[101,-5,4758],[103,-6,4775],[104,-6,4783],[105,-6,5408],[106,-6,5416],[107,-6,5464],[109,-6,5470],[110,-6,5735],
[111,-5,5750],[112,-4,5758],[112,-3,5766],[113,-3,5782],[114,-2,5958],[116,-2,5966],[117,-1,5976],[118,-1,5982],
[120,-1,5991],[120,0,5998],[121,0,6006],[122,0,6209],[123,0,6215],[124,0,6224],[126,0,6240],[127,0,6294],[128,0,6310],
[129,0,6391],[130,0,6398],[131,0,6487],[132,0,6518],[133,0,6534],[134,0,6542],[135,0,6558],[136,0,6582],[137,0,6726],
[138,0,6734],[139,0,6752],[140,0,6783],[141,0,6806],[142,0,6814],[143,0,7078],[144,0,7087],[145,0,7094],[146,0,7102],
[147,0,7110],[148,0,7352],[149,1,7366],[150,1,7374],[151,1,7382],[153,1,7392],[154,1,7408],[154,2,7424],[155,3,7432],
[156,3,8079],[157,3,8089],[158,3,8558],[160,3,8566],[161,3,8582],[162,3,8590],[163,3,8606],[164,3,8614],[165,3,8807],
[167,3,8814],[168,3,8822],[169,3,8831],[170,3,8837],[171,3,9392],[172,3,9399],[173,3,9424],[174,3,9430],[175,3,9446],
[176,3,9455],[177,3,9461],[178,3,9478],[180,3,10072],[181,3,10086],[182,3,10280],[183,3,10289],[184,3,10648],[186,3,10657],
[187,3,10678],[188,3,11167],[189,3,11183],[190,3,11191],[191,3,11865],[192,3,11888],[193,3,12080],[194,3,12088],
[195,3,12151],[196,3,12288],[198,3,12303],[199,3,12312],[200,3,12326],[200,3,12326]]
new_track = [
[random.randint(-50, -10), random.randint(-50, -10), 0],
[0, 0, 0]
]
for i in range(len(track)):
#前两个特殊处理
if i==1 or i == 0:
continue
#前五分之一数据波动为1,只要时间波动就行
#模拟刚加速时的正常波动,并且判断是不是相差大于二。
if i > len(track)/5 and track[i+1][0] - track[i][0]>2:
track[i][0] = track[i][0] + random.randint(0, 1)
#中间模拟加速,x波动增加,时间波动变慢
if i > len(track)/3*1 and i < len(track)/3*4:
track[i][0] = track[i][0] + random.randint(1, 4)
track[i][2] = track[i][2] - random.randint(5, 10)
#模拟时间波动
if track[i][0]<x:
track[i][2] = track[i][2] + random.randint(0, 1)
new_track.append(track[i])
#跳出
if track[i][0] >= x:
track[i][0] = x
new_track.append(track[i])
break
#最后一个特殊处理
new_track.append([x, new_track[-1][1], new_track[-1][2] + random.randint(200, 400)])
return new_track
总结
不过这个方法像机器人的分数很高,82分,通过率也很高,基本能通过,通不过就是识别出错了。基本九成以上

像用那位大佬的函数就更好了,像机器人分很低

分数就很低,就很像人为操作了。
底图还原分析
这玩意我也不懂,也是直接拿大佬公开的
底图还原函数如何定位,直接勾选画布

找到这个函数

然后问AI就行
我用大佬公开的函数
python
from PIL import Image
import requests
import io
from io import BytesIO
IMG_SHUFFLE_ORDER = [
39, 38, 48, 49, 41, 40, 46, 47, 35, 34, 50, 51, 33, 32, 28, 29, 27, 26, 36, 37, 31, 30, 44, 45, 43, 42, 12, 13, 23,
22, 14, 15, 21, 20, 8, 9, 25, 24, 6, 7, 3, 2, 0, 1, 11, 10, 4, 5, 19, 18, 16, 17,
]
# 图片会被切分为 10x80 的小图
IMG_SHUFFLE_X_STEP = 10
IMG_SHUFFLE_Y_STEP = 80
# 最后图片的宽高
IMG_WIDTH = 260
IMG_HEIGHT = 160
# 根据链接下载图片
def downloadImg(url: str):
r = requests.get(url, verify=False)
return spliceImg(Image.open(io.BytesIO(r.content)))
def downloadImgsmail(url: str):
r = requests.get(url, verify=False)
with open('sliceimg.jpg', 'wb') as f:
f.write(r.content)
def spliceImg(img: bytes):
img = Image.open(io.BytesIO(img))
# 创建一个图对象片
newImg = Image.new('RGB', (IMG_WIDTH, IMG_HEIGHT))
# 按照顺序循环 52 次
for i in range(len(IMG_SHUFFLE_ORDER)):
x = IMG_SHUFFLE_ORDER[i] % 26 * 12 + 1
y = IMG_SHUFFLE_Y_STEP if IMG_SHUFFLE_ORDER[i] > 25 else 0
# 根据刚才 JS 的逻辑,把图片裁剪出一小块儿
cut = img.crop((x, y, x + IMG_SHUFFLE_X_STEP, y + IMG_SHUFFLE_Y_STEP))
# 根据刚才的逻辑,确定新图片的位置
newX = i % 26 * 10
newY = IMG_SHUFFLE_Y_STEP if i > 25 else 0
# 把新图片拼接过去
newImg.paste(cut, (newX, newY))
newImg.save('img.jpg')
output = BytesIO()
newImg.save(output, format='JPEG') # 将图像保存到 BytesIO 对象中
image_bytes = output.getvalue()
return image_bytes
返回错误的结果
请参考这篇文章
【验证码逆向专栏】某验全家桶细节避坑总结 - 吾爱破解 - 52pojie.cn
再补充一个,w2生成时,传入参数改变了一点
像这些,

我把这个值去掉,减少一个,w2也返回success正确结果,但最终结果是错误的。可能有些值减少也不影响

怎么也不成功

我只是想说,虽然但是一般人不会在w2掉坑的,但我在w2吃过坑,我还傻乎乎一直分析w3。