乐趣区

关于爬虫:验证码逆向专栏某度滑块点选旋转验证码-v1v2-逆向分析

申明

本文章中所有内容仅供学习交换应用,不用于其余任何目标,不提供残缺代码,抓包内容、敏感网址、数据接口等均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关!

本文章未经许可禁止转载,禁止任何批改后二次流传,擅自应用本文解说的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K 哥爬虫】分割作者立刻删除!

逆向指标

  • 指标:百度滑块验证码、点选验证码、旋转验证码,v1、v2 逆向剖析
  • v1 旋转验证码:

    aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD9haz0zM2M0ODg4NGI3ZGY4M2Q0MjMwZTA3Y2JjZDBkMDdmZCZiYWNrdXJsPWh0dHBzJTNBJTJGJTJGYWlxaWNoYS5iYWlkdS5jb20mdGltZXN0YW1wPTE2MzE0MzQ0MjUmc2lnbmF0dXJlPWM2ODRhODJiNzk4MjAyOTg3NWJmZDhlMGE2NjBiNzdm
  • v2 旋转验证码:

    aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD8mYWs9YzI3YmJjODlhZmNhMDQ2MzY1MGFjOWJkZTY4ZWJlMDY=
  • v2 滑块验证码:

    aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD8mYW1wO2FrPWMyN2JiYzg5YWZjYTA0NjM2NTBhYzliZGU2OGViZTA2
  • v2 点选验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS92Ni9nZXRQYXNz

PS:v1、v2 是作者本人为了辨别而命名的版本号,次要根据是外围 JS 文件分为 mkd.js 和 mkd_v2.js 两个版本,如下图所示:

此外,在界面上也有所区别,v2 版本的旋转、滑块图片有很显著的暗影、线条烦扰,如下图所示:

下面给的地址中,点选验证码的地址有时候是点选,有时候会变成旋转,预计是异样等级不同导致的,此外,风闻还有一种无感验证,不过作者到处找也没找到个地址,预计逻辑都是差不多的,无感验证如下图所示:

抓包剖析

以下以 v1 旋转验证码为例(v2 接口名称不一样,但逻辑是一样的),第一次 viewlog 接口,申请的 ak 是固定值,当然不同场景不同网站是不一样的,callback 回调值,_ 工夫戳,返回值 astk 都是前面会用到的。

而后是一个 getstyle 接口,其中的 tk 就是后面 viewlog 接口返回的,返回值里 backstr 后续参数加密会用到,img 就是旋转图片地址,info 是一些版权信息。

旋转验证码开始验证,此时第二次呈现 viewlog 接口,astk 参数是第一次 viewlog 返回的,fs 参数须要咱们逆向,蕴含了旋转角度等信息,如果旋转角度正确且参数没问题,则返回值里的 op 为 1,另外返回的 dstk 后续还会用到。

上一步验证走完后,并不意味着通过验证了,后续还会有一个 viewlog/c 的接口须要进一步验证,其中的 tkds 参数就是上一步返回的,如果验证失败,返回值 code 为 1,验证胜利,code 则为 0。

逆向剖析 fs

接下来剖析次要加密参数 fs,跟栈到 mkd.js:

能够看到 o 就是 fs,而 o 又是 r.rzData 通过加密后失去的,输入一下 r.rzData,构造如下图所示:

重要参数:

  • ac_c:一看就晓得和旋转的角度无关;
  • backstrgetstyle 接口返回的;
  • cl:x,y 坐标以及工夫戳,量一下就晓得这个坐标是鼠标点击上面那个滑动条按钮的时候的坐标;
  • mv:鼠标轨迹,鼠标动一下就记录一下坐标和工夫戳;
  • cr:屏幕长宽低等信息;
  • 其余值都是空或者 0。

理论测试,clmv 都不校验,写死或者置空都行,当然想要本人伪造一下也是能够的,量一下滑动按钮在屏幕中的地位,cl 依据这个地位随机生成就行了。重点看看 ac_c,间接搜寻即可定位:

能够看到这个值的计算方法为 parseFloat(o / a).toFixed(2)a 是定值 212,实际上就是滑动条可能滑动的最大长度,o 是滑动的间隔,如果咱们辨认进去的是旋转角度 angle,则 ac_c 计算方法如下:

var o = angle * 212 / 360
var ac_c = parseFloat(o / 212).toFixed(2)

// 也能够间接写成:var ac_c = parseFloat(angle / 360).toFixed(2)

r.rzData 搞定后,就只有个 r.encrypt() 办法了,间接跟进去就是咱们相熟的 AES 算法,其中 iv 是 viewlog 接口返回的 as 值加上一个定值 appsapi0,其余就不必多说了。至此加密参数就搞完了,还是非常简单的。

旋转角度辨认

