极验3代滑块-扣代码及思路

查看 120|回复 11
作者:shanjzhu   
目标网站:aHR0cHM6Ly9kZW1vcy5nZWV0ZXN0LmNvbS9zbGlkZS1mbG9hdC5odG1s
首先免责声明
[color=]本文仅供学习交流,因使用本文内容而产生的任何风险及后果,作者不承担任何责任

[color=]第一次写文章,
[color=]有不适的地方多多包涵

书接上回
通常web逆向主要就两种方式。一种扣代码、另一种就是补环境
由于作者本人对极验3补环境没补明白,所以选择了硬扣代码。
前面我们知道有个3个w值需要逆向,所以还是一样从后往前推
最后一个w值。就不跟栈了,直接用前人的方法搜索"\u0077",不过实际搜索时需要变成 \"\\u0077\"



image.png (50.61 KB, 下载次数: 4)
下载附件
1
2025-8-7 09:18 上传

不过由于这个包的请求调用栈都在同一个文件内,所以优先在该文件内打上断点。刷新页面滑动滑块触发断点
可以看到"\u0077"等于h+u,所以u和h是所需的


image.png (19.1 KB, 下载次数: 4)
下载附件
3
2025-8-7 09:20 上传



image.png (21.02 KB, 下载次数: 3)
下载附件
5
2025-8-7 09:23 上传

跟u进去后,断在第一个变量定义。可以看到e就是我们所需要的值


image.png (17.57 KB, 下载次数: 6)
下载附件
4
2025-8-7 09:22 上传

将它拆解为new U()[$_CBFJy(326)]() 和 this[$_CBGAs(766)](t) 两个部分。其中this[$_CBGAs(766)](t) 返回值为一串字符串,而参数 t 为undefined


image.png (36.05 KB, 下载次数: 5)
下载附件
6
2025-8-7 09:24 上传

进去之后发现它是由rt()返回,跳转到rt后发现返回的是四个t()拼接,而t刚好就在上面。这里就直接用ai生成


image.png (11.42 KB, 下载次数: 6)
下载附件
7
2025-8-7 09:41 上传



image.png (17.04 KB, 下载次数: 5)
下载附件
8
2025-8-7 09:45 上传

接下来就是new U()[$_CBFJy(326)](),跟进去之后直接扣下来运行,发现有报错


image.png (34.88 KB, 下载次数: 4)
下载附件
9
2025-8-7 09:50 上传

这个报错是因缺少混淆的解密函数,而这个解密函数就在每个文件的头部,再把它扣下运行,现在报其他错误


image.png (14.58 KB, 下载次数: 6)
下载附件
10
2025-8-7 09:53 上传



image.png (34.54 KB, 下载次数: 5)
下载附件
11
2025-8-7 09:55 上传

本地调试发现这个我们的this指向global,和网页的不同


image.png (88.26 KB, 下载次数: 4)
下载附件
12
2025-8-7 09:58 上传



image.png (20.94 KB, 下载次数: 5)
下载附件
13
2025-8-7 09:58 上传

还记不记得我们前面扣代码时。这个函数是被赋值给了其他变量,再加上上面的this指向的是E,所以我们最好把这个E全部扣下来


image.png (24.57 KB, 下载次数: 5)
下载附件
14
2025-8-7 10:00 上传

我们可以在这个this里的原型中去找他的构造函数及他原型链下的函数,刚好三个函数在一起,再接着将他的构造函数也扣下来运行


image.png (32.03 KB, 下载次数: 5)
下载附件
15
2025-8-7 10:04 上传

发现又报一个和第一个类似的错误,这个同样是因为解密函数的问题。后续会有很多这种错误,我们只需要在网页搜索该方法是在哪被定义的然后扣下来


image.png (17.94 KB, 下载次数: 6)
下载附件
16
2025-8-7 10:07 上传



image.png (15.6 KB, 下载次数: 3)
下载附件
17
2025-8-7 10:08 上传

然后发现他还是报和之前一样的错误。这个错误是和第一个e的生成有关连,e是等于new什么,而我们本地却是直接调用,并没有进行初始化操作


image.png (63.19 KB, 下载次数: 5)
下载附件
18
2025-8-7 10:10 上传

我们本地也new一下,发现他现在报另外的错误了。正常我们应该直接复制这行报错的代码去网页中打断点,不过由于这个报错是在初始化过程中导致的,需要刷新页面重来。所以我们就不刷新了,直接在控制台输出y,双击他的代码块


image.png (57.17 KB, 下载次数: 6)
下载附件
19
2025-8-7 10:13 上传



image.png (49.46 KB, 下载次数: 5)
下载附件
20
2025-8-7 10:21 上传

