申明
本文章中所有内容仅供学习交换,抓包内容、敏感网址、数据接口均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关,若有侵权,请分割我立刻删除!
本文章未经许可禁止转载,禁止任何批改后二次流传,擅自应用本文解说的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K 哥爬虫】分割作者立刻删除!
逆向指标
- 指标:某验三代、四代一键通过模式(无感验证)逆向剖析
- 三代主页:
aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9mdWxscGFnZS5odG1s
- 四代主页:
aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
通信流程
接口相干:
残缺流程:
三代抓包状况
register-fullpage
会返回 challenge
和 gt
值,前期有用到。
get.php
会返回 c
和 s
,同样前期会用到,这个申请同样须要 w
值,在某验的点选滑块里,这个申请能够不要 w
值,但在三代无感里,必须得要,不然最初是会验证失败的,可能不带 w
申请,返回的 s
是个假的值,导致最初验证失败。
ajax.php
验证是否胜利,同样须要 w
值,胜利则会返回一个 validate
。
三代逆向剖析
第一个 w 值
置信看过 K 哥以前滑块、点选的文章,对于定位 w
的值很纯熟了,这里也是相似的,"\u0077"
就是 "w"
,其值为 i + r
,如下图所示:
次要就是 r、o、i 的值,要害代码:
var r = t[$_CFAGw(1326)]()
, o = $_BFx()[$_CFAGw(1367)](pe[$_CFAFP(416)](t[$_CFAGw(353)]), t[$_CFAGw(1393)]())
, i = O[$_CFAGw(1375)](o)
先看看 r,跟进去就是咱们相熟的 RSA 了,和以前的解决一样,把代码扣下来或者用库都行。
同样须要留神的是上图中 this[$_CHCFe(1393)]()
也是个随机字符串,会遇到屡次,但整体一次验证下来都是雷同的值,不然验证会失败,点选、滑块等一系列都一样的。
而后是 o 的值,这里和以前一样,跟进去看依然是 AES 加密。 t[$_CFAGw(1393)]()
仍旧是随机字符串。
两头这一串 pe[$_CFAFP(416)](t[$_CFAGw(353)])
,也没啥特地的,除了 gt
和 challenge
,其余都是定值,最初面那一串 i
的值,实测写死、置空都行。
而后持续跟进 i
,把后面 o
的值转换成一个大的字符串,这里也不是很简单,间接扣代码即可:
而后 i + r
就是 w
的值了,到这里第一个 w
的值就搞完了。
第二个 w 值
第二个 w 的值和以往的中央都不太一样,不过通过跟栈的形式也很容易找到,来到有个 var n = {};
的中央,如下图所示:
t[$_CGABi(1436)]
就是 w 值,也就是 t['$_CEDO']
,后面定义了 var t = this
,通过第 8215 行的 t[$_CGAAX(1462)]()
之后,就有了 w 的值,所以要跟进去重点看这一行。
如上图所示,e、t、n、r 中波及到一些浏览器环境值的计算,当然还有鼠标挪动等相干数据的计算,如下图所示:
而理论测试发现这四个值间接置空也能够,在本例中能够,不晓得是否有其余案例校验更加严格,晓得的敌人能够在评论区提出来,再往下,会遇到很多给变量赋值的中央,如下图所示,G 是 MD5 办法,两头的 O[$_CGBFp(948)]
和以前相似,返回一个对象中的 res
和 end
相加,这里就不再赘述了。
i[$_CGBGa(1415)]
这里就是将每个变量和值挨个相加,组成一个大的字符串。
而后到 r 这里,就多了一个 captcha_token
,而后用 {}
将所有数据包了起来。
这些数据咱们格式化一下,大抵构造如下图所示:
其中 ep
外面的 ven
、ren
是显卡相干信息,fp
、lp
是取了两个鼠标挪动的地位信息,间接写死为 null
也能够,tm
就是 window.performance.timing
的一些货色,本人轻易伪造一下就行了。
最初一步 i[$_CGDBA(1436)]
,随机字符串为 key,将后面的数据 r 进行 AES 加密,失去咱们最终的 w 值,如下图所示:
三代后果验证
四代抓包状况
load
接口返回值如下:
- captcha_type:验证码类型,无感为 ai
- gct_path:gct4 文件门路
- lot_number:生成 pow_msg、w 的要害参数
- payload:verify 申请参数
- datetime:ISO 8601 扩大格局的日期,生成 pow_msg 的要害参数
- process_token:verify 申请参数
verify
接口返回值如下:
- captcha_id:验证码 id
- captcha_output:login 申请参数
- gen_time:login 申请参数
- lot_number:login 申请参数
- pass_token:login 申请参数
login
接口验证登录胜利:
四代逆向剖析
w 参数
与三代无感一样,四代无感 w 参数同样间接搜寻 "\u0077"
即可定位到,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) + u
d["arrayToHex")(c) + u
这里是将 c 数组转换成了十六进制的字符串而后加上 u 失去的 r 值,d[$_DIEHS(177)]
跟进去间接扣进去即可,c 定义在第 11705 行:
var c = s[a][$_DIEIq(1403)][$_DIEHS(1498)](e, i);
var c = s[1]["symmetrical"]["encrypt"](e, i);
e 后文剖析,i 为 16 位字符串:
i 定义在第 11702 行,跟进到 d[$_DIEIq(103)]
办法中,i 为 16 位随机数:
e 参数内容如下:
device_id
、lot_number
由 load
接口返回,pow_msg
为 "1|0|md5|" + datetime + "|" + captcha_id + "|" + lot_number + "||" + 16 位随机数
,pow_msg
通过 MD5 加密即为 pow_sign
,"l0zs":"53502544"
为动态变化的键值对,在往期四代滑块的文章中均有具体介绍,接下来跟进到 s[a][$_DIEIq(1403)][$_DIEHS(1498)]
中,c 为 AES 加密,扣代码或者间接引库:
u 定义在第 11704 行,i 为十六位随机字符串:
u = new l[($_DIEHS(84))]()[$_DIEIq(1498)](i);
u = new l["default"]()["encrypt"](i);
跟进到加密函数 l[($_DIEHS(84))]
中,在第 12725 行,于 12741 行打下断点,能够看到这里就是个 RSA 加密,扣代码或者间接引库即可: