声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

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

逆向目标

  • 目标:百度滑块验证码、点选验证码、旋转验证码,v1、v2 逆向分析
  • v1 旋转验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD9haz0zM2M0ODg4NGI3ZGY4M2Q0MjMwZTA3Y2JjZDBkMDdmZCZiYWNrdXJsPWh0dHBzJTNBJTJGJTJGYWlxaWNoYS5iYWlkdS5jb20mdGltZXN0YW1wPTE2MzE0MzQ0MjUmc2lnbmF0dXJlPWM2ODRhODJiNzk4MjAyOTg3NWJmZDhlMGE2NjBiNzdm
  • v2 旋转验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD8mYWs9YzI3YmJjODlhZmNhMDQ2MzY1MGFjOWJkZTY4ZWJlMDY=
  • v2 滑块验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD8mYW1wO2FrPWMyN2JiYzg5YWZjYTA0NjM2NTBhYzliZGU2OGViZTA2
  • v2 点选验证码:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS92Ni9nZXRQYXNz

PS:v1、v2 是作者自己为了区分而命名的版本号,主要依据是核心 JS 文件分为 mkd.js 和 mkd_v2.js 两个版本,如下图所示:

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

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

抓包分析

viewlogakcallback_astk

getstyletkviewlogbackstrimginfo

viewlogastkviewlogfsopdstk

viewlog/ctkdscodecode

逆向分析 fs

fs

ofsor.rzDatar.rzData

重要参数:

ac_cbackstrgetstyleclmvcr
clmvclac_c

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

// 也可以直接写成:
var ac_c = parseFloat(angle / 360).toFixed(2)
r.rzDatar.encrypt()viewlogappsapi0

旋转角度识别

这里推荐一个国外大佬的 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 版本分析

rzDataac_cappsapi2

rzDatacommonrzDatacaptchalistspin-0(滑块)、(点选)三种,

ac_cac_c

e - 52 = 238

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

// 也可以直接写成:
var ac_c = Number((angle / 360).toFixed(2))

而对于滑块验证码就有所不同,同样是这个地方的三目表达式,但是要走后面的逻辑:

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

其他问题

viewlog/ccap/ctime.sleep
{"code": 1, "isRectified": False, "msg": "Verification Failed"}
存在安全风险,请再次验证
{"code": 0, "msg": "success", "data": {"f": {"feedback": "https://www.baidu.com/passport/ufosubmit.html", "reason": "存在安全风险,请再次验证"}}}
RefererReferer
// 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名)

活动时间