文章目录

前言逆向分析对于w参数还原逻辑的py分析对于w参数还原部分的js分析

前言

原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 本文关联文章超链接: JS逆向—极验三代系列详解-最全流程(一)分析接口,底图还原部分

JS逆向—极验三代系列详解-最全流程(二)分析JS, w值参数生成-RSA算法部分 JS逆向—极验三代系列详解-最全流程(三)分析JS, w值参数生成值最终值 后续更新

滑块验证码是我们在互联网上经常遇见的校验是否人类操作行为的一种检测方式,大概流程就是生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以及坐标等信息到后台进行校验。只要用户移动的距离符合,以及移动的轨迹行为检测通过即可视为验证通过。

而大部分开发者做爬虫时经常需要绕过该此类验证码进行下一步的爬虫,本文仅对极验geetest平台下的滑块验证码的图片还原进行分析与研究,试图找到打乱图片到正常图片之间的还原函数以及解析它还原算法的原理。

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除,请各位自觉遵守相关法律法规。

逆向分析

目标:https://www.geetest.com/demo/slide-float.html(仅使用官方demo案例学习交流)逆向参数:gt,challenge,w,callback四个值比较可疑 + 底图还原

对于w参数还原逻辑的py分析

对于底图还原部分,我们先挨个分析其接口以及网站发的包,看一下每一部分的具体逻辑,具体逻辑如下:

接口:https://www.geetest.com/demo/gt/register-slide?t=1703038233004

携带载荷-时间戳

返回challenge值,gt值

challenge: "9196fd975b68171924c9e9c4bdda70cb"

gt: "019924a82c70bb123aae90d483087f94"

new_captcha: true

success: 1

进行滑动-接口:https://api.geetest.com/ajax.php

携带载荷-gt,challenge,w,callback四个值比较可疑

gt: 019924a82c70bb123aae90d483087f94

challenge: 9196fd975b68171924c9e9c4bdda70cb8z

callback: geetest_1703038349899

1. 分析接口

直接先进行刷新

接口:register-slide

载荷-携带时间戳

返回---challenge值, gt值

challenge: "790fc0592dc8a9ebb2c6ca3f3c9774a8"

gt: "019924a82c70bb123aae90d483087f94"

接口:gettype.php

载荷-携带gt值(由register-slide接口可得), callback值(geetest_ + 时间戳)

返回---一些js文件

接口:get.php

载荷-携带gt值, challenge值(都由register-slide接口可得),w1值(加密值,推测可能为环境校验), callback值(geetest_ + 时间戳)

返回---c数组(一个9位数组), 一些响应提示语

点击按钮进行验证

接口:ajax.php

载荷-携带gt值, challenge值(都由register-slide接口可得),w2值(加密值,推测可能为环境校验), callback值(geetest_ + 时间戳)

返回---result: "slide"

status: "success"

接口:slide.7.9.2.js

一个js文件,推测可能是进实现行底图分割的js文件

接口:get.php

载荷-携带gt值, challenge值(都由register-slide接口可得), type值(推测为版本号), callback值(geetest_ + 时间戳)

返回---c数组(一个9位数组),

改变后的challenge值(就在响应里面)

challenge: 790fc0592dc8a9ebb2c6ca3f3c9774a8hb

响应提示语,

图片信息也在这一部分返回,包括bg: 背景缺口图(乱序),fullbg: 背景图(乱序),slice: 缺口图

接口:refresh.php

载荷-携带gt值, 改变后的challenge值(由get.php接口可得), callback值(geetest_ + 时间戳)

返回---challenge值(再次改变)

challenge: 790fc0592dc8a9ebb2c6ca3f3c9774a8c4

拖动滑块完成拼图

接口:ajax.php

载荷-携带gt值, challenge值(由refresh.php接口可得),w3值(加密值,推测可能为环境校验), callback值(geetest_ + 时间戳)

返回---validate: "7a30f499241dfa139a3a5d6c5d04a5d5"(也就是我们最终所需要的值)

接口分析完毕

开始对滑块的JS逆向进行调试

由以上接口分析,进行观察分析调试的过程中需要做什么

1.理解并获取到三次变换的challenge值

2.找到并分析背景缺口图(乱序),背景图(乱序),还原的代码

3.找到并分析w值是如何生成

对于w参数还原部分的js分析

续接上文,已经分析出来了u的值,那我们继续对该部分进行分析,接下来需要分析h的值,但h的值有需要l,所以先分析l的值,打下断点,对该位置进行分析,r$_CAIAK(744)是随机数,跟上一篇的随机数逻辑相同(二者要保持相同才行),接下来分析o的值是怎样生成的 对比下o的多个刷新值,不要忘记本心,我们是要将o的值进行逆向,看看o的值哪个是可以固定的,哪些是需要进行替换的,综上所述分析,基本上值为以下几点

userresponse:滑动距离 + challenge 的值passtime:滑块滑动时间—>为滑动结束时间 - 开始时间imgload:图片加载时间aa:轨迹加密ep-tm:window[“performance”][“timing”] 相关mocq:每天 key、value 会变rp:gt + 32 位 challenge + passtime,再经过 MD5 加密 往上翻一下就找到了o的位置,对该位置打下断点进行挨个分析 太乱了看着,解混淆后效果如下 所以我们挨个分析一下userresponse, aa, ep怎么来的,userresponse直接将H方法扣下来即可, aa的值我选择跟栈分析,发现 l 即为aa的生成位置,分析该位置 挨个解混淆分析一下

然后分析这一部分,相当于传入了三个值,后俩个值看了一下,c,s,是一个很明显的值,对比一下前面这两个值是哪个接口获取到的,到时候py文件中获取到直接传入即可 然后进行前两个的分析,直接进去,发现前两个都包含在W中 把W拿下来,放到node中,然后对其进行进行改写和替换,输出进行测试 返回ct未定义,如上,再在网页端将ct全拿下来放进去 发现其实已经跑通了,将轨迹和c,s使用当前的先固定一下,然后对其网页端和自己扣的代码进行对比一下看看是否一致 由此,可解决aa的值已解决,接下来分析rp的值,因为前两个,ep和h9s9是可以暂时固定的,回到原来的位置,发现走到这里时候rp的值就已经生成,上下看一下,细心一点,即可确定rp的位置,位置如下: 想要获得rp的值,解混淆一下,o[‘rp’] = X(i[‘gt’] + i[‘challenge’][‘slice’](0, 32) + o[‘passtime’]),gt, challenge值是前面get.php端口响应得到,所以我们对X方法进行分析即可,先简单看一下,可能是一个加密算法,然后在细节看一下该部分长度为32位,推测可能为MD5加密算法,反正不管怎么样,先跟进去看一下,当然你也可以选择全扣下来,直接将替换下混淆的,也没问题,我是直接替换的X方法,然后自己再用变量测试一下,看看对不对,这里是 MD5 加密,也可以直接通过引库复现 现在剩下的就是ep-tm参数了,顺着刚才o的值的位置,下面一点就是ep的生成位置,打下断点,一步一步跟进去 跟进去,发现是在这一步进行生成值返回 至此,o的值已全部分析完毕,所以我们的l参数也解决了,接下来回归主线任务,解决h加密情况即可

跟进去,然后往上看,将m全扣下来

结果

写在最后: 本人写作水平有限,如有讲解不到位或者讲解错误的地方,还请各位大佬在评论区多多指教,共同进步.如有需要代码和讲解交流,可以加本人微信18847868809

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。