吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2756|回复: 54
上一主题 下一主题
收起左侧

[Web逆向] 某财富网滑块逆向

[复制链接]
跳转到指定楼层
楼主
HaveAnOrange 发表于 2025-7-2 10:02 回帖奖励
本帖最后由 HaveAnOrange 于 2025-7-2 10:12 编辑

声明

本帖仅供学习交流,严禁用于非法用途,如有侵权,请联系本人删除

主题

某财富网滑块逆向

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

  • 搜索 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字样,断点查看

  • 进入k函数,疑似为图片还原逻辑, 发现用于还原图片的数组

  • 将还原逻辑丢给Deepseek, 尝试AI生成还原逻辑,还原图片

  • 三脸疑问.jpg & 人类早起驯服AI失败.jpg

  • F12检查元素,发现验证码是有 26*2个图片条堆叠而成,通过div的 background-position 属性控制

  • k函数中u为对应的图片偏移量

  • 根据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))

验证通过





免费评分

参与人数 21吾爱币 +27 热心值 +19 收起 理由
毛新航 + 1 + 1 用心讨论,共获提升!
wdj500 + 1 + 1 我很赞同!
tomatoPower + 1 + 1 用心讨论,共获提升!
junjia215 + 1 + 1 用心讨论,共获提升!
gezhonglunta + 1 + 1 我很赞同!
surepj + 1 + 1 用心讨论,共获提升!
rayzju + 1 + 1 用心讨论,共获提升!
fengbolee + 2 + 1 用心讨论,共获提升!
yumuxue + 1 热心回复!
kingbinvip + 1 + 1 用心讨论,共获提升!
AdAStra + 1 我很赞同!
ioyr5995 + 1 + 1 热心回复!
offerking + 1 + 1 热心回复!
ksiv + 1 + 1 用心讨论,共获提升!
ytfh1131 + 1 + 1 谢谢@Thanks!
SVIP9大会员 + 2 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
allspark + 1 + 1 用心讨论,共获提升!
你好,再见 + 3 + 1 用心讨论,共获提升!
mengxuehao + 1 + 1 我很赞同!
helian147 + 2 + 1 热心回复!
漁滒 + 2 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
3xsh0re 发表于 2025-7-10 00:20
长情 发表于 2025-7-8 03:08
取到的图 小片是12像素, 原图是10像素, 大佬能不能给个图片还原的代码啊 万分感激

这是我写的,先切后拼就行了
[Python] 纯文本查看 复制代码
def genCompleteImg():
    # 数组a写死
    a = [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]
    bg_image = requests.get(url=bg_img, headers=headers).content
    # 背景图的高度为160
    height = 160
    image = Image.open(BytesIO(bg_image))
    slices = []
    # 模拟背景图切割过程
    for l in range(len(a)):
        # 计算横向偏移
        x_offset = a[l] % 26 * 12 + 0.5
        # 计算纵向偏移
        if a[l] <= 25:
            y_offset = height // 2
        else:
            y_offset = 0
        left = x_offset
        upper = y_offset
        right = left + 12
        lower = upper + 80
        # 裁剪图像并保存
        cropped_img = image.crop((left, upper, right, lower)).resize((10, 80))
        slices.append(cropped_img)
    columns = 26
    rows = 2
    # 创建一张空白图像,大小为每个小块宽度 * 列数,高度 * 行数
    result_image = Image.new("RGB", (columns * 10, rows * 80))

    # 将切割的小块拼接到新图像中
    for i, slice_ in enumerate(slices):
        row = i // columns
        col = i % columns
        x_position = col * 10
        y_position = row * 80
        # 将切割图像粘贴到拼接图像的指定位置
        result_image.paste(slice_, (x_position, y_position))

    # 保存拼接后的图像
    result_image.save("3_combined_image.jpg")
推荐
tomatoPower 发表于 2025-7-7 17:27
HaveAnOrange 发表于 2025-7-7 17:23
移动距离有减8像素吗?

有的,  识别的代码也是用的你贴的, 是不是我轨迹时间的有问题?我让AI写的
def trace_to_ec_format(trace):
    """
    将轨迹点序列转为 x1,y1,t1:x2,y2,t2:... 格式
    trace: [(x, y), ...]
    """
    result = []
    t = 0
    for i, (x, y) in enumerate(trace):
        x = int(round(float(x)))
        y = int(round(float(y)))
        if i == 0:
            t = 0
        elif i == 1:
            t = random.randint(100, 200)  # 第一段时间间隔随机100~200ms
        else:
            # 时间间隔可根据实际调整,这里用随机20~40ms
            t += random.randint(20, 40)
        result.append(f"{x},{y},{t}")
    return ":".join(result)
沙发
漁滒 发表于 2025-7-2 11:01
什么操作下会出现这个滑块?我暂时还没遇到出现滑块
3#
 楼主| HaveAnOrange 发表于 2025-7-2 13:38 |楼主
漁滒 发表于 2025-7-2 11:01
什么操作下会出现这个滑块?我暂时还没遇到出现滑块

短信登录时会出
4#
StockGeek 发表于 2025-7-3 00:34
漁滒 发表于 2025-7-2 11:01
什么操作下会出现这个滑块?我暂时还没遇到出现滑块

您找个接口,连续访问500遍就会出现滑块后才能继续访问
5#
StockGeek 发表于 2025-7-3 00:37
本帖最后由 StockGeek 于 2025-7-3 09:53 编辑

暂时先这样吧,学习一下思路,我试试
6#
 楼主| HaveAnOrange 发表于 2025-7-3 09:34 |楼主
StockGeek 发表于 2025-7-3 00:37
最近我也很疑惑,之前接口获取实时全部价格,现在改成每次只能获取200个,获取全部还循环20多次,没几个轮 ...

抱歉,没有这个网站的业务,只是研究滑块,具体的策略我也不清楚
7#
你好,再见 发表于 2025-7-3 13:23
学习了,三阶贝塞尔曲线模拟鼠标运动轨迹
8#
chenchen811 发表于 2025-7-3 16:37
感谢,很有用
9#
Ad9298 发表于 2025-7-3 21:22
厉害了,学习
10#
SVIP9大会员 发表于 2025-7-3 22:46
楼主,麻烦出一个争对智慧中小学的滑块验证的python代码,我一直困在collect和eks这两个参数这里。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-7-20 18:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表