文章目录
声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!
测试网址:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
1. 请求验证码接口
- 接口地址:aHR0cHM6Ly9nY2FwdGNoYTQuZ2VldGVzdC5jb20vbG9hZA==
- 请求参数分析
{
"callback": "geetest_1756178706683", # geetest_时间戳
"captcha_id": "54088bb07d2df3c46b79f80300bxxxxx", # 固定值
"client_type": "web", # 固定值
"risk_type": "slide", # 固定值
"lang": "zh" # 固定值
}
2. 验证接口
- 接口地址:aHR0cHM6Ly9nY2FwdGNoYTQuZ2VldGVzdC5jb20vdmVyaWZ5
- 请求参数分析
{
"callback": "geetest_1756180690907", # geetest_时间戳
"captcha_id": "54088bb07d2df3c46b79f80300b0abbe", # 固定值
"client_type": "web", # 固定值
"lot_number": "db591507aa36437dabc3f6ba18042f26", # 来自验证码接口lot_number
"risk_type": "slide", # 固定值
"payload": "AgFD8gWUUuHFx-XvpP7J2dmdjKck...", # 来自验证码接口payload
"process_token": "dbcc1392a83e08d99429a7...", # 来自验证码接口process_token
"payload_protocol": "1", # 固定值
"pt": "1", # 固定值
"w": "84dfd37bf382ad5d88ba3bce998c5cb6c..." # 逆向值*****
}
2.1 w值逆向分析

w生成位置:_ᕸᖆᖚᕿ = (0, _ᖆᖚᕾᕺ[_ᕸᕺᖂᖗ(183)])(_ᕸᕿᖂᖁ[_ᕸᕺᖂᖗ(183)][_ᕸᕺᖂᖗ(527)](_ᕸᖆᖚᕿ), _ᖆᕸᕶᖁ)- 参数1
_ᕸᕿᖂᖁ[_ᕸᕺᖂᖗ(183)][_ᕸᕺᖂᖗ(527)](_ᕸᖆᖚᕿ):滑块滑动的一些信息(命名为input_data)

- 参数2
_ᖆᕸᕶᖁ:是一个不知道什么的对象 - 进入方法
_ᖆᖚᕾᕺ[_ᕸᕺᖂᖗ(183)]内部继续分析
w最终生成位置:(0, _ᕹᕾᕶᖙ[_ᖗᖗᖘᕾ(142)])(_ᕸᖆᖚᕿ) + r
2.2 r值逆向分析
- 生成位置:
_ᖙᕴᕾᕶ[_ᖆᕸᕶᖁ][_ᕺᖂᖃᕿ(905)][_ᖗᖗᖘᕾ(990)](_ᖂᕺᕸᖂ) - 参数
_ᖂᕺᕸᖂ:6023547f2e312572,是一个随机字符串,生成位置:_ᖂᕺᕸᖂ = (0, _ᕹᕾᕶᖙ[_ᖗᖗᖘᕾ(192)])() - 命名获取随机数的函数为
get_random_string,后面还会用到,内部很简单,自行还原

- 重点是加密方法
_ᖙᕴᕾᕶ[_ᖆᕸᕶᖁ][_ᕺᖂᖃᕿ(905)][_ᖗᖗᖘᕾ(990)],可以发现是调用了上面一个对象中的方法

- 查看方法,观察记住这个特征
65537和setPublic,是RSA加密的特征,跟一下new _ᖆᖆᖘᕴ[_ᖗᖗᖘᕾ(183)]实例化过程,可以找到setPublic设置公钥所需要的模数和指数,自行还原加密算法


2.3 _ᕸᖆᖚᕿ值逆向分析(命名为u)
- 生成位置:
_ᕸᖆᖚᕿ = _ᖙᕴᕾᕶ[_ᖆᕸᕶᖁ][_ᕺᖂᖃᕿ(980)][_ᕺᖂᖃᕿ(990)](_ᕸᖆᖚᕿ, _ᖂᕺᕸᖂ) - 参数分析:可以注意到两个参数分别就是传入的
滑块滑动的一些信息、随机字符串(注意这个随机字符串要和前面生成r值的保持一致)

