跳转至

验证码底图还原

此文章用于记录验证码中碰到的底图乱序还原的方法,会持续更新此内容。

1. 前言

在验证码的破解中,特别是滑块类型,会遇到接口返回的验证码背景图片链接是乱序的,但是浏览器加载此链接后却又正常显示。 一般是经过了固定算法(目前碰到的都是固定规则的)来还原乱序的图片,并在网页前端正常显示。 本文会介绍各个有此现象的站点的图片还原方式,和解决方法。

2. 底图还原种类

2.1. 极验滑块底图还原

极验的滑块底图为乱序的,底图还原为 canvas 操作实现。

2.1.1. 极验底图还原逻辑调试

  • canvas 断点

在下完 canvas 创建时的事件断点后,触发滑块即可定位到底图处理部分。

image-20220317120152370

由上图可知它图片还原逻辑,把乱序的 52 块图片按照 Ut 数组的顺序重新排序拼接好。这里提供一个 py 还原示例:

当然,网上也有易语言还原版本,用 jsdom 还原的也有,自己去搜吧。

def img_recover():
    for o in glob.glob('*.jpg'):
        img = Image.open(o)
        serilize = [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]
        target = Image.new('RGB', (260, 160))
        for i in range(52):
            u = serilize[i] % 26 * 12 + 1
            c = 80 if 25 < serilize[i] else 0
            box = (u, c, u + 10, c + 80)
            region = img.crop(box)
            b = 80 if 25 < i else 0
            target.paste(region, (i % 26 * 10, b))
        target.save(os.path.splitext(o)[0] + '.png')
        os.remove(o)

注:底图还原等对图片处理时尽量改为对 bytes 操作,而不是直接操作文件,完全可以规避多线程下对同名文件的读写问题。

顶象滑块底图还原也可同样方法定位。

2.2. 完美滑块底图还原

完美滑块是根据 background-positioncss 样式来还原的

这里放上一个网上搜索到的同类型示例,解释非常详细,不再画蛇添足了,转过去看吧:background-position 重组验证码图片

评论

回到页面顶部