-
-
[原创]某音a_bogus 参数醇酸流程与风控检测点深度分析报告
-
发表于: 8小时前 160
-
某音a_bogus 参数醇酸流程与风控检测点深度分析报告
搞了好几天,有点麻烦。
日志传不上来
本人菜鸟,后面有点迷糊了,有错误欢迎大佬们指出。

一、文档概述
本文档基于分析报告1和日志11,完整剖析抖音 a_bogus 参数的生成流程及其中嵌入的风控检测机制。报告分为两大部分:
- a_bogus 生成流程详解:完整还原从 URL 预处理到最终编码的20个步骤
- 风控检测点分析:深入分析日志中暴露的各类风控检测机制
二、a_bogus 生成流程详解
阶段一:URL+UA 双层加密预处理
步骤一:URL 拼接 + 第一轮 SM3 哈希
- 日志节点:[46858]
- 操作:原始请求 URL 尾部拼接固定后缀字符串
dhzx,执行标准 SM3 哈希 - 输出:32 字节哈希数组
步骤二:魔改 RC4 加密 UA
- 日志节点:[46949]
- 密钥:
\u0000\u0001\b - 魔改点:
- S盒倒置:
S[i] = 255 - i - j 迭代公式:
j = (j * S[i] + j + key[i%keylen]) % 256 - PRGA 循环次数 = UA 长度(125),提前终止
- S盒倒置:
- 输出:加密后的 UA 密文
步骤三:自定义 S3 码表 Base64 编码
- 日志节点:[68690]
- 操作:使用内部自定义 S3 码表对 RC4 密文进行 Base64 编码
- 输出:编码字符串
步骤四:二次 SM3 哈希 + 版本解析
- 日志节点:[72810] / [72831]
- 操作:对 Base64 编码结果执行第二轮 SM3;版本号
1.0.1.19-fix.01解析为[1,0,1,0,1] - 输出:32 字节哈希数组 C + 版本特征数组
阶段二:环境、时间戳、随机数运算收敛
步骤五:运行环境采集
- 日志节点:[74441]
- 原始数据:
552|588|1280|672|1280|672|1280|720|Win32 - 转换:逐字符转 ASCII 字节
- 输出:环境字节数组
步骤六:毫秒时间戳处理
- 日志节点:[75438] / [75444]
- 操作:时间戳 + 3,取低8位,拼接逗号
- 输出:
[49, 52, 54, 44](如 "146,")
步骤七:版本数组切片
- 日志节点:[75579]
- 输出:版本数组前两位
[1,0]
步骤八:随机数混淆因子生成
- 日志节点:[75586]
- 输出:全局混淆常量 55、153
步骤九/十:多轮位运算生成 4 字节数组
- 日志节点:[7562575664] / [7689376932]
- 参与因子:随机数 55、153,固定掩码 0xAA、0x55,版本数组
- 输出:第一轮
[35,21,136,17],第二轮[137,17,170,85]
步骤十一:数组合并
- 日志节点:[76934~76950]
- 输出:8 字节数组
[35,21,136,17,137,17,170,85]
步骤十二:异或收敛
- 日志节点:[76955~77074]
- 操作:8 字节累加异或,再与固定常量(41、50、6、13等)二次异或
- 输出:单字节特征值 113
阶段三:核心 50 字节指纹数组构建
步骤十三:50 字节指纹构建
- 日志节点:[77126]
- 数据源分类:
| 类型 | 数量 | 说明 |
|---|---|---|
| 硬编码常量 | 24 | 固定标志位、填充值、魔数 |
| 环境检测 | 2 | 操作系统/浏览器类型标识 |
| 时间戳提取 | 12 | 多阶移位拆分的时间戳字节 |
| ID/版本派生 | 5 | aid、pageId、版本号处理 |
| SM3哈希 | 7 | 随机盐混入后的哈希字节 |
- 输出:
[1,8,21,217,0,143,0,0,1,198,1,3,156,24,13,131,159,0,217,239,50,44,153,0,29,74,153,48,6,24,3,0,92,82,3,0,159,97,177,0,1,0,0,41,135,48,40,0,4,0]
阶段四:多段拼接、二次 RC4、S4 编码
步骤十四:时间戳数组复用
步骤十五:95 字节中间数组合并
- 拼接组:50字节指纹 + 环境数组 + 时间戳数组 + 异或收敛值113
步骤十六:随机因子混淆重组
- 操作:对 95 字节数组做下标置换、位运算混合
- 输出:126 字节混淆数组
步骤十七:134 字节完整指纹
- 日志节点:[82741]
- 拼接:8 字节运算数组 + 126 字节混淆数组
步骤十八:标准 RC4 加密
- 日志节点:[86182]
- 密钥:
Ó - 输出:RC4 加密密文
步骤十九:前置段拼接
- 日志节点:[77982]
- 前置段:
[171, 70, 88, 18]→«FX - 拼接:前置段 + RC4 密文
步骤二十:S4 编码输出
- 操作:自定义 S4 码表编码
- 输出:最终
a_bogus参数
三、风控检测点深度分析
3.1 鼠标轨迹检测(核心风控)
数据结构
{
"items": [
{"x": 342, "y": 297, "ts": 1783226603602},
{"x": 347, "y": 297, "ts": 1783226603628},
{"x": 351, "y": 297, "ts": 1783226603661},
// ... 更多轨迹点
],
"front": 0,
"rear": 74,
"trigger": 74
}
检测特征分析
| 特征 | 说明 | 检测目的 |
|---|---|---|
| 坐标连续性 | x/y 变化呈平滑曲线,非跳跃式 | 区分人类操作与自动化脚本 |
| 时间间隔 | 相邻点 ts 差约 20-40ms,符合人类移动速度 | 检测匀速机械运动 |
| 停留点 | 相同坐标持续多个时间戳 | 模拟人类阅读/思考行为 |
| 方向变化 | 轨迹包含自然的加速减速 | 检测算法生成的伪随机轨迹 |
日志中的轨迹模式
从日志 [46800] 可见,轨迹数据包含:
- Move 事件(通道0):完整的鼠标移动轨迹,74个有效点
- ClickStart 事件(通道1):鼠标按下位置记录
- ClickEnd 事件(通道2):鼠标释放位置记录
3.2 键盘输入检测
数据结构
{
"items": [
{"target": "04:15", "mode": 1, "ts": 1783226604203},
{"target": "04:15%0A3.3%E4%B8%87", "mode": 1, "ts": 1783226604219},
{"target": "04:15%0A3.3%E4%B8%87", "mode": 0, "ts": 1783226606935},
// ... 更多输入记录
],
"front": 13,
"rear": 25,
"trigger": 38
}
字段含义
| 字段 | 含义 |
|---|---|
target |
输入框内容(URL 编码) |
mode |
1=输入中,0=输入结束 |
ts |
时间戳 |
检测特征
- 输入速度:连续输入的时间间隔是否符合人类打字速度
- 输入内容:是否包含正常中文内容(如 "这句话肉到没人能顶住#动漫解说#")
- 输入模式:是否有正常的编辑操作(增删改)
3.3 点击事件检测
事件类型映射
{"0": "Move", "1": "ClickStart", "2": "ClickEnd", "Move": 0, "ClickStart": 1, "ClickEnd": 2}
检测逻辑
- 点击位置与轨迹一致性:点击点是否在鼠标移动轨迹附近
- 点击间隔:双击或连续点击的时间间隔是否合理
- 点击区域:是否点击在可交互元素上
3.4 设备环境检测
分辨率与屏幕信息
552|588|1280|672|1280|672|1280|720|Win32
| 字段 | 含义 |
|---|---|
| 552 | 窗口宽度 |
| 588 | 窗口高度 |
| 1280 | 屏幕宽度 |
| 672/720 | 屏幕高度/可用高度 |
| Win32 | 操作系统标识 |
检测目的
- 验证设备信息的真实性(常见分辨率组合)
- 检测模拟器/虚拟机环境(异常分辨率)
- 识别自动化工具(固定不变的分辨率)
3.5 时间戳一致性检测
多维时间数据
| 来源 | 用途 |
|---|---|
| 主时间戳 | 50 字节指纹数组构建 |
| 轨迹点 ts | 鼠标行为时序验证 |
| 键盘输入 ts | 输入行为时序验证 |
| 时间差计算 | 天数差、时间偏移 |
检测逻辑
- 时间连续性:各检测点时间戳是否在同一时间段内
- 时间前进性:后续事件时间戳是否大于前序
- 时区一致性:时间戳与地区匹配
3.6 版本号与客户端标识
版本解析
- 原始版本:
1.0.1.19-fix.01 - 解析结果:
[1,0,1,0,1]
检测目的
- 验证客户端版本的合法性
- 检测过时或篡改的客户端
- 版本号作为指纹的一部分参与签名
四、风控检测与 a_bogus 的关联
4.1 数据流向图
用户行为采集层
│
├── 鼠标轨迹 ───────┐
├── 键盘输入 ───────┤
├── 点击事件 ───────┤
│ ▼
│ 行为数据预处理
│ │
│ ▼
│ 环境信息采集
│ (分辨率/系统/时间)
│ │
│ ▼
│ 50字节指纹数组构建
│ │
│ ▼
│ 多轮混淆与加密
│ │
▼ ▼
风控决策层 ←────── a_bogus参数
│ │
│ └──→ 服务端验证
│ │
└────────←──────────────────────┘
验证结果反馈
4.2 风控数据在 a_bogus 中的嵌入方式
- 直接嵌入:环境信息(分辨率、系统)直接转 ASCII 嵌入 50 字节数组
- 哈希混入:行为数据参与 SM3 哈希计算,结果间接影响指纹数组
- 时间戳绑定:所有时间相关数据参与运算,形成时间绑定签名
- 随机数因子:基于环境特征生成的随机数因子,增加不可预测性
4.3 服务端验证逻辑
服务端收到 a_bogus 后:
- 解码验证:使用 S4/S3 码表解码,验证格式合法性
- RC4 解密:使用固定密钥解密,验证完整性
- 指纹提取:提取 50 字节核心指纹
- 环境验证:比对环境信息(UA、版本、分辨率)
- 行为分析:分析嵌入的行为特征,判断是否为人类操作
- 时间验证:验证时间戳的有效性和连续性
- 签名比对:验证 SM3 哈希值的正确性
五、安全设计特征总结
5.1 多层防护体系
| 层级 | 防护手段 | 目的 |
|---|---|---|
| 第一层 | URL+dhzx+SM3 | 绑定请求,防篡改 |
| 第二层 | 魔改 RC4 + S3 编码 | 混淆 UA,增加逆向难度 |
| 第三层 | 多轮位运算 + 异或收敛 | 混合动态因子,防预测 |
| 第四层 | 50 字节指纹 + 环境信息 | 绑定设备,防重放 |
| 第五层 | 随机因子混淆 + 二次 RC4 | 引入随机性,防模拟 |
| 第六层 | S4 编码 | 最终输出,防解析 |
5.2 行为特征验证
| 验证维度 | 检测内容 |
|---|---|
| 鼠标轨迹 | 坐标连续性、时间间隔、停留点 |
| 键盘输入 | 打字速度、内容合理性、编辑模式 |
| 点击模式 | 位置一致性、间隔合理性 |
| 时间序列 | 连续性、前进性、时区一致性 |
| 环境特征 | 分辨率、系统、UA、版本 |
5.3 反自动化策略
- 动态因子:时间戳 + 随机数,每次请求唯一
- 环境绑定:设备信息嵌入签名,跨设备失效
- 行为验证:采集人类行为特征,区分机器操作
- 混淆编码:自定义编码表,增加逆向成本
- 魔改算法:RC4 魔改,标准库无法直接解密
六、绕过策略分析
6.1 环境模拟要点
| 检测项 | 模拟要求 |
|---|---|
| UA | 必须与真实浏览器一致 |
| 分辨率 | 使用常见分辨率组合 |
| 系统标识 | Win32/macOS/Linux |
| 版本号 | 使用合法版本字符串 |
| 时间戳 | 使用当前真实时间 |
6.2 行为数据伪造策略
鼠标轨迹生成
- 使用贝塞尔曲线生成平滑轨迹
- 加入随机抖动模拟人类操作
- 控制移动速度在合理范围内
- 添加停留点模拟阅读行为
键盘输入模拟
- 使用自然打字速度(100-200ms/字符)
- 包含正常编辑操作(删除、修改)
- 输入内容符合场景逻辑
6.3 代码还原要点
- SM3 算法:标准实现,需注意 UTF-8 编码
- 魔改 RC4:实现倒置 S盒和乘法迭代
- 自定义 Base64:提取 S3/S4 码表
- 50 字节指纹:完整还原各索引计算逻辑
- 位运算收敛:逐字节还原异或运算
七、总结
a_bogus 参数是抖音多层安全防护体系的核心组成部分,集成了:
- 加密混淆层:SM3 哈希、魔改 RC4、自定义编码
- 设备指纹层:UA、版本、分辨率、系统信息
- 行为特征层:鼠标轨迹、键盘输入、点击事件
- 时间绑定层:多维度时间戳参与运算
通过将风控检测数据深度嵌入签名参数,抖音实现了请求合法性、设备真实性、行为自然性的三重验证。逆向分析需同时攻克加密算法还原和环境行为模拟两大难题。
赞赏
赞赏
雪币:
留言: