首先免责声明
[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 上传