扣下来运行后又报错,结合我们之前扣E时的经验,是y原型链中的函数我们没有扣。找原型链可以直接搜索“y[$”,可以发现符合的还挺多了。二话不说就是干,直接硬扣


image.png (59.05 KB, 下载次数: 5)
下载附件
21
2025-8-7 10:22 上传



image.png (16.03 KB, 下载次数: 6)
下载附件
22
2025-8-7 10:26 上传

全部扣下来之后运行,现在报t未定义。正常我们也是要刷新页面,这里就直接把这里几个t改为28


image.png (78.64 KB, 下载次数: 4)
下载附件
23
2025-8-7 10:31 上传

运行发现又报v未定义,还是一样搜索,然后扣。发现有两个,那么我们优先在同一作用域内的。后面的扣代码都可以这样,搜索--->多个就优先同一作用域


image.png (28.08 KB, 下载次数: 5)
下载附件
24
2025-8-7 10:33 上传



image.png (31.63 KB, 下载次数: 6)
下载附件
25
2025-8-7 10:36 上传

运行后又报w未定义。方法同上。运行又报p未定义,方法同上。可以看到他刚好夹在我们之前扣过的y原型链和v中间,不过需要注意这个for循环是在对y进行操作所以也需要扣


image.png (25.1 KB, 下载次数: 5)
下载附件
26
2025-8-7 10:43 上传

后面还有几个函数及原型链,方法同上,这里就不带着一起扣了
一直到这里的时候需要注意,window.crypto.getRandomValues 这个方法node环境并没有这个方法。这里就选择让AI帮我们生成一个。同时这里需要补一个window的全局变量


image.png (18.5 KB, 下载次数: 5)
下载附件
27
2025-8-7 10:57 上传

在经过漫长的扣代码后,我们最终得到了我们想要的值


image.png (35.41 KB, 下载次数: 4)
下载附件
28
2025-8-7 11:07 上传

到这里u就解决了,剩下的l和h就不带着一起扣了,就按照我上面的方法扣吧。个人感觉通篇下来有点啰嗦了
[color=]需要注意:就是那个随机值,他是一个文件只会生成一个。也就代表刚刚u用到的和后面l用到是同一个,以及第一个w值和第二个w值他们俩用到的也是同一个(这里卡了我一天)
[color=]余下的一些注意事项可以移步到K哥的文章----->
【验证码逆向专栏】某验全家桶细节避坑总结
[color=]同时轨迹方面,最后一个w值我用的是站内另一位大佬的方法----->
极验反爬虫防护分析之slide验证方式下图片的处理及滑动轨迹的生成思路
[color=]     而第二个w值中的轨迹则是临时复制了一个正常访问的轨迹
[color=]     最最最重要的一点,这里的轨迹都仅仅是临时使用,最终还是要自己训练或者其他方法
[color=]第一个、第三个w值都可以通过搜索定位到,第二个w值就需要跟栈
最后附一张最终结果图吧


微信图片_20250806200408.png (238.75 KB, 下载次数: 5)
下载附件
2025-8-7 11:20 上传

下载次数, 下载附件

shanjzhu
OP
  


好好学习多挣钱 发表于 2025-8-9 17:04
[md]楼主你好,官网最新的四代有研究吗?我补环境不知道是不是失败了,下面这个函数执行报错:
```js
cla ...

这个是密钥或者IV没有初始化导致的。可能需要找找他初始化的位置,看他是根据什么生成的
好好学习多挣钱   

楼主你好,官网最新的四代有研究吗?我补环境不知道是不是失败了,下面这个函数执行报错:
clamp: function () {
    var _ᕾᖆᕶᖚ = _ᖃᕿᕾᖉ.$_Co;
    var _ᕶᕸᕷᕸ = ["$_DDCAn"].concat(_ᕾᖆᕶᖚ);
    var _ᕾᖉᖗᖘ = _ᕶᕸᕷᕸ[1];
    _ᕶᕸᕷᕸ.shift();
    var _ᕾᕵᖂᖀ = _ᕶᕸᕷᕸ[0];
    var _ᖉᖘᕺᖙ = this['words'];
    var _ᕹᕿᖈᖘ = this['sigBytes'];
    console.log(this);
    _ᖉᖘᕺᖙ[_ᕹᕿᖈᖘ >>> 2] &= 4294967295
我补的环境如下:
window = global;
window.crypto = {};
window.addEventListener = function (arg) {
    console.log("window -> addEventListener 参数 " + arg);
};
document = {};
document.body = {};
document.head = {};
document.documentElement = {};
document.getElementsByTagName = function (arg) {
    console.log("document -> getElementsByTagName 参数 " + arg);
    if (arg == "head"){
        return {};
    }
};
navigator = {};
navigator.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36';
navigator.appName = 'Netscape';
location = {
    "ancestorOrigins": {},
    "href": "https://www.geetest.com/adaptive-captcha",
    "origin": "https://www.geetest.com",
    "protocol": "https:",
    "host": "www.geetest.com",
    "hostname": "www.geetest.com",
    "port": "",
    "pathname": "/adaptive-captcha",
    "search": "",
    "hash": ""
};
free1031   

说的很详细,楼主真棒
amwquhwqas128   

比较详细的文章内容,非常感谢
leesn   

感谢大佬分享,mark
可坏   

好厉害,羡慕+1
traviswen   

三代的用起来啊 啊
迷心大哥哥   

加密就是rsa  aes  base64  md5简单的组合
QQGGKKXX   

新手看不太懂,感觉很厉害加油
您需要登录后才可以回帖 登录 | 立即注册

返回顶部