验证码逆向专栏某验三代四代一键通过模式逆向分析
声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】联系作者立即删除!逆向目标目标:某验三代、四代一键通过模式(无感验证)逆向分析三代主页:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9mdWxscGFnZS5odG1s四代主页:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v通讯流程
接口相关:
完整流程:
三代抓包情况
registerfullpage会返回challenge和gt值,后期有用到。
get。php会返回c和s,同样后期会用到,这个请求同样需要w值,在某验的点选滑块里,这个请求可以不要w值,但在三代无感里,必须得要,不然最后是会验证失败的,可能不带w请求,返回的s是个假的值,导致最后验证失败。
ajax。php验证是否成功,同样需要w值,成功则会返回一个validate。
三代逆向分析第一个w值
相信看过K哥以前滑块、点选的文章,对于定位w的值很熟练了,这里也是类似的,w就是w,其值为ir,如下图所示:
主要就是r、o、i的值,关键代码:varrt〔CFAGw(1326)〕(),oBFx()〔CFAGw(1367)〕(pe〔CFAFP(416)〕(t〔CFAGw(353)〕),t〔CFAGw(1393)〕()),iO〔CFAGw(1375)〕(o)
先看看r,跟进去就是我们熟悉的RSA了,和以前的处理一样,把代码扣下来或者用库都行。
同样需要注意的是上图中this〔CHCFe(1393)〕()也是个随机字符串,会遇到多次,但整体一次验证下来都是相同的值,不然验证会失败,点选、滑块等一系列都一样的。
然后是o的值,这里和以前一样,跟进去看仍然是AES加密。t〔CFAGw(1393)〕()依旧是随机字符串。
中间这一串pe〔CFAFP(416)〕(t〔CFAGw(353)〕),也没啥特别的,除了gt和challenge,其他都是定值,最后面那一串i的值,实测写死、置空都行。
然后继续跟进i,把前面o的值转换成一个大的字符串,这里也不是很复杂,直接扣代码即可:
然后ir就是w的值了,到这里第一个w的值就搞完了。第二个w值
第二个w的值和以往的地方都不太一样,不过通过跟栈的方式也很容易找到,来到有个varn{};的地方,如下图所示:
t〔CGABi(1436)〕就是w值,也就是t〔CEDO〕,前面定义了vartthis,经过第8215行的t〔CGAAX(1462)〕()之后,就有了w的值,所以要跟进去重点看这一行。
如上图所示,e、t、n、r中涉及到一些浏览器环境值的计算,当然还有鼠标移动等相关数据的计算,如下图所示:
而实际测试发现这四个值直接置空也可以,在本例中可以,不知道是否有其他案例校验更加严格,知道的朋友可以在评论区提出来,再往下,会遇到很多给变量赋值的地方,如下图所示,G是MD5方法,中间的O〔CGBFp(948)〕和以前类似,返回一个对象中的res和end相加,这里就不再赘述了。
i〔CGBGa(1415)〕这里就是将每个变量和值挨个相加,组成一个大的字符串。
然后到r这里,就多了一个captchatoken,然后用{}将所有数据包了起来。
这些数据我们格式化一下,大致结构如下图所示:
其中ep里面的ven、ren是显卡相关信息,fp、lp是取了两个鼠标移动的位置信息,直接写死为null也可以,tm就是window。performance。timing的一些东西,自己随便伪造一下就行了。
最后一步i〔CGDBA(1436)〕,随机字符串为key,将前面的数据r进行AES加密,得到我们最终的w值,如下图所示:
三代结果验证
四代抓包情况
load接口返回值如下:
captchatype:验证码类型,无感为aigctpath:gct4文件路径lotnumber:生成powmsg、w的关键参数payload:verify请求参数datetime:ISO8601扩展格式的日期,生成powmsg的关键参数processtoken:verify请求参数
verify接口返回值如下:
captchaid:验证码idcaptchaoutput:login请求参数gentime:login请求参数lotnumber:login请求参数passtoken:login请求参数
login接口验证登录成功:
四代逆向分析w参数
与三代无感一样,四代无感w参数同样直接搜索w即可定位到,r为w参数的值:
r参数定义在第6237行,内容如下:(0,d〔CBHHO(84)〕)(f〔CBHIE(84)〕〔CBHHO(562)〕(e),i)d〔default〕)(f〔default〕〔stringify〕(e),i)
由上可知,r是将i参数和转为字符串的e参数加密得到的,跟进到d〔CBHHO(84)〕中,加密函数定义在第11669行,在第11707行打下断在,返回值为r参数的值,即w值:
(0,d〔DIEHS(177)〕)(c)ud〔arrayToHex)(c)u
这里是将c数组转换成了十六进制的字符串然后加上u得到的r值,d〔DIEHS(177)〕跟进去直接扣出来即可,c定义在第11705行:varcs〔a〕〔DIEIq(1403)〕〔DIEHS(1498)〕(e,i);varcs〔1〕〔symmetrical〕〔encrypt〕(e,i);
e后文分析,i为16位字符串:
i定义在第11702行,跟进到d〔DIEIq(103)〕方法中,i为16位随机数:
e参数内容如下:
deviceid、lotnumber由load接口返回,powmsg为10md5datetimecaptchaidlotnumber16位随机数,powmsg经过MD5加密即为powsign,l0zs:53502544为动态变化的键值对,在往期四代滑块的文章中均有详细介绍,接下来跟进到s〔a〕〔DIEIq(1403)〕〔DIEHS(1498)〕中,c为AES加密,扣代码或者直接引库:
u定义在第11704行,i为十六位随机字符串:unewl〔(DIEHS(84))〕()〔DIEIq(1498)〕(i);unewl〔default〕()〔encrypt〕(i);
跟进到加密函数l〔(DIEHS(84))〕中,在第12725行,于12741行打下断点,可以看到这里就是个RSA加密,扣代码或者直接引库即可:
四代结果验证