【验证码系列】极验4:滑块拼图验证(全网最详细逆向分析)


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

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


测试网址:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v

1. 请求验证码接口

  • 接口地址:aHR0cHM6Ly9nY2FwdGNoYTQuZ2VldGVzdC5jb20vbG9hZA==
  • 请求参数分析
{
    "callback": "geetest_1756178706683",				# geetest_时间戳
    "captcha_id": "54088bb07d2df3c46b79f80300bxxxxx",	# 固定值
    "client_type": "web",								# 固定值
    "risk_type": "slide",								# 固定值
    "lang": "zh"										# 固定值
}

2. 验证接口

  • 接口地址:aHR0cHM6Ly9nY2FwdGNoYTQuZ2VldGVzdC5jb20vdmVyaWZ5
  • 请求参数分析
{
    "callback": "geetest_1756180690907",					# geetest_时间戳
    "captcha_id": "54088bb07d2df3c46b79f80300b0abbe",		# 固定值
    "client_type": "web",									# 固定值
    "lot_number": "db591507aa36437dabc3f6ba18042f26",		# 来自验证码接口lot_number
    "risk_type": "slide",									# 固定值
    "payload": "AgFD8gWUUuHFx-XvpP7J2dmdjKck...",			# 来自验证码接口payload
    "process_token": "dbcc1392a83e08d99429a7...",			# 来自验证码接口process_token
    "payload_protocol": "1",								# 固定值
    "pt": "1",												# 固定值
    "w": "84dfd37bf382ad5d88ba3bce998c5cb6c..."				# 逆向值*****
}

2.1 w值逆向分析

在这里插入图片描述

  • w生成位置:_ᕸᖆᖚᕿ = (0, _ᖆᖚᕾᕺ[_ᕸᕺᖂᖗ(183)])(_ᕸᕿᖂᖁ[_ᕸᕺᖂᖗ(183)][_ᕸᕺᖂᖗ(527)](_ᕸᖆᖚᕿ), _ᖆᕸᕶᖁ)
  • 参数1_ᕸᕿᖂᖁ[_ᕸᕺᖂᖗ(183)][_ᕸᕺᖂᖗ(527)](_ᕸᖆᖚᕿ):滑块滑动的一些信息(命名为input_data)
    在这里插入图片描述
  • 参数2_ᖆᕸᕶᖁ:是一个不知道什么的对象
  • 进入方法_ᖆᖚᕾᕺ[_ᕸᕺᖂᖗ(183)]内部继续分析
    在这里插入图片描述
    • w最终生成位置:(0, _ᕹᕾᕶᖙ[_ᖗᖗᖘᕾ(142)])(_ᕸᖆᖚᕿ) + r

2.2 r值逆向分析

  • 生成位置:_ᖙᕴᕾᕶ[_ᖆᕸᕶᖁ][_ᕺᖂᖃᕿ(905)][_ᖗᖗᖘᕾ(990)](_ᖂᕺᕸᖂ)
  • 参数_ᖂᕺᕸᖂ6023547f2e312572,是一个随机字符串,生成位置:_ᖂᕺᕸᖂ = (0, _ᕹᕾᕶᖙ[_ᖗᖗᖘᕾ(192)])()
  • 命名获取随机数的函数为get_random_string,后面还会用到,内部很简单,自行还原
    在这里插入图片描述
  • 重点是加密方法_ᖙᕴᕾᕶ[_ᖆᕸᕶᖁ][_ᕺᖂᖃᕿ(905)][_ᖗᖗᖘᕾ(990)],可以发现是调用了上面一个对象中的方法
    在这里插入图片描述
  • 查看方法,观察记住这个特征65537setPublic,是RSA 加密的特征,跟一下new _ᖆᖆᖘᕴ[_ᖗᖗᖘᕾ(183)]实例化过程,可以找到setPublic设置公钥所需要的模数和指数,自行还原加密算法
    在这里插入图片描述
    在这里插入图片描述

