科百科
当前位置: 首页 科技资讯

此插件可自动识别验证码并跳过(滑动验证码竟然能这样破解)

时间:2023-06-04 作者: 小编 阅读量: 1 栏目名: 科技资讯

奇技指南现在的人工智能过于强大,大部分扭曲的图形验证码都可以被机器破解,而且图形验证码体验很差,输入困难。而滑动验证码操作简便,破解难度大,很快就流行起来了。本文由chunpu在奇舞周刊投稿,转载请注明出处。低估,完全的低估!拼图吻合只是必要条件,破解的基础门槛真正的难点是拖动过程中的滑动轨迹!模仿人类滑动我们再次想到了西部世界二,最后的彩蛋威廉在世外山谷绝望的问艾米莉威廉:Verifywhat?

奇技指南

现在的人工智能过于强大, 大部分扭曲的图形验证码都可以被机器破解, 而且图形验证码体验很差, 输入困难。而滑动验证码操作简便, 破解难度大, 很快就流行起来了。今天来讲讲滑动验证码的破解办法。

本文由 chunpu 在奇舞周刊投稿,转载请注明出处。

最近西部世界第二季很火, 小编经常分不清谁是机器人谁是真人

为了区分人类和机器, 有个人发明了一种测试, 他叫图灵~

验证码就是一个典型的图灵测试, 英文名 captcha, 全称如下

Completely Automated Public Turing test to tell Computers and Humans Apart

全自动区分计算机和人类的图灵测试

目前主流的验证码有

  • 图形验证码
  • 短信验证码
  • 滑块验证码
  • 图中点选验证码

但现在的人工智能过于强大, 大部分扭曲的图形验证码都可以被机器破解, 已经不再是一个可靠的图灵测试

而且图形验证码体验很差, 输入困难

这时候, 滑动验证码出现了, 最具代表性的就是 Geetest(极验)

滑动验证码对机器破解有两大难点, 第一个是需要通过图像识别知道滑到哪里, 第二个是需要模仿人类做出滑动的手势

滑动验证码 操作简便, 破解难度大, 很快就流行起来了

WebDriver 标准

正好 W3C 近日发布了一个浏览器自动化操作的标准, 名叫 Webdriver

https://www.w3.org/TR/webdriver1/

小编就拿极验滑动验证码开刀, 和大家一起感受 WebDriver 的强大功能

先附上小编成果(本视频20秒, 没有声音):https://v.qq.com/x/page/y0715zqcz7f.html

安装 WebDriver

WebDriver 已经是既定标准, 各大浏览器最新版都天然支持 WebDriver 协议, 使用门槛大大降低

小编本次使用的是支持度较好的浏览器 firefox

从 https://github.com/mozilla/geckodriver 官方仓库中即可下载 firefox 的 diver

使用 selenium-webdriver

WebDriver 标准本身只是定义了一系列操作浏览器的 HTTP 协议, 但 selenium 已经为我们封装成了 sdk, 直接调用函数即可

const webdriver = require('selenium-webdriver')

打开极验demo页面

我们先用 WebDriver 实现一个最简单的例子: 打开一个网页

const webdriver = require('selenium-webdriver')

!async function() {

// 新建一个 firefox 的 driver 实例

let driver = await new webdriver.Builder().forBrowser('firefox').build()

// 访问极验demo页

await driver.get('http://www.geetest.com/type/')

console.log('success')

}()

运行这段代码, 我们能看到浏览器打开了极验的 demo 页

此时浏览器的地址栏是黄色的, 表示该浏览器被控制了, 就好像电视剧里面被心灵控制的人眼睛是红色的

选择滑动行为验证

极验第一个标签是智能组合验证, 第二个标签才是我们要破解的滑动验证, 因此需要先切换至滑动验证

我们通过 css 选择器选出要点击的标签, 然后使用 WebDriver 点击这个元素

await driver.findElement(webdriver.By.css('.products-content li:nth-child(2)')).click()

点击验证按钮

来到了滑动行为验证区域, 接下来就要点击验证按钮, 同样也是先用 CSS 选择器选出按钮, 然后再点击

await driver.findElement(webdriver.By.css('.geetest_radar_tip')).click()

区域截图

到这一步, 滑动验证码已经弹出

我们碰到了破解过程中的第一个难点, 图像识别

要知道拼图需要滑动到哪里, 先要知道完整图片以及缺一块的图片, 放一起对比, 才能知道滑块需要滑动到哪里

WebDriver 提供了两种截图方式, 一种是全屏截图, 一种是元素截图

这里我们仅需要获取拼图缺失的背景图, 因此使用元素截图

// 隐藏原图再截图

await driver.executeScript(`document.querySelector('.geetest_canvas_fullbg').style.display = 'none'`)