- 加密方法:
_ᖙᕴᕾᕶ[_ᖆᕸᕶᖁ][_ᕺᖂᖃᕿ(980)][_ᕺᖂᖃᕿ(990)],结合iv特征为 ‘0000000000000000’(16 字节),确定为AES加密,自行还原加密算法

- 最终
u值经过_ᕹᕾᕶᖙ[_ᖗᖗᖘᕾ(142)]方法处理后+r得到w值,实际上就是AES加密得到数组结果又处理成字符串进行拼接,我们可以在加密时就以字符串形式返回
2.4 滑块信息逆向分析
- 分析结果如下,可以自行刷新几遍对比
input_data就是以下对象转为字符串
{
"setLeft": 30, // 滑动距离,ocr检测结果
"passtime": 246, // 滑动耗时,随机生成
"userresponse": 31.822654613896034, // 逆向值
"device_id": "", // 固定值
"lot_number": "c8c8a63868734df5954f4a726734ff3f", // 来自验证码接口lot_number
"pow_msg": "1|8|sha256|2025-08-27T15:58:59.125591+08:00|54088bb07d2df3c46b79f80300b0abbe|c8c8a63868734df5954f4a726734ff3f||75cfc66f85f8cb1f", // 逆向值
"pow_sign": "00b4a64e671cd76c38d32fdbb54705166ff54971abbcc746e31e99e689f82d7e", // 逆向值
"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"
}
}, // 固定值
"W4Ec": "7RXi", // 逆向值
"a726": {
"868734df": {
"734df4a7": "34ff"
}
}, // 逆向值
"em": {
"ph": 0,
"cp": 0,
"ek": "11",
"wd": 1,
"nt": 0,
"si": 0,
"sc": 0
} // 固定值
}
2.5 userresponse值逆向分析
- 自行调试,结论就是除以一个固定值+2

2.6 pow_msg值逆向分析
- 前部分的值均来自验证码接口返回值或者固定值,重点在于最后一个拼接的16位随机字符串,这里获取方式同前面的
get_random_string,不过重点来了,这里并不是生成随机字符串拼接后直接就返回了,而是在拼接后进行了校验,不符合校验规则需要重新拼接如此反复,直至符合规则返回数据。这里自行重点分析,代码简单自行还原!!!

2.7 pow_sign值逆向分析
- 这里同上
pow_msg一起返回数据
2.8 "W4Ec": "7RXi"、 "a726":{"868734df":{"734df4a7":"34ff"}}值逆向分析
- 参数1:这里我们反复调试后,第一个键值对看似是固定值,实则搜索全局发现这个固定值来自于此js文件,而这个js文件是动态的,是不过更新频率比较低。
- 获取方法:验证码接口返回了
js代码的地址,获取文件后可以在执行js代码后打印值,从控制台获取这个键值对。


- 参数2:跟栈调试我们可以在
w值的生成前找到第二个键值对的生成位置,最后的结果是将i值和o值组成一个嵌套的数据,进入方法内部分析可以发现这个键值对是对验证码接口返回的lot_number值进行切割得到的数字,而切割规则同样依赖于js文件 - 获取方法:同上获取到切割规则,然后自行拼接为嵌套对象。

3. 滑动距离识别
- 自行使用
ocr识别,推荐使用:https://pypi.org/project/ddddocr/
4. 结果展示
本文章已经将此案例所有注意的细节全部讲解,但具体实现过程未提供,希望各位小伙伴多多动手实操起来吧!

感谢您的阅读与支持,如果这篇文章对您有帮助,请关注点赞收藏,您的支持是我创作的动力!

&spm=1001.2101.3001.5002&articleId=150849911&d=1&t=3&u=6da3f270a4784ddab3d107fbb626f748)
1547

被折叠的 条评论
为什么被折叠?