2.3 _ᕸᖆᖚᕿ值逆向分析(命名为u)

  • 生成位置:_ᕸᖆᖚᕿ = _ᖙᕴᕾᕶ[_ᖆᕸᕶᖁ][_ᕺᖂᖃᕿ(980)][_ᕺᖂᖃᕿ(990)](_ᕸᖆᖚᕿ, _ᖂᕺᕸᖂ)
  • 参数分析:可以注意到两个参数分别就是传入的滑块滑动的一些信息随机字符串(注意这个随机字符串要和前面生成r值的保持一致)
    在这里插入图片描述
  • 加密方法:_ᖙᕴᕾᕶ[_ᖆᕸᕶᖁ][_ᕺᖂᖃᕿ(980)][_ᕺᖂᖃᕿ(990)],结合iv特征为 ‘0000000000000000’(16 字节),确定为AES加密,自行还原加密算法
    在这里插入图片描述
  • 最终u值经过_ᕹᕾᕶᖙ[_ᖗᖗᖘᕾ(142)]方法处理后+r得到w值,实际上就是AES加密得到数组结果又处理成字符串进行拼接,我们可以在加密时就以字符串形式返回

2.4 滑块信息逆向分析

  • 分析结果如下,可以自行刷新几遍对比
  • input_data就是以下对象转为字符串
{
    "setLeft": 30,                                          // 滑动距离,ocr检测结果
    "passtime": 246,                                        // 滑动耗时,随机生成
    "userresponse": 31.822654613896034,                     // 逆向值
    "device_id": "",                                        // 固定值
    "lot_number": "c8c8a63868734df5954f4a726734ff3f",       // 来自验证码接口lot_number
    "pow_msg": "1|8|sha256|2025-08-27T15:58:59.125591+08:00|54088bb07d2df3c46b79f80300b0abbe|c8c8a63868734df5954f4a726734ff3f||75cfc66f85f8cb1f",   // 逆向值
    "pow_sign": "00b4a64e671cd76c38d32fdbb54705166ff54971abbcc746e31e99e689f82d7e",                                                               // 逆向值
    "geetest": "captcha",                                   // 固定值
    "lang": "zh",                                           // 固定值
    "ep": "123",                                            // 固定值
    "biht": "1426265548",                                   // 固定值
    "gee_guard": {
        "roe": {
            "aup": "3",
            "sep": "3",
            "egp": "3",
            "auh": "3",
            "rew": "3",
            "snh": "3",
            "res": "3",
            "cdc": "3"
        }
    },                                                      // 固定值
    "W4Ec": "7RXi",                                         // 逆向值
    "a726": {
        "868734df": {
            "734df4a7": "34ff"
        }
    },                                                      // 逆向值
    "em": {
        "ph": 0,
        "cp": 0,
        "ek": "11",
        "wd": 1,
        "nt": 0,
        "si": 0,
        "sc": 0
    }                                                       // 固定值
}

2.5 userresponse值逆向分析

  • 自行调试,结论就是除以一个固定值+2
    在这里插入图片描述

2.6 pow_msg值逆向分析

  • 前部分的值均来自验证码接口返回值或者固定值,重点在于最后一个拼接的16位随机字符串,这里获取方式同前面的get_random_string,不过重点来了,这里并不是生成随机字符串拼接后直接就返回了,而是在拼接后进行了校验,不符合校验规则需要重新拼接如此反复,直至符合规则返回数据。这里自行重点分析,代码简单自行还原!!!
    在这里插入图片描述

2.7 pow_sign值逆向分析

  • 这里同上pow_msg一起返回数据

2.8 "W4Ec": "7RXi""a726":{"868734df":{"734df4a7":"34ff"}}值逆向分析

  • 参数1:这里我们反复调试后,第一个键值对看似是固定值,实则搜索全局发现这个固定值来自于此js文件,而这个js文件是动态的,是不过更新频率比较低。
  • 获取方法:验证码接口返回了js代码的地址,获取文件后可以在执行js代码后打印值,从控制台获取这个键值对。
    在这里插入图片描述
    在这里插入图片描述
  • 参数2:跟栈调试我们可以在w值的生成前找到第二个键值对的生成位置,最后的结果是将i值和o值组成一个嵌套的数据,进入方法内部分析可以发现这个键值对是对验证码接口返回的lot_number值进行切割得到的数字,而切割规则同样依赖于js文件
  • 获取方法:同上获取到切割规则,然后自行拼接为嵌套对象。

在这里插入图片描述

3. 滑动距离识别

  • 自行使用ocr识别,推荐使用:https://pypi.org/project/ddddocr/

4. 结果展示

本文章已经将此案例所有注意的细节全部讲解,但具体实现过程未提供,希望各位小伙伴多多动手实操起来吧!
在这里插入图片描述


感谢您的阅读与支持,如果这篇文章对您有帮助,请关注点赞收藏,您的支持是我创作的动力!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇事不決洛必達

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值