这里举荐一个国外大佬的 RotNet 我的项目,能够用于预测图像的旋转角度以纠正其方向,还有基于此我的项目开发的,Nanda 大佬的 RotateCaptchaBreak、另一个大佬的 rotate-captcha-crack 等,链接如下:

  • https://github.com/d4nst/RotNet
  • https://github.com/chencchen/RotateCaptchaBreak
  • https://github.com/Starry-OvO/rotate-captcha-crack

深度学习大佬能够基于这些我的项目进一步训练,像我这种对这方面无所不通的当然是抉择打码平台了,云码打码还不错,只不过官网只放出了 v1 版本没有暗影烦扰的,找他们客服能够拿到 v2 版本有暗影烦扰的类型,这里就不多说了,省得被认为是打广告了哈哈哈。

v2 版本剖析

v2 版本和 v1 版本基本上差不多,区别在于 rzData 的构造不太一样,ac_c 的计算方法不一样,以及 AES 的 IV 不一样,先看 AES 的 IV,v2 版本是 as 值加上固定值 appsapi2

而后再看看 rzDatacommon 字段下基本上就是 v1 的 rzData 的格局,captchalist 下,至多有 spin-0(旋转)、`puzzle-0(滑块)、click-0(点选)三种,ac_c 仍旧是旋转角度占比、滑动占比以及点选坐标信息,其余的仍旧是写死或者置空就行。

而后就是 ac_c 的计算方法了,首先是旋转验证码,间接搜寻 ac_c

往上跟栈,有个 percent 的中央,一个三目表达式,e 是固定值 290,e - 52 = 238,238 也就是滑动条可能滑动的最大长度:

如果咱们辨认进去的是旋转角度 angle,则 ac_c 计算方法如下:

var distance = angle * 238 / 360
var ac_c = Number((distance / (290 - 52)).toFixed(2))

// 也能够间接写成:var ac_c = Number((angle / 360).toFixed(2))

而对于滑块验证码就有所不同,同样是这个中央的三目表达式,然而要走前面的逻辑:

如果咱们辨认进去的是滑动间隔 distance,则滑块 ac_c 的计算方法如下:

var ac_c = Number((distance / 290).toFixed(2))

同样对于点选验证码来说,也不一样,ac_c 的值是点击的 xy 坐标以及工夫戳:

其余问题

后面咱们说了百度的验证应该有两次,对于第二次验证,也就是 v1 的 viewlog/c 接口,v2 的 cap/c 接口,即使你第一次校验通过了,这个 c 接口校验也有可能不通过,呈现这种状况的起因是通过的工夫太短了,随机 time.sleep 1-3 秒即可,如果工夫太短,c 接口可能会报以下验证谬误:

{'code': 1, 'isRectified': False, 'msg': 'Verification Failed'}

还有一种状况就是提醒 存在平安危险,请再次验证,呈现这种状况你会发现去浏览器手动滑也是一样的,所以在本地加个再次验证的逻辑就行了,一般来说第二次验证就能通过。

{'code': 0, 'msg': 'success', 'data': {'f': {'feedback': 'https://www.baidu.com/passport/ufosubmit.html', 'reason': '存在平安危险,请再次验证'}}}

而后就是申请 header 里没有 Referer 或者 Referer 不正确的话,会报错:

// v1 没有 Referer
{'code': 1, 'msg': 'Unregistered Host'}
// v1 Referer 不正确
{'code': 1, 'msg': 'Invalid Request', 'data': []}
// v2 没有 Referer 或者 Referer 不正确
{'code': 100600, 'msg': 'Unauthorized Host'}

还有一个小技巧,如果你想本人验证一下旋转的角度对不对,怎么去测量这个角度呢?咱们能够借助一些做图软件,简略点儿的比方美图秀秀,新建一个画布,而后间接将验证码图片拖进去,就能够自在旋转了,旋转的时候软件会主动标注出旋转的角度,如下图所示:

后果验证

爬虫工具站

K 哥新上线了一个爬虫工具站,欢送测试:K 哥爬虫工具站

!!!粉丝回馈!!!

为庆贺 K 哥爬虫公众号原创内容破百,粉丝数过万,特举办粉丝回馈流动!

感激快代理对本次流动的大力支持!

流动规定

  1. 关注 K 哥爬虫公众号
  2. 于本文评论区发表评论,摇号抽出侥幸粉丝
  3. 禁止反复评论

流动奖品

一等奖: 快代理包月套餐 + 常识星球 + K 哥爬虫定制马克杯(1 名)

二等奖: 快代理包周套餐 + 常识星球 + K 哥爬虫定制马克杯(3 名)

三等奖: K 哥爬虫定制马克杯(5 名)

四等奖: 现金红包 6.6(10 名)

流动工夫

流动开始工夫:2023 年 7 月 7 日

流动截止工夫:2023 年 7 月 14 日

开奖工夫:2023 年 7 月 17 日

退出移动版