大家好,欢迎来到IT知识分享网。
前言
1.网址信息:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s
2.现在很多网站登录时都需要用到极验例如极验登录完获取cookie,来进一步操作
问:什么是极验?
极验(Geetest)是一家专注于人机交互验证与安全服务的技术公司。极验通过图形验证码、滑动验证等方式,帮助网站和移动应用程序防范机器人攻击和恶意行为,保护用户账号和数据安全。极验的产品和服务被广泛应用于网站登录、注册、支付等场景,为用户和企业提供了更高级别的安全保障。
1.抓包分析
第一次请求:获取 challenge和gt 在后续操作都用得到
第二次请求:获取c和s(后续逆向会用到这两个参数),载荷是challenge,gt和w
点击完验证之后
第三次请求:获取类型slide(滑动) 这里因为是做滑块所以百分之百是slide,如果一些网站他引进的是极验全家桶,那还有click等,就要判断使用哪一种类型的了
第四次请求:获取滑块背景图片,滑块图片,更新了s,更新了challenge
第五、六次:请求获取背景图和滑块图,发现背景图是打乱
滑动滑块之后
最后一次:滑动验证成功生成validate,参数是gt,challenge和w
2.试错分析
极验三滑块我十几天前做出来的,当时我我把三个w等参数都逆向出来了,但是今天准备发文章的时候发现一直forbidden,然后花了一上午找原因,就在这里告诉你们。
验证前两次w 的key一致性 验证第二次w自定义键值对,验证第三次w验证滑块距离轨迹
他一般更新的都是这个w自定义键值对,今上午找半天才发现这个更新了
这里你们可能不知道什么是key的一致性,什么是w的自定义键值对,我就可以告诉你们,只要保证第一个w和第二个w是在一次完整请求 获得的,就能直接写死,等更新的时候再来复制浏览器的就行
所以说我们主要步骤也就两步:(1)底图还原,(2)逆向第三个w
3.底图还原
我们先创建画布的事件断点,再点击验证
直到出现这个就是正在创建图片的时候 代码的红色框框就是还原图片的算法
tips:你会发现我的代码是没有混淆的,我是用的解混淆工具(后面我会给出我的绿泡泡)当然你也可以顶着混淆干,也是一样的,只是没有混淆会更好发现逻辑,顶着混淆就需要抠代码了
发现图片还原主要是根据这个数组进行还原的,这里给出图片还原代码
from PIL import Image from io import BytesIO # 还原图片 def image_restoration(content, file="./restore_bg.png"): # 1、图片还原 image = Image.open(BytesIO(content)) standard_img = Image.new("RGBA", (260, 160)) position = [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] s, u = 80, 10 for c in range(52): a = position[c] % 26 * 12 + 1 b = s if position[c] > 25 else 0 im = image.crop(box=(a, b, a + 10, b + 80)) standard_img.paste(im, box=(c % 26 * 10, 80 if c > 25 else 0)) standard_img.save(file) # 将图片转为字节流 img_byte = BytesIO() standard_img.save(img_byte, format='PNG') binary_content = img_byte.getvalue() return binary_content
这样我们就可以把图片还原
4.获取第三个w
解完混淆后直接搜索“w”(这里只讲思路流程,需要也可以找我要,跟栈也能跟的到)
发现w是h+u u和h都在上面
(1) 找u
那我们先进入u这个函数里面看看怎么个回事
发现u就等于rsa加密16进制随机字符串
(2) 找h
发现找h就先找到l,找l就先找到o
发现重点是找到o,我们去前面找找
这里直接说明了 找o的重点是里面的aa和userresponse和n 其他的写死就好
发现e是上一步传进来的,就走到上一步
发现这个l就是e 上图的那个就是轨迹数组 分别对应的是x,y,和时间,这里我给出生成轨迹的算法、
""" 用于生成坐标轨迹 """ import math import random import matplotlib.pyplot as plt import numpy as np import matplotlib as mpl class GTrace(object): def __init__(self): self.__pos_x = [] self.__pos_y = [] self.__pos_z = [] def __set_pt_time(self): """ 设置各节点的时间 分析不同时间间隔中X坐标数量的占比 统计结果: 1. 80%~90%的X坐标在15~20毫秒之间 2. 10%~15%在20~200及以上,其中 [-a, 0, x, ...] 这里x只有一个,取值在110~200之间 坐标集最后3~5个坐标取值再50~400之间,最后一个坐标数值最大 滑动总时间的取值规则: 图片宽度260,去掉滑块的宽度剩下200; 如果距离小于100,则耗时1300~1900之间 如果距离大于100,则耗时1700~2100之间 """ __end_pt_time = [] __move_pt_time = [] self.__pos_z = [] total_move_time = self.__need_time * random.uniform(0.8, 0.9) start_point_time = random.uniform(110, 200) __start_pt_time = [0, 0, int(start_point_time)] sum_move_time = 0 _tmp_total_move_time = total_move_time while True: delta_time = random.uniform(15, 20) if _tmp_total_move_time < delta_time: break sum_move_time += delta_time _tmp_total_move_time -= delta_time __move_pt_time.append(int(start_point_time+sum_move_time)) last_pt_time = __move_pt_time[-1] __move_pt_time.append(last_pt_time+_tmp_total_move_time) sum_end_time = start_point_time + total_move_time other_point_time = self.__need_time - sum_end_time end_first_ptime = other_point_time / 2 while True: delta_time = random.uniform(110, 200) if end_first_ptime - delta_time <= 0: break end_first_ptime -= delta_time sum_end_time += delta_time __end_pt_time.append(int(sum_end_time)) __end_pt_time.append(int(sum_end_time + (other_point_time/2 + end_first_ptime))) self.__pos_z.extend(__start_pt_time) self.__pos_z.extend(__move_pt_time) self.__pos_z.extend(__end_pt_time) def __set_distance(self, _dist): """ 设置要生成的轨迹长度 """ self.__distance = _dist if _dist < 100: self.__need_time = int(random.uniform(500, 1500)) else: self.__need_time = int(random.uniform(1000, 2000)) def __get_pos_z(self): return self.__pos_z def __get_pos_y(self): _pos_y = [random.uniform(-40, -18), 0] point_count = len(self.__pos_z) x = np.linspace(-10, 15, point_count - len(_pos_y)) arct_y = np.arctan(x) for _, val in enumerate(arct_y): _pos_y.append(val) return _pos_y def __get_pos_x(self, _distance): """ 绘制标准的数学函数图像: 以 tanh 开始 以 arctan 结尾 根据此模型用等比时间差生成X坐标 """ # first_val = random.uniform(-40, -18) # _distance += first_val _pos_x = [random.uniform(-40, -18), 0] self.__set_distance(_distance) self.__set_pt_time() point_count = len(self.__pos_z) x = np.linspace(-1, 19, point_count-len(_pos_x)) ss = np.arctan(x) th = np.tanh(x) for idx in range(0, len(th)): if th[idx] < ss[idx]: th[idx] = ss[idx] th += 1 th *= (_distance / 2.5) i = 0 start_idx = int(point_count/10) end_idx = int(point_count/50) delta_pt = abs(np.random.normal(scale=1.1, size=point_count-start_idx-end_idx)) for idx in range(start_idx, point_count): if idx*1.3 > len(delta_pt): break th[idx] += delta_pt[i] i+=1 _pos_x.extend(th) return _pos_x[-1], _pos_x def get_mouse_pos_path(self, distance): """ 获取滑动滑块鼠标的滑动轨迹坐标集合 """ result = [] _distance, x = self.__get_pos_x(distance) y = self.__get_pos_y() z = self.__get_pos_z() for idx in range(len(x)): result.append([int(x[idx]), int(y[idx]), int(z[idx])]) return int(_distance), result if __name__ == "__main__": _color = ["blue", "green", "red", "cyan", "magenta"] trace = GTrace() # for idx in range(0, 10): # distance = random.uniform(70, 150) # print("长度为: %d , 坐标为: \n" % distance) # distance, mouse_pos_path = trace.get_mouse_pos_path(distance) # print("长度为: %d , 坐标为: \n" % distance, mouse_pos_path)
而我们接下来是要获得距离,可以参考我前面说的ddddocr来获取,这里给出链接地址
♥♥ddddocr处理简单验证码https://mp.csdn.net/mp_blog/creation/editor/
然后再把这一段代码扣下来就好代码就可以了(这里就不过多赘述)
userresponse就是扣那一段代码对最后一个很坐标进行操作
passtime也就是通过时间,也就是轨迹数组的最后一个数组的最后一个元素
最后得出o 只要我说的几个生成,其他的写死就好
发现就是aes对JSON.stringify(o)再加上之前那个16位数子当key在对其进行加密,对最后生成的数组进行处理就是
而最后h就是抠代码就好(这里不过多赘述)
5.总结
1.先还原底图
2.通过ddddocr获得需要滑动的距离
3.生成轨迹
4.o里的aa 抠代码 轨迹和前面获得的c和s进行加密
o里的userresponse 抠代码 轨迹最后的横坐标 和challenge加密
o里的passtime 就是轨迹最后一个位置的第三个数
再把这些和其他死值组装好生成o
6.h= 抠代码加上aes对o进行加密 16位作为key ‘0000000000000000’作为iv
7.w=h+u
6.效果演示
进行10次操作,发现成功率在百分之九十多,不能百分百的原因是ddddocr没有十分准确
7.补充
有需要的可以私信我,有球必应
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143278.html