极验四代滑块验证码
- 一、目标网站说明
- 二、流程步骤
- 1. 逆向步骤一般分为:
- 2. 接口确认
- 1- 确认流程
- 2- 获取verify的参数
- 3- 构建requests验证verify的参数
- 4- 锁定secode参数的作用
- ok,让我们去获取verify接口中的响应!!!
- 3. 参数确认 & 重试校验参数逻辑
- 1- 我们确认了要获取verify接口后,便来开始参数确认。经过一番确认,所有的参数都在params中。
- 2- verif接口
- 3- load接口中参数lot_number, payload, process_token
- 4- 跟进load接口
- 5- 参数 captcha_id
- 6- verify接口
- 4. 寻找逆向入口
- 1- Initiator堆栈进入, 断点调试
- 2- 查找参数w
- 3- 提取生成e的函数
- 4- 这里是个异步函数,重新断点查看e是什么。
- 5- 寻找e的生成逻辑。
- 6- 寻找参数 setLeft, passtime, userresponse。
- 6- 查看参数e的构成。
- 7- 跟到此处,发现s中有参数出现。
- 8- 如pow_msg参数生成位置。
- 9- 此时,这个r就包含了我们要的两个参数,我们一个个看
- 10- 参数pow_msg ,pow_sign
- 11- ok,来,我们继续, 剩下还有7个字段。
- 12- 参数: geetest, lang, ep。
- 13- 参数: bhit。
- 14- 参数 gee_guard
- 15- 参数 vjRa![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/83462035c4c84b87a0767b5ea8998e2c.png)##### 16- 参数 em
- 17- em转为参数w
- 18-1 w中子参数n
- 18-2 w中子参数n转化为w
- 5. 爬虫代码编辑
一、目标网站说明
本文章仅用于学习,不可用于任何非法途径,不授权任何单位和个人。特此申明保命。我这里就直接放链接了
https://gt4.geetest.com/
!!! 后续还有,csdn出bug,后续图片一直无法显示,正在修复!!!
二、流程步骤
1. 逆向步骤一般分为:
- 接口确认: 找到我们需要的接口进行分析;
- 参数确认: 在接口中提炼出我们需要处理的参数;
- 重试校验参数逻辑: 查看参数之间关系;
- 寻找逆向入口: 找到参数生成位置 ;
- 获取加密算法: 实现参数逻辑;
- 爬虫代码编辑: 爬虫代码编写;
2. 接口确认
1- 确认流程
网站打开后就是一个验证页面。不知道怎么操作,那就模拟全程过一遍,抓个包。
2- 获取verify的参数
一点一划就提示验证通过。抓包如下,里面各类参数,也不知道有什么用。
3- 构建requests验证verify的参数
那我们点击登录, 提示成功。 我们拿到登录接口的包,构建requests
4- 锁定secode参数的作用
经过一番操作,我们知道了,登录中参数每次只能使用一次,而关键参数为验证码接口返回的参数:secode。每次拿到secode后,就可登录一次,那我们本次逆向就有目标了。获取verify接口中的响应,并提取secode参数。
ok,让我们去获取verify接口中的响应!!!
3. 参数确认 & 重试校验参数逻辑
1- 我们确认了要获取verify接口后,便来开始参数确认。经过一番确认,所有的参数都在params中。
params = {"callback": "geetest_1720668074855","captcha_id": "54088bb07d2df...80300b0abbe","client_type": "web","lot_number": "047e84f8d5a...5bbbceb5748d","risk_type": "slide","payload": "_b-sD...H8Kw==","process_token": "90dfc9ada24d1fc22...9770c09aeeebb7a3f","payload_protocol": "1","pt": "1","w": "92e...78a6"
}
2- verif接口
其中captcha_id, lot_number, payload, process_token, w参数均为疑似的五个参数。 那我们一个个查看,他们是从哪里的。此时,切记不可上来就去源码中跟值跟栈,我们重新走一下流程,看下各个参数的出处。
3- load接口中参数lot_number, payload, process_token
刷新一下页面,直接就能看到load接口中lot_number, payload, process_token三个参数都出来了。
4- 跟进load接口
而load接口中的参数有两个,一个为 captcha_id,另一个为 challenge。而 captcha_id 同时也是verify接口中的参数。ok,那我们先搞定load接口
5- 参数 captcha_id
直接搜索,调用,ok搞定了 captcha_id 参数。至于challenge参数【多次调用,发现没有这个参数也同样能运行成功】。那我们可以认为challenge为非必须得。
6- verify接口
ok此时,verify接口中的参数只剩下最后一个w。而在多次搜索调用之后,发现w不是在其他接口中生成的。那我们大概率需要逆向的就是这个w参数了。此时,我们开始跟栈,来到我们今天的重头戏。极验四代验证码的核心逆向参数:w参数
4. 寻找逆向入口
1- Initiator堆栈进入, 断点调试
2- 查找参数w
向上跟栈,发现这个i就是我们要的w参数。i的生成方式就在这个函数内部,是由e通过一些函数生成来的。
3- 提取生成e的函数
打印可知,i是由e经过两个js内置函数生成来的,目前先,默认函数内无任何修改,那我们先继续看e。e是函数调用传入的参数,我们继续向上跟栈。
var i = (0,m[$_BIBCI(95)])(f[$_BIBCI(95)][$_BIBDJ(525)](e), n)
4- 这里是个异步函数,重新断点查看e是什么。
其中e的属性包括这些,那我们继续跟e值,查看其中14个字段都是从哪里来的。
{"setLeft": 181,"passtime": 841,"userresponse": 181.9300161705061,"device_id": "","lot_number": "b462187b4ead41e6a5d2b77548203f5e","pow_msg": "1|0|md5|2024-07-11T11:55:16.611805+08:00|54088bb07d2df3c46b79f80300b0abbe|b462187b4ead41e6a5d2b77548203f5e||658f22accd2183b4","pow_sign": "ca634f84e6dcc5f99137a8630c0b3151","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"}},"7MVm": "l7wr","em": {"ph": 0,"cp": 0,"ek": "11","wd": 1,"nt": 0,"si": 0,"sc": 0}
}
5- 寻找e的生成逻辑。
断点断在这里,我们发现,e中只有三个参数。 说明加密逻辑就在这段中间。我们首先把这三个参数找到
var $_BIBCd = tLHEB.$_Cu{"setLeft": 173,"passtime": 1512,"userresponse": 173.97730827346714
}
6- 寻找参数 setLeft, passtime, userresponse。
我们向上稍微一跟,就发现了如下地方, 这里就是三个参数的生成位置。
其中
t[$_FFFCq(1430)] 为固定值
a是由i生成, i为图形与左边坐标计算值
r为滑动花费时间这段可能就涉及到滑块滑动数据,我们先暂存。搞定逆向逻辑,再看看滑块怎么回事。
6- 查看参数e的构成。
当我们走到以下断点时,发现e中莫名就出现了4个参数,仔细看这一段,就会发现是从this中传入的,那我们的目标就要换成this从何而来。
此时我们回过头来看e中内容已经如下,我们已经获取了其中7个字段。除了pow_msg, pow_sign两个参数需要查看生成逻辑,其余5个字段已经能成功获取到
{"setLeft": 198,"passtime": 1111,"userresponse": 198.82952045171382,"device_id": "","lot_number": "f393217f8a5c42dab8307d4a39ceaf63","pow_msg": "1|0|md5|2024-07-11T14:00:38.733038+08:00|54088bb07d2df3c46b79f80300b0abbe|f393217f8a5c42dab8307d4a39ceaf63||355ef192aefce069","pow_sign": "8a5f229ce04fbc08862e98a17242c470"
}
7- 跟到此处,发现s中有参数出现。
再跟这两个值时一直有个误区,以为这两个值是滑块验证时出现的,其实不然,这两个值在加载图片的时候就已经生成,验证时才挂载到e上,所以我们应该从刷新页面时开始跟值而不是一直守着verify接口。
用同样的思路,一直向上跟栈。 终于跟到了这个地方,此处就是 pow_msg 生成的地方
8- 如pow_msg参数生成位置。
r = (0,d[$_BGCIY(42)])(n, i, s[$_BGCIY(518)], s[$_BGCIY(582)], s[$_BGCIY(535)], s[$_BGCIY(579)], $_BGCHo(79))
9- 此时,这个r就包含了我们要的两个参数,我们一个个看
n: 'lotNumber'
i: 'captchaId'
s[$_BGCIY(518)]
s[$_BGCIY(582)]
s[$_BGCIY(535)]
s[$_BGCIY(579)]
$_BGCHo(79)
这些都是load接口中返回的数据。
pow_msg 最后还有一个后缀,是有该算法生成的
10- 参数pow_msg ,pow_sign
那我们还剩最后一点点, 还记得我们e参数吗, 总共14个未知字段,现在我们已经找到了7个字段。那我们回头再看
{"setLeft": 128,"passtime": 704,"userresponse": 129.2433263526231,"device_id": "","lot_number": "078a7dabd0ef4076b5c0f6fe2ab1e076","pow_msg": "1|0|md5|2024-07-11T16:52:56.688059+08:00|54088bb07d2df3c46b79f80300b0abbe|078a7dabd0ef4076b5c0f6fe2ab1e076||e5bdc9d776f2b288","pow_sign": "e460f9786ef72965b9ec3b6117401639","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"}},"vjRa": "Vzej","em": {"ph": 0,"cp": 0,"ek": "11","wd": 1,"nt": 0,"si": 0,"sc": 0}
}
11- ok,来,我们继续, 剩下还有7个字段。
此时,我们清空所有断点, 再次跟到e生成的地方。跟到此处,又有4个参数,出现了,来,就是这段,仔细读读。
12- 参数: geetest, lang, ep。
从十行代码中找到参数位置也很快,跟到这个地方, 三个参数搞定。从这里进去。
但是怎么看这三个参数都像是可以固定的
13- 参数: bhit。
bhit 看起来似乎也是个固定值 “1426265548”
14- 参数 gee_guard
至此e中14个字段,搞定了12个。都看到这里了,最后两个字段,再坚持坚持
gee_guard目测也是固定值
15- 参数 vjRa##### 16- 参数 em
看着em也是固定的,不管了,先把代码跑起来。
17- em转为参数w
从前面我们知道,i的值就为w,而i是由参数e经过一个函数转化来的。从这里可知
f[$_BIBCd(42)][$_BIBDQ(517)](e): 就是e字符串了一下。
m[$_BIBCd(42)]: 这个就是转换函数,我们跟进去
这里的 _ 看似就是我们要的w的值。n的生成逻辑在我圈中的位置。
18-1 w中子参数n
从n生成的地方进入,可以直接找到n的生成位置,由4个e()的值生成
(65536 * (1 + Math[$_EBHx(151)]()) | 0)[$_EBHx(109)](16)[$_EBHx(25)](1) 转成python语句如下:
hex(int(65536 * (1 + random.random())))[2:][1:]
18-2 w中子参数n转化为w
我们知道n了之后,跟进 _ 生成位置函数, 看到参数w是s数组tostrng一下来的。我们看一下s怎么来
到了这里,我们看得出,这是加密函数。具体怎么加密的,需要分析,剩下来的就是扣代码的事情了。