这个网站比较容易绕过SSL的绑定
`frida -v` frida -U --codeshare masbog/frida-android-unpinning-ssl -f com.coinmarketcap.android
https://staticrecap.cgicgi.io/js/se/captcha/v1/captcha.min.js
请求这个链接得到js挑战代码
下发挑战链接请求得到js代码
https://api.commonservice.io/gateway-api/v1/public/antibot/getCaptch
https://api.commonservice.io/gateway-api/v1/public/antibot/validateCaptcha
https://api.coinmarketcap.com/auth/v4/user/signUp
完整的验证码破解 JavaScript 实现,支持 Grid(图片选择)和 Slide(滑块)两种验证码类型。
captcha_crack.js- 核心破解代码,包含所有加密和签名算法captcha_example.js- 使用示例代码CaptChaCode.js- 原始混淆代码(用于参考)AstCode.js- AST 解混淆工具
const encryptedData = encryptData(jsonData, encryptionKey);实现了完整的加密流程:
- UTF-8 编码
- XOR 加密
- Base64 编码
- 字符串反转混淆
const checksum = calculateChecksum(bizId + sig + encryptedData + salt);简单的字符码累加校验和。
const env = collectEnvironment();收集浏览器环境信息:
- WebDriver 检测
- 移动设备检测
- 插件列表
- 平台信息
- 窗口尺寸
const behavior = generateBehaviorData('grid'); // 或 'slide'生成真实的鼠标/触摸事件序列。
const CaptchaCracker = require('./captcha_crack.js');
// 1. 从服务器获取验证码信息
const captchaInfo = {
sig: 'signature_from_server',
ek: 'encryption_key',
salt: 'salt_value',
captchaType: 'grid',
tag: 'traffic light'
};
// 2. 通过图像识别得到选中的图片索引
const selectedImages = ['0', '4', '8'];
// 3. 生成提交参数
const params = CaptchaCracker.submitGridCaptcha(
captchaInfo,
selectedImages,
'your_biz_id'
);
// 4. 提交验证
// POST to /validateCaptcha with params// 1. 获取验证码信息
const captchaInfo = {
sig: 'signature_from_server',
ek: 'encryption_key',
salt: 'salt_value',
captchaType: 'BOX'
};
// 2. 通过图像识别计算滑动距离
const slideDistance = 185; // 像素
const imageWidth = 310;
// 3. 生成提交参数
const params = CaptchaCracker.submitSlideCaptcha(
captchaInfo,
slideDistance,
imageWidth,
'your_biz_id'
);
// 4. 提交验证GET /v1/public/antibot/getCaptcha
参数:
bizId- 业务 IDsv- SDK 版本 (20220812)lang- 语言 (en)clientType- 客户端类型 (web)
返回:
{
"success": true,
"data": {
"sig": "验证码签名",
"ek": "加密密钥",
"salt": "盐值",
"captchaType": "BOX 或 grid",
"path2": "图片路径",
"tag": "识别目标(仅 grid)"
}
}POST /v1/public/antibot/validateCaptcha
参数:
sig- 验证码签名data- 加密的行为数据s- 校验和bizId- 业务 IDlang- 语言sv- SDK 版本
返回:
{
"success": true,
"data": {
"result": 0, // 0=成功, 1=失败, 2=超时, 3=错误, 5=次数过多
"token": "验证成功的 token"
}
}{
ev: {
wd: 1, // webdriver 检测
im: 0, // 移动设备
de: '', // 设备信息
prde: 'plugins', // 插件列表
brla: 1, // browserLanguage
pl: 'platform', // 平台
wiinhe: 768, // 窗口高度
wiouhe: '800' // 外部高度
},
be: {
ec: { // 事件计数
mm: 5, // mousemove
md: 3, // mousedown
cl: 3, // click
mu: 3 // mouseup
},
el: [ // 事件列表
'10|md|55,55|100|55,55',
'10|mu|55,55|50|55,55',
'10|cl|55,55|10|55,55'
]
},
dist: '0-4-8' // 选中的图片索引
}{
ev: { /* 同上 */ },
be: {
ec: {
md: 1,
mm: 20,
mu: 1
},
el: [
'|md|10,150|0|10,150',
'|mm|20,150|25|20,150',
'|mm|30,150|28|30,150',
// ...
'|mu|200,150|50|200,150'
],
th: { // 滑块信息
el: [ // 滑块事件
'md|10,20',
'mm|15,22'
],
si: { // 滑块尺寸
w: '44',
h: '44'
}
}
},
dist: '185', // 滑动距离
imageWidth: '310' // 图片宽度
}mousemove -> mm
mousedown -> md
click -> cl
mouseup -> mu
touchstart -> ts
touchmove -> tm
touchend -> te
touchcancel -> tc
mouseenter -> me
# 安装依赖(如果需要)
npm install
# 运行示例
node captcha_example.js- 图像识别:代码中的
selectedImages和slideDistance需要通过图像识别 API 获取 - 行为模拟:当前的行为数据是简化的,实际使用时应该更加真实
- 频率限制:注意 API 调用频率,避免被封禁
- 环境检测:某些环境(如 Selenium)可能被检测到,需要做反检测处理
- 使用 YOLO/SSD 等目标检测模型
- 识别图片中的目标物体(如交通灯、汽车等)
- 返回包含目标的图片索引
- 使用边缘检测算法找到缺口位置
- 计算滑块需要移动的距离
- 考虑图片缩放比例
-
行为数据优化
- 添加更多随机性
- 模拟真实的鼠标轨迹(贝塞尔曲线)
- 添加合理的时间间隔
-
环境伪装
- 隐藏 WebDriver 特征
- 伪造插件列表
- 修改 User-Agent
-
并发控制
- 使用代理池
- 控制请求频率
- 实现重试机制
仅供学习研究使用,请勿用于非法用途。
DreamLand
4.65.2

