验证码逆向专栏 | 某安登录流程详解与验证码逆向分析与识别
字数 1325 2025-08-19 12:41:18
某安登录流程与验证码逆向分析教学文档
一、目标分析
1.1 逆向目标
- 目标网站:某安登录界面
- 网址:aHR0cHM6Ly9hY2NvdW50cy5iaW5hbmNlLmNvbS96aC1DTi9sb2dpbg== (Base64编码)
- 主要验证码类型:九宫格点选验证码
二、登录流程分析
2.1 登录流程步骤
- 初始请求:进入登录页,输入账号密码点击下一步
- 获取验证码信息:
- 返回验证码类型、sessionId和validateId参数
- 获取验证码图片:
- 传入validateId获取图片地址、盐值salt、sig和点选问题tag
- 验证提交:
- 提交validateId、sig、data参数
- 验证成功返回token值
- 校验验证结果:
- 在check/result接口传入token校验
- 返回参数可用于后续登录接口
- 账号验证:
- 使用返回参数中的valid判断账号是否注册
三、验证码逆向分析
3.1 关键参数分析
data参数是九宫格验证接口中唯一的加密参数,生成流程如下:
-
定位加密位置:
- 通过跟栈方式定位到加密函数
- 关键函数调用链:t.apply → T函数 → D参数生成位置
-
加密流程分析:
- data参数由ek和轨迹明文加密得到
- 主要加密函数h包含平坦流混淆
- 最终通过
f[n("0x916", "h1Kz")](m, w, t)返回data参数
3.2 加密算法还原
方法一:完整扣代码
- 提取大数组、移位函数、解密函数模块
- 封装加密函数调用h函数
- 补全缺失的依赖函数(v、f等)
- 最终代码约800行
方法二:算法分析还原
-
ek处理:
var i = ek["split"]("")["reverse"]()["join"]("") -
eee函数算法:
function eee(w, c, e) { var i = "abcdhijkxy"; var t = 1; var x = []; for (var r = 0; r < c; r++) { var D = 0; var s = r * t; var K = r == (c - 1) ? (t + w.length % c) : t; for (var C = 0; C < K; C++) { var O = s + C; if (O < w.length) { D += w.charCodeAt(O); } } D = D * (e || 31); x.push(i.charAt(D % i.length)); } return x.join(""); } -
m函数算法:
if (!w) { return ""; } var e = w; var t = ""; for (var x = 0; x < e["length"]; x++) { t += String.fromCharCode(e["charCodeAt"](x)^ c["charCodeAt"](x%c["length"])); } -
最终加密:
- 使用密钥c进行简单编码
- 最后通过d函数(base64)加密
四、九宫格模型训练
4.1 训练方法选择
- 纯分类实现
- 检测+分类实现
4.2 训练代码示例
import os
import shutil
import random
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.optimizers import SGD
# 参数配置
config = {
'train_data': './data',
'val_data': './data',
'input_shape': (60, 60, 3),
'batch_size': 32,
'nb_epoch': 100,
'workers': 1,
'learning_rate': 0.001,
'momentum': 0.9,
'reduce_lr_patience': 4,
'early_stopping_patience': 10,
'model_name': 'tuili',
'base_model_path': None # 预训练模型为空就用ResNet50
}
def split_dataset(dataset_dir, train_dir, val_dir, val_ratio=0.2):
"""划分数据集为训练集和验证集"""
# 实现代码略...
def prepare_data(data_dir, val_data_dir, input_shape, batch_size):
"""数据预处理和加载"""
# 实现代码略...
def build_model(input_shape, num_classes, base_model_path=None):
"""构建模型"""
# 实现代码略...
def main():
# 数据集划分(如果需要)
# split_dataset(config['dataset_dir'], config['train_dir'], config['val_dir'])
train_ds, val_ds = prepare_data(config['train_data'], config['val_data'],
config['input_shape'], config['batch_size'])
# 获取类别数
num_classes = len(train_ds.class_indices)
# 构建模型
model = build_model(config['input_shape'], num_classes, config['base_model_path'])
# 模型训练
# 实现代码略...
if __name__ == '__main__':
main()
4.3 推理部署
- 模型转换:将模型转为ONNX格式
- 推理代码示例:
import onnxruntime
import numpy as np
import cv2
from PIL import Image
class OCR():
def __init__(self, model_path):
self.ort_session = onnxruntime.InferenceSession(model_path)
def inference(self, img_tensor):
inputs = {self.ort_session.get_inputs()[0].name: img_tensor}
outInfo = self.ort_session.run(None, inputs)[0]
result_index = int(np.argmax(outInfo))
class_names = ['大象', '熊猫', '狗', '猫', '自行车', '船', '车', '飞机', '鱼', '鸟']
result = class_names[result_index]
return result
def preprocess_image(self, img):
img = cv2.resize(img, (110, 110))
img = np.asarray(img).astype(np.float32)
img = np.expand_dims(img, axis=0)
return img
def split_image(img):
"""分割九宫格图片"""
# 实现代码略...
def identify_grid_content(image_path, model_path):
"""识别九宫格内容"""
# 实现代码略...
# 使用示例
if __name__ == '__main__':
image_path = '1.jpg'
model_path = './mouan.onnx'
results = identify_grid_content(image_path, model_path)
print(results)
五、风控检测分析
5.1 风控等级与验证码类型
- 环境正常:九宫格(bCaptcha2)
- 风险提升:
- Cloudflare(turnstile)
- reCaptcha(reCAPTCHA)
- 滑块(bCaptcha)
5.2 三级风控机制
- device-info:设备信息
- Cookies:
- BNC_FV_KEY_T
- se_gsd等
- 指纹:浏览器指纹等
5.3 风控表现
- 滑块出现:环境完全被标记为高风险
- 区号风控(mobileCode):
- 地理位置、设备不同登录同样受限
- 约1小时左右自动解除限制
- IP建议:爱尔兰IP风控相对较松
六、注意事项
-
代码使用:
- 仅供学习交流使用
- 不提供完整代码
- 严禁商业用途和非法用途
-
风控变化:
- 风控机制会持续更新
- 文档内容基于特定时间段分析结果
-
请求限制:
- 风控与请求量相关而非速度
- 区号风控后需等待自动恢复
七、参考资料
- 通杀空间推理验证码训练与识别
- 基于fastdeploy的多方法图标推理
- 相关配套工具(知识星球提供)
本教学文档详细分析了某安登录流程、验证码逆向方法和风控机制,包含关键算法还原和模型训练方法,适用于安全研究和验证码识别技术学习。