// 找到验证码背景图元素, 是一个 canvas

const bgCanvas = await driver.findElement(webdriver.By.css('.geetest_canvas_bg'))

// 获得一个 base64 格式的 png 截图

const bgPng = await bgCanvas.takeScreenshot()

找到滑动点

小编并不懂图像识别, 为了降低实现难度, 用了一个简单取巧的方法

因为拼图缺失的区域会有 阴影, 而阴影一般比较黑

因此我们把题目从 寻找拼图丢失区 改成了 寻找比较黑的点

当然这个草率的规则正确率并不高, 但为了demo演示已经足够了

那怎么定义 比较黑 呢? 最简单的方法就是挨个读取图像中的像素

我们把 R, G, B 三值相加, 数字越小就认为越黑, 最黑的 rgb(0, 0, 0) 就是0

附上小编用的读取像素库 get-pixels

开始滑动

滑动操作使用了 WebDriver 中的 actions api, 可以完成一系列操作, 比如键盘输入, 鼠标移动, 点击等

// 获取拼图滑块按钮

const button = await driver.findElement(webdriver.By.css('.geetest_slider_button'))

// 获取按钮位置等信息

const buttonRect = await button.getRect()

// 初始化 action

let actions = driver.actions({async: true})

// 把鼠标移动到滑块上, 然后点击

actions = actions.move({

x: x10,

y: y10,

duration: 100

}).press()

// 花一秒钟把滑块拖动至拼图缺失区, 松开鼠标

await actions.move({

x: x10point.x - 5,

y: y10,

duration: 1000

}).release().perform()

写完代码, 执行, 看着拼图顺畅的向前滑动, 等待着奇迹的发生

然而奇迹并没有发生, 只有一行黄字映入眼帘

怪物吃了拼图, 请3秒后重试

重复好多次, 我们发现

即便完全吻合, 也无法绕过极验的认证!

低估, 完全的低估!

拼图吻合只是必要条件, 破解的基础门槛

真正的难点是拖动过程中的 滑动轨迹!

模仿人类滑动

我们再次想到了西部世界二, 最后的彩蛋威廉在世外山谷绝望的问艾米莉

威廉: Verify what?

艾米莉: Fidelity

Fidelity, 真实度

破解到了这一步, 能否模仿人类的滑动轨迹成了关键

我们反复不断的调教滑动代码, again and again

小编进行了多次尝试, 比如把 move action 分成多段, 按照不同的速度进行拖动, 甚至加入各种随机数, 但始终无法通过极验的轨迹检查

最后小编仿照微信随机红包的方式, 先把要滑动的距离切成几十份, 并且允许有负数

人在滑动拼图的时候很容易出现, 滑过了再滑动回去的场景, 因此负数可以增加 Fidelity

const count = 30 // 小编分成30步进行滑动

const steps = getSteps(distance, count)

const totalDuration = 8000 // 一共耗时8秒, 慢才能充实轨迹~

_.reduce(steps, (actions, step) => {

return actions.move({

x: x10step,

y: y10_.random(-5, 40), // 加上y轴随机数

duration: parseInt(_.random(totalDuration / count / 2, totalDuration / count * 2)) // 加上时长随机数

})

}, actions)

// 随机拆成n份

function getRandomDistribution(total, count) {

let item = total / count

item = item_.random(-item * 2, item * 3)

item = parseInt(item)

if (count === 1) {

return [total]

} else {

return [item].concat(getRandomDistribution(total - item, count - 1))

}

}

// 获取每次滑动的X坐标

function getSteps(total, count) {

let distribution = getRandomDistribution(total, count)

return _.map(distribution, (item, i) => {

return _.sum(distribution.slice(0, i1))

})

}

保存, 执行

小编放下鼠标, 端起桌上的马克杯, 看着 WebDriver 再次控制浏览器

打开网页, 点击按钮, 拖动滑块, 滑块曲折前行...

摩擦摩擦, 似魔鬼的步伐, 似老奶奶颤巍巍的手

终于, 极验显示出一个清爽绿色的横幅, 仿佛在向我们招手: 欢迎你, 人类

