声明
本帖仅供学习交流,严禁用于非法用途,如有侵权,请联系本人删除
主题
某财富网滑块逆向
YUhSMGNITTZMeTlwTG1WaGMzUnRiMjVsZVM1amIyMHZkMlZpYzJsMFpXTmhjSFJqYUdFdmMyeHBaR1Z5ZG1Gc2FXUT0=
验证码请求流程
先大致浏览请求流程
相关参数:
- browserid
- ctxid: 接口返回
- request
browserid
- 搜索 browserid, 发现是从cookie中取值 qgqp_b_id 而得
- 搜索 qgqp_b_id, 有十几处,逐个查看,找到关键位置
for (var e = Math.floor(9 * Math.random() + 1).toString(), t = 0; t < 19; t++) e += Math.floor(9 * Math.random()).toString();
- 可知browserid 一个 20 位的数字字符串,其中: 第一位是 1~9 的随机数字(不会为 0)。 后 19 位是 0~8 的随机数字(可能为 0,但不会为 9)
request
data: {
ctxid: n.ctxid,
request: a.base64Encode(a.encrypt(o))
}
- 打断点,查看加密逻辑
- u为待加密字符串
- 尝试使用a.base64Encode(a.encrypt()) 函数加密字符串a,加密结果为 '0waYj+x1s7s=', 与常用加密方法对比,均不一致
- 进入encrypt方法, 将encrypt函数丢给Deepseek, 确定是XXTEA算法
- js扣出来可直接执行, 与浏览器加密结果对比,数据一致
- 复现请求流程,获取到验证码图片
图片还原
验证码图片为乱序图片
- 尝试给canvas打断点,没断住,三脸疑问.jpg
- 搜索img,发现有DecodeImg字样,断点查看
- 根据u值裁剪图片并堆叠
- 得到还原图片
滑块距离识别
借助开源库 captcha-recognizer 识别滑块移动距离
# img_restored 为还原后的滑块背景图
from captcha_recognizer.recognizer import Recognizer
recognizer = Recognizer()
box, confidence = recognizer.identify_gap(source=img_restored, is_single=True)
box_x = box[0]
distance = int(box_x - 8)
print('距离', distance)
移动轨迹加密
request: a.base64Encode(a.encrypt(o)) 处打断点,发现o包含鼠标移动轨迹
appid=202503141611|ctxid=e7d20d53987048ffec6d033bbb94bc31|type=slide|u=51|d=0,0,0:1,0,20:4,0,36:7,0,52:12,-2,68:18,-2,82:25,-3,98:27,-3,115:30,-3,130:32,-3,146:33,-3,156:35,-3,171:38,-4,186:41,-5,202:44,-5,226:47,-5,242:49,-5,267:51,-5,288:51,-5,535|a=quoteapi|p=|t=535|r=0.967621342436788
模拟鼠标移动轨迹
基于三次(三阶)贝塞尔曲线生成移动轨迹
def cal_trace(distance):
def cubic_bezier_curve(x1, y1, x2, y2, x_cp1=1, y_cp1=2, x_cp2=2, y_cp2=-1, num_points=20):
"""
生成三次贝塞尔曲线上的点。
参数:
x1, y1 -- 起始点坐标
x2, y2 -- 终点坐标
x_cp1, y_cp1 -- 第一个控制点坐标
x_cp2, y_cp2 -- 第二个控制点坐标
num_points -- 曲线上的点数
返回:
points -- 曲线上的点列表,每个点是一个(x, y)元组
"""
# 生成一个从0到1的数列,用于计算贝塞尔曲线上的点
t = np.linspace(0, 1, num_points)
points = []
# 遍历参数t的每个值,计算曲线上对应点的坐标
for t_val in t:
# 三次贝塞尔曲线的公式
x = np.power((1 - t_val), 3) * x1 + 3 * np.power((1 - t_val), 2) * t_val * x_cp1 + \
3 * (1 - t_val) * np.power(t_val, 2) * x_cp2 + np.power(t_val, 3) * x2
y = np.power((1 - t_val), 3) * y1 + 3 * np.power((1 - t_val), 2) * t_val * y_cp1 + \
3 * (1 - t_val) * np.power(t_val, 2) * y_cp2 + np.power(t_val, 3) * y2
# 将计算得到的点添加到列表中
points.append((x, y))
# 返回曲线上所有计算得到的点
return points
x1, y1 = 0, 0
# 目标点
x2, y2 = distance, -1
traces = cubic_bezier_curve(x1, y1, x2, y2, x_cp1=40, y_cp1=20, x_cp2=240, y_cp2=160)
return traces
滑块验证
相同的算法构建request: a.base64Encode(a.encrypt(o))
验证通过