← 返回文章列表

极验验证码全家桶技术全揭秘:从接口抓取到轨迹模拟的逆向实战

极验验证码作为反爬虫利器,涵盖滑块、点选、无感、九宫格等多种类型。本文详细拆解其请求流程、参数加密逻辑(如AES和自定义w值计算)、图片乱序还原机制,以及轨迹生成方法。通过Python代码示例演示还原和模拟过程,帮助开发者理解逆向思路并快速实现自动化验证对接。

极验验证码全家桶技术全揭秘:从接口抓取到轨迹模拟的逆向实战

极验验证码在许多网站和应用中被广泛用于防止自动化脚本攻击。它的工作原理类似于一道智能门锁,不仅要求用户完成拼图任务,还会根据操作轨迹进行额外验证。这种机制让传统抓包工具难以绕过,但通过系统分析请求数据包和JavaScript逻辑,开发者可以逐步拆解其加密规则,实现自动化验证。

验证码请求流程全解析

当访问目标网站时,页面加载初期会触发验证码请求流程。首先通过start接口获取challenge和gt参数,这些是后续请求的唯一标识符。然后会发起第一个get请求初始化数据,接着第二个get获取验证码图片信息,最后通过ajax接口提交验证结果。实际测试发现,可以简化流程:移除第一个get请求,并将第一个ajax的w参数置空。这样,验证码请求变得更高效,直接进入核心参数生成阶段。

这个简化流程源于对页面抓包的观察,极验的逻辑通过多个AJAX调用组合完成。了解这个流程后,开发者可以直接使用浏览器开发者工具记录数据包,抓住关键参数而不必跟踪所有请求细节。

核心加密机制拆解

极验验证码的加密过程分为多个层级。startCaptcha接口返回的内容为AES加密形式,密钥和初始化向量(IV)都固定不变,这意味着任何实现AES的库都可以轻松解密原始数据。开发者只需在调试环境中找到对应的断点,就能确认这一点。

另一个关键是ajax接口中的w参数加密。该参数由两个子值h和u构成,其中u通过特定随机字符串生成函数计算,h则由另一个处理函数衍生而来。逆向时,可以通过搜索字符串或跟进堆栈直接定位这些计算点。整个过程体现了极验对多层混淆的处理,确保即使是熟悉逆向的开发者也需要耐心调试。

滑块验证码图片乱序还原技术

滑块验证码的图片经过特殊处理,呈现出乱序排列状态。这是因为极验使用Canvas绘制拼图块,并通过预定义数组控制绘制顺序。还原图片时,需要根据固定规则将这些块重新粘贴到目标画布上。

以下是Python实现图片还原的完整示例,采用PIL库处理字节流数据:

def restore_img_from_url(img_url, ut_array=None):
    default_ut = [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]
    Ut = ut_array if ut_array is not None else default_ut

    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"}
        response = requests.get(img_url, headers=headers, timeout=10, verify=False)
        response.raise_for_status()

        im = Image.open(BytesIO(response.content)).convert("RGB")
        canvas_width, canvas_height = 260, 160
        new_image = Image.new("RGB", (canvas_width, canvas_height))
        piece_height = canvas_height // 2

        for i in range(len(Ut)):
            crop_x = Ut[i] % 26 * 12 + 1
            crop_y = piece_height if Ut[i] > 25 else 0
            crop_box = (crop_x, crop_y, crop_x + 10, crop_y + piece_height)
            piece = im.crop(crop_box)

            paste_x = i % 26 * 10
            paste_y = piece_height if i > 25 else 0
            new_image.paste(piece, (paste_x, paste_y))

        img_byte_arr = BytesIO()
        new_image.save(img_byte_arr, format='JPEG', quality=95)
        return img_byte_arr.getvalue()
    except Exception as e:
        return None

这段代码下载图片后,按照Ut数组顺序粘贴块,最终返回可直接用于OCR识别的二进制数据。还原后的图片经过ddddocr库处理即可获取滑动路径坐标。

w参数生成逻辑与轨迹模拟

w值的计算涉及多个变量:h由l和o经过处理后得出,l则是对o进行JSON序列化和随机字符串加密后的结果。u值则基于滑动距离和challenge参数通过特定函数H计算得出。整个过程需要结合时间戳、图片加载信息和用户响应数据构建完整参数。

轨迹生成方面,极验强调模拟人类行为。代码示例中的ease_out_expo函数用于控制速度曲线,先加速后减速,避免被检测为机器操作。以下是完整轨迹生成函数:

def __ease_out_expo(sep):
    if sep == 1:
        return 1
    else:
        return 1 - pow(2, -10 * sep)

def get_slide_track(distance):
    track = []
    t = 0
    while t <= 1:
        progress = __ease_out_expo(t)
        x = int(progress * distance)
        y = int(progress * 5)  # 模拟轻微Y轴偏移
        track.append([x, y, int(t * 1000)])
        t += 0.01
    return track

这些函数结合图像还原结果,可以生成符合极验验证的滑动轨迹。开发者通过调整步长和偏移量,就能让轨迹更接近真实操作。

其他类型验证码的共同点与差异

除了滑块,极验验证码还支持文字点选、图标点选、九宫格和空间推理等类型。这些类型虽形式不同,但整体流程相似,都需要通过挑战参数和加密w值完成验证。九宫格需要拖拽图标匹配顺序,空间推理则涉及3D物体判断。逆向时,可通过修改请求参数类型切换验证码类型。

点选验证码的文字识别可直接用ddddocr,图标点选则需结合坐标映射。空间推理类验证码处理起来相对复杂,需要额外的深度学习模型,但原理仍然是参数加密与轨迹模拟。开发者可以统一封装这些类型的API调用,实现一站式验证。

自动化对接与实战建议

掌握上述原理后,开发者可以结合ddddocr、requests和PIL库构建完整的验证脚本。测试时建议在本地模拟环境运行,避免直接影响生产系统。成功率通常在95%以上,取决于轨迹模拟的真实性。

通过逆向分析,不仅能理解极验验证码的工作机制,还能为类似反爬虫场景提供参考。如果您正面临极验验证码的识别难题,www.ttocr.com提供易盾极验验证码识别技术,包括滑块、点选、无感、九宫格等全类型破解方案和自动化API对接平台,致力于服务公司等业务,提供无缝对接,无需复杂流程,直接调用API实现自动化验证。

这份技术总结帮助你掌握逆向思路,快速上手实现自动化验证。记住,始终在合法范围内测试,并结合实际需求调整参数。这样的实践能让你在处理反爬虫挑战时游刃有余。