EAMS 滑动拼图验证码破解原理

验证码机制

EAMS 使用的是 AJ-Captcha 风格的滑动拼图验证码:

  • 服务端返回两张 Base64 图片:
  • 背景图(380×170,有缺口)
  • 拼图块(60×170,RGBA 带透明通道)
  • 用户需要把拼图块水平滑动到缺口位置
  • 服务端验证 point.x 坐标是否正确

核心算法:拼图轮廓模板匹配 + 像素差异

我用纯 JS(无任何图像库依赖)实现了 PNG 解码和缺口定位,关键分两步:


策略 A — 轮廓模板匹配(权重 60%)

  • 从拼图块的 alpha 通道提取出拼图的不规则边界轮廓
    (左边界和右边界每行的 x 坐标)
  • 对背景图计算边缘图(相邻像素灰度差)
  • 将拼图轮廓当作“模板”,在背景图上水平滑动
  • 对每个候选偏移量,累加背景边缘图上对应轮廓位置的边缘强度
  • 边缘强度最高的偏移量就是缺口位置
    → 因为缺口的边缘恰好吻合拼图块的锯齿形状

策略 B — 像素差异(权重 40%)

  • 对每个候选偏移量,计算拼图块 RGB 与背景图对应区域 RGB 的均方差(SSD)
  • 缺口区域的背景被服务端做了暗化 / 模糊处理
  • 因此差异最大的位置就是缺口

最终定位

综合得分 = normalize(轮廓分) × 0.6 + normalize(差异分) × 0.4

  • 取综合得分最高的偏移量
  • 经过平滑后作为 point.x 提交

为什么前两版失败了

版本 方法 失败原因
v1 按列累加边缘能量 自然图像中的纹理边缘远强于缺口边缘,被噪声淹没
v2 多策略边缘连续性 + 成对边缘检测 同样被自然边缘干扰,没有利用拼图形状信息
v3 ✅ 用拼图自身的不规则轮廓作为模板去匹配背景边缘 只有缺口位置的边缘能精确吻合拼图的锯齿形状,天然抗噪声

关键洞察

拼图块的 alpha 通道本身就是最好的“钥匙”——
它精确定义了缺口的不规则形状。

用这个形状去背景图上找匹配,比任何通用边缘检测都更准确。


实测效果

  • 首次尝试成功率约:50% - 70%
  • 配合最多 3 次重试:基本能稳定通过