,
    推荐阅读
  • 2022年属虎人的运程(2022年属虎人的运程如何)

    2022年属虎人的运程?下面希望有你要的答案,我们一起来看看吧!属虎人的能力越强在这一年里就越要小心谨慎些,低估别人的实力容易吃亏,高估了自己的实力会出糗,稳定自己的情绪,保持平常心的状态去面对生活里发生的一切,这样才能够减少意外和麻烦的出现,也可以避开小人的纠缠。

  • 猕猴桃的营养价值(猕猴桃的营养价值是什么)

    猕猴桃的营养价值它含有亮氨酸、苯丙氨酸、异亮氨酸、酪氨酸、丙氨酸等十多种氨基酸,以及丰富的矿物质,包括丰富的钙、磷、铁,还含有胡萝卜素和多种维生素。猕猴桃对保持人体健康,防病治病具有重要的作用。多食用猕猴桃可以预防老年骨质疏松,抑制胆固醇的沉积,从而防治动脉硬化,还可改善心肌功能,防治心脏病等,也能对抗癌起到一点儿作用。多食用猕猴桃,还能阻止体内产生过多的过氧化物,防止老年斑的形成,延缓人体衰老。

  • 守护雷霆劫怎么玩(教你玩守护雷霆劫的简单方法)

    守护雷霆劫怎么玩阵容构成。2秘术,3召唤,2守护,4雷霆.看具体情况,若没有4雷霆,3雷霆也是可以的。掘墓,劫,奥恩,索拉卡,安妮,娜美,宝石,雷霆拉克丝。若没有雷霆拉克丝,可用狗熊换成3雷霆也很猛。前期需平稳过度,可用极地掠食或者森林德鲁伊等强势阵容,中期较为乏力,存钱利息升人口或变换中期强势阵容。

  • 气溶胶传播后能开窗吗(什么是气溶胶传播)

    通过流行病学调查显示,病例多可以追踪到与确诊的病例有过近距离密切接触的情况,这符合飞沫传播和接触传播的特征。但目前尚没有证据显示新型冠状病毒通过气溶胶传播。有的网友还问,空气中是否有新型冠状病毒?从这个角度讲,在日常通风环境下,空气中一般不会有新型冠状病毒。对于防护措施,一般的工作生活条件下,采取正确佩戴口罩这种飞沫传播防护措施,足以保护普通公众不被感染。

  • 燕窝简介(燕窝相关简介)

    燕窝简介燕窝是雨燕科几种金丝燕分泌的唾液及其绒羽混合粘结所筑成的巢穴。主产于马来西亚、印度尼西亚、泰国和缅甸等东南亚国家及我国的福建和广东沿海地带。燕窝中的主要营养成分是蛋白质,其中有1种必需氨基酸(赖氨酸),3种条件性必需氨基酸,而人体需要的必需氨基酸有8种,条件性必需氨基酸有13种。

  • 蛋奶球的做法(制作蛋奶球的方法详解)

    下面希望有你要的答案,我们一起来看看吧!蛋奶球的做法将除蔓越莓干以外的材料混合均匀放微波炉里加热2分钟,再加热一会儿。弄碎后再碾的细腻一点,取适量放在保鲜膜上。再放上一块,收起保鲜膜,手掐住封口。放在椰蓉里打个滚。做好了,香甜可口。

  • 一般高血压患者可以喝什么茶(高血压患者能喝茶吗)

    广州中医药大学第一附属医院心血管内科主任吴辉教授指出,茶叶中含有茶多酚,具有增强血管弹性的作用。它能降低血液中胆固醇、甘油三酯及低密度脂蛋白,还能降低胆固醇与磷脂的比例,从而达到了预防及治疗动脉硬化的目的。吴辉教授认为,绿茶和菊花茶同时饮用也可以起到辅助降压的效果。这样也可以起到降低血压,预防动脉硬化的作用。

  • 自然堂产品有假的吗(自然堂发布澄清声明)

    通告也指出,经生产(代理)企业所在地食品药品监管部门现场核查,伽蓝集团否认该产品为企业所生产(代理)。同时,也表明伽蓝集团将持续配合相关监管和执法部门加大打假力度,全力维护消费者合法权益。一直以来,伽蓝集团始终严格把控产品质量,遵守国家相关法律法规,目前官方授权销售的所有产品,消费者均可以放心使用。

  • 突围付长明和皮丹签合同(突围皮丹结局取代齐本安)

    因为这样,皮丹不能担负责任,别人行贿时,他会觉得这种事就是理所当然。这很大程度上,是因为程端阳的纵容。多年后,煤炭,矿业资源过剩,京州能源成为公司的负增长企业。齐本安在京州的一番作为,惹怒了很多人,更重要的是惹怒了林满江,动了林满江的蛋糕,让林满江对他产生严重的不满。

  • 包价旅游和旅游包价的区别(看完这篇你就明白了)

    旅游包价在全包价基础上,扣除午、晚餐费用的包价形式,其目的在于降低产品的直观价格,提高产品的竞争能力,同时也可更好地满足游客在用餐方面的要求,两者区别一目了然。包价旅游是指旅游者在旅游活动中开始前即将全部或部分旅游费用预付给旅行社,由旅行社根据同旅游者签订的合同,相应地为旅游者安排旅游途中的吃、住、行、游、购、娱等活动。