声明本文所有内容仅供学习交流,不作任何其他用途,不提供完整代码,抓图内容,敏感网址,数据接口已经脱敏,严禁用于商业和非法用途,否则由此产生的一切后果与作者无关!本文未经许可禁止转载,修改后禁止二次传播。对于因未经授权使用本文所解释的技术而导致的任何事故,作者概不负责。如有侵权,请第一时间联系作者公众号【K爬虫哥】删除!反向目标target:滑动验证码点击某片验证码反向首页:aHR0cHM6Ly93d3cueXVucGlhbi5jb20vcHJvZHVjdC9jYXB0Y2hh包解析验证码图片获取接口,GET请求,包括四个参数:cb,i,k,captchaId,有时可能还有token参数,因为不是第一次加载图片,比如刷新图片,会带上之前接口的token值。界面返回,如果是滑动验证码,那么bg是背景图,front是滑动条图,还有一个token值,后面会用到。如果点击验证码,那么captchaImage就是基础图片,wordsImage就是需要点击的文字,还有一个token值,后面会用到。验证接口包含五个参数:cb、i、k、token、captchaId,其中token是获取验证码接口返回的。图片接口逆向分析下面看一下获取验证码图片的接口。全局搜索关键字captchaId可以定位到key为jsonpRequest的地方。下图中的t是完整的接口URL:一一查找,首先看captchaId其实就是this.APP_ID。多次刷新后,你会发现对于slider,它是一个固定值974cd565f11545b6a5006d10dc324281,对于一个click,它是一个固定值e1e7be036f9242c7aed023438af66f46。这两个值硬编码在一个JS中。如下图所示:往上看,不用说HOSTS是固定值了。cb是r,i是a.i,k是a.k。它们是通过concat()方法连接起来的,所以只需要得到r和a的值就可以了,如下图:a的值是通过encrypt(e)得到的,e中包含fp,address,yp_riddler_id等值,如下图:先看encrypt方法,最后返回i和k,再看熟悉的iv,parse,好像是AES,DES等,试试看,或者跟进lt.a.encrypt()看它的源码,和标准算法中的源码对比,可以发现是AES,k很明显,RSA加密,还有公钥可以在搜索中找到。然后最上面有个yp_riddler_id,好像是从cookie里拿来的。直接搜索这个关键字,就可以找到设置值的地方。它是一个UUID,里面有一个window.performance.now()方法,它的作用是返回一个当前页面执行时间的时间戳,用于准确计算程序的执行时间。在node中的实现方法如下:varperf=require('perf_hooks');performance=perf.performance.now()console.log(performance);然后再往上是e.fp=this.fingerprint,应该是一个指纹库:https://github.com/fingerprin...有兴趣的可以去了解下同款浏览器获取的指纹就是了一样的,就在这里修一下。然后是r的值,preAdd方法,直接扣就可以了,然后e的值在传给jsonpRequest之前是有一些值的,所以我们要期待栈:来getCaptcha,有没什么特别的是的,推完就搞定了,有个browserInfo是浏览器的东西,copy一下就可以了。验证接口验证接口最后也是一个jsonpRequest,和前面的图片获取接口类似,不同的是传入的e中包含的值不同,我们先看一下slider:包含distanceX和points,很明显points就是轨迹了,我们往前看,如下图,我们只需要i和r参数,参数就是一些图片的高宽,固定一下就好了,offsetX就是滑动距离.主要看这条轨迹i=this.reducePoints(),在reducePoints()方法中跟进,this.position是轨迹信息,这个方法对轨迹做一些处理并返回,直接推导逻辑即可。滑块到这里,我们来看一下点击验证,同样是jsonpRequest,传入的e包含三个点的坐标。同样往栈上走,这里this.position是真正的坐标,后面的每个坐标将x和y除以图片的宽高,如下图:结果验证
