nonce比较好搜,直接关键词定位到2179行,sign名字被混淆了,向下稍微找一下,在这。完整代码我放压缩包里了。

QQ20250818-105357.png (300.2 KB, 下载次数: 4)
下载附件
2025-8-18 14:34 上传

QQ20250818-105934.png (220.84 KB, 下载次数: 3)
下载附件
2025-8-18 13:25 上传

QQ20250818-110702.png (316.32 KB, 下载次数: 3)
下载附件
2025-8-18 13:31 上传
[JavaScript] 纯文本查看 复制代码
function get_sign() {
nonce = Math["round"](
new Date()["getTime"](),
) + Math["floor"](
0x5f5e100 * Math["random"](),
)
timestamp = Math.round(new Date()["getTime"]())
_0x3ca1de = `appIddc1db94ea7b3843cdc0ec0hc0nonce${nonce}os3pc0phone10000000000pncom.web.tianyurc0sdkName360CaptchaSDKtimestamp${timestamp}type1uinullversion2.0.0xc0`
sign = Crypto.MD5(_0x3ca1de).toString()
// console.log(sign);
// console.log(Crypto.MD5('123456').toString())}
return {'timestamp': timestamp, 'nonce': nonce, 'sign': sign}
}
验证码图片有乱序,需要还原底图。

bg.png (241.2 KB, 下载次数: 3)
下载附件
2025-8-18 13:35 上传

output.png (233.11 KB, 下载次数: 4)
下载附件
2025-8-18 13:35 上传

front.png (23.66 KB, 下载次数: 3)
下载附件
2025-8-18 13:35 上传
在事件监听断点的画布上打上个√,断在1处,2处是背景图,核心代码在2下面一段做了分割操作。

QQ20250818-124254.png (442.53 KB, 下载次数: 5)
下载附件
2025-8-18 13:37 上传
核心代码如下: 滑块背景图分割还原数组JS函数
[JavaScript] 纯文本查看 复制代码
function get_Img(
_0x121c70,
_0x10dcdd,
) {
const _0x58b550 = {
uKQaL: "includes",
LRljw(_0x52e5da, _0x58ed7b) {
return _0x52e5da === _0x58ed7b;
},
};
function _0x1c18e2(_0x2a7547, _0x2daf7e) {
if (_0x2a7547[_0x58b550["uKQaL"]])
return _0x2a7547[_0x58b550["uKQaL"]](
_0x2daf7e,
);
for (
let _0x282371 = 0x0,
_0xca62fe = _0x2a7547[_0x208f76(0x3ec, '\x66\x40\x31\x4c')];
_0x282371
底图背景还原函数Python代码
[Python] 纯文本查看 复制代码
def restore(img):
lis=js_code.call('get_Img',img)
bg_img=Image.open('bg.png')
recover_img=Image.new('RGBA',(544,284),'white')
for index, item in enumerate(lis):
x = index * 17
y = 0
l = bg_img.crop((x, y, x + 17, y + 284))
recover_img.paste(l, box=(item * 17, 0))
recover_img.save('output.png')
滑块缺口图滑动距离Python代码
[Python] 纯文本查看 复制代码
import logging
def get_distance(bg_img):
"""
使用Recognizer识别滑块验证码的缺口位置并计算滑动距离
参数:
bg_img: 滑块背景图片(文件路径或OpenCV图像对象)
返回:
计算后的滑动距离(像素)
"""
# 初始化识别器
recognizer = Recognizer()
# 识别缺口位置和置信度
box, confidence = recognizer.identify_gap(source=bg_img, verbose=False)
# 记录日志
logger.debug(f'可信度: {confidence}')
# 计算滑动距离 (原始代码中的/r544可能是笔误,实际应为/)
return int(box[0] / 544 * 300) # 将原始坐标转换为目标距离
# # 配置日志
# logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
# 使用示例
distance = get_distance("output.png")
print(f"需要滑动的距离: {distance}像素")
滑动轨迹模拟Python函数
[Python] 纯文本查看 复制代码
def generate_trace(slide_distance):
"""
生成滑块验证的轨迹数据
参数:
slide_distance: 需要滑动的总距离(像素)
返回:
包含轨迹数据的列表,每个点包含x坐标、时间戳和y坐标
"""
traceData = {}
x = 0
t = int(time.time() * 1000) # 当前时间戳(毫秒)
y = random.randint(210, 220) # 初始y坐标
traceData[str(x)] = {'t': t, 'y': y}
while x = slide_distance:
x = slide_distance # 确保不超过目标距离
traceData[str(x)] = {
't': t,
'y': y + random.randint(-1, 1) # y坐标微小波动
}
break
traceData[str(x)] = {
't': t,
'y': y + random.randint(-1, 1) # y坐标微小波动
}
return [traceData]
检验接口是check,参数大部分是上次请求返回的,length是滑动距离,主要逆向report,这个也可以关键词搜索。

QQ20250818-110758.png (331.12 KB, 下载次数: 2)
下载附件
2025-8-18 13:45 上传

QQ20250818-113616.png (355.03 KB, 下载次数: 2)
下载附件
2025-8-18 13:45 上传
点进控制台2里的方法,是核心加密位置,如下图所示。其中标注的 new JSEncrypt( ) 函数方法点进去文件要全扣,
补个window=global,navigator={ } 。加密位置RSA加密,公钥是atob(k) ,一起传入的还有captchaId,token和轨迹。

QQ20250818-113639.png (200.63 KB, 下载次数: 5)
下载附件
2025-8-18 14:00 上传
核心代码:[JavaScript] 纯文本查看 复制代码
function report(data,k,captchaId,token) {
_0x42739f=JSON.stringify(data)
const _0x145c35 = new JSEncrypt();
const _0x4070dc = {
"vConfig": {
"k": k,
"captchaId": captchaId,
"token": token}}
return (
_0x145c35["setPublicKey"](atob(_0x4070dc.vConfig.k)),
_0x145c35["encryptLong"](_0x42739f)+ Crypto.MD5(_0x4070dc["vConfig"]["captchaId"]+ _0x4070dc["vConfig"]["token"]).toString()
)}

QQ20250818-143914.png (194.56 KB, 下载次数: 3)
下载附件
2025-8-18 14:39 上传