Initial commit

This commit is contained in:
2026-05-24 21:47:44 +08:00
commit 2ce35563c4
20 changed files with 3698 additions and 0 deletions

216
UNIVERSALITY_ANALYSIS.md Normal file
View File

@@ -0,0 +1,216 @@
# 腾讯混元3D 签名算法泛用性分析
## 核心结论
**该签名算法具有"有限泛用性"** —— 只能在腾讯混元3D产品线内复用不能直接用于其他腾讯产品或第三方平台。
---
## 一、算法特征分析
### 1. 硬编码密钥派生
```python
C = bytes([122, 59, 92, 165, 30, 79, 166, 139, 142, 129, 139, 89, 219, 131, 101, 204])
D = bytes([122, 59, 92, 45, 30, 79, 106, 139, 156, 13, 46, 63, 74, 91, 108, 125])
U = [3, 5, 2, 7, 1, 4, 6, 2, 5, 3, 1, 4, 2, 6, 3, 5]
M = [14, 11, 13, 9, 15, 10, 12, 8, 6, 3, 5, 1, 7, 2, 4, 0]
```
**特征**:
- 使用 16 字节硬编码种子 `C`
- 通过 XOR + 循环左移 + 置换 派生密钥
- 最终密钥: `Hf6d6KFB3D`
**泛用性**: ❌ **低** — 这是腾讯混元3D特有的密钥派生方案其他产品使用不同的密钥。
### 2. 签名范围
```
签名只包含 URL 查询参数,不包含请求体
```
**特征**:
- 仅对 `timestamp` + `nonce` 签名
- 请求体数据不参与签名计算
- 使用 HMAC-SHA256输出 Hex
**泛用性**: ⚠️ **中等** — 这种"轻量级签名"模式在腾讯部分产品中有复用,但具体实现不同。
### 3. 参数排序规则
```python
# 过滤空值
# 按键名字母顺序排序
# 列表/字典使用 JSON 格式
```
**泛用性**: ⚠️ **中等** — 这是常见的签名参数处理模式,但不同产品的过滤规则和序列化方式可能不同。
---
## 二、可复用场景
### ✅ 可直接复用
| 场景 | 说明 |
|------|------|
| 腾讯混元3D所有API | 同一套签名算法适用于所有端点 |
| 混元3D的不同环境 | dev/pre/prod 使用相同算法(可能密钥不同)|
| 同一账号的不同请求 | 签名算法与账号无关 |
### ⚠️ 需要修改后复用
| 场景 | 需要修改的内容 |
|------|---------------|
| 腾讯其他产品(如混元大模型)| 硬编码常量 C/D/U/M 不同 |
| 其他公司的类似产品 | 整套算法可能完全不同 |
| 混元3D的移动端API | 可能使用不同的密钥或签名方式 |
### ❌ 无法复用
| 场景 | 原因 |
|------|------|
| 标准 OAuth/JWT 接口 | 完全不同的认证机制 |
| 使用 AK/SK 签名的云服务 | 使用 HMAC-SHA256 但密钥和消息格式不同 |
| 无签名的公开 API | 不需要签名 |
---
## 三、方法论的可复用性
虽然具体算法不能泛用,但**逆向方法论**可以复用:
### 1. webpack 模块提取
```javascript
// 适用于所有 webpack 打包的前端应用
const chunks = self.webpackChunk<app_name>;
for (const chunk of chunks) {
const modules = chunk[1];
// 搜索包含关键词的模块
}
```
**复用价值**: ⭐⭐⭐⭐⭐ — 所有 webpack 应用都适用
### 2. 签名定位技巧
```javascript
// Hook Math.random 和 Date.now
Math.random = () => { console.trace(); return 0.123; };
Date.now = () => { console.trace(); return 1779599999000; };
```
**复用价值**: ⭐⭐⭐⭐⭐ — 适用于所有前端签名逆向
### 3. 请求拦截分析
```javascript
// 拦截 fetch/XHR
const origFetch = fetch;
fetch = (...args) => {
console.log('Fetch:', args);
return origFetch(...args);
};
```
**复用价值**: ⭐⭐⭐⭐⭐ — 通用的前端请求分析技术
### 4. 密钥派生分析
```python
# 从字节数组派生密钥的模式
def derive_key(c, d, u, m):
# XOR -> 移位 -> 置换 -> 截断
...
```
**复用价值**: ⭐⭐⭐ — 密钥派生是常见模式,但具体变换不同
---
## 四、与其他腾讯产品的对比
| 产品 | 签名方式 | 密钥来源 | 与混元3D的相似度 |
|------|----------|----------|-----------------|
| 腾讯混元3D | HMAC-SHA256 | 硬编码派生 | 100%(基准)|
| 腾讯云 API | HMAC-SHA256 | 用户 SecretKey | 低(密钥不同)|
| 微信小程序 | SHA256 | 固定字符串+token | 中(算法类似)|
| QQ 音乐 | 未知 | 未知 | 未知 |
| 腾讯视频 | 未知 | 未知 | 未知 |
---
## 五、实际应用建议
### 场景1: 开发混元3D的自动化工具
**适用性**: ⭐⭐⭐⭐⭐
直接使用本项目的代码,无需修改。
### 场景2: 逆向其他腾讯产品
**适用性**: ⭐⭐⭐
可以复用方法论,但需要:
1. 重新提取 webpack 模块
2. 重新定位签名函数
3. 重新分析密钥派生逻辑
### 场景3: 学习前端逆向技术
**适用性**: ⭐⭐⭐⭐⭐
本项目是完整的前端逆向案例,涵盖:
- JS Bundle 分析
- webpack 模块提取
- 签名算法逆向
- 浏览器自动化测试
- Python 重写验证
### 场景4: 构建通用签名破解框架
**适用性**: ⭐⭐
可以构建半自动化工具:
```python
class SignatureCracker:
def extract_webpack_modules(self, url): ...
def locate_sign_function(self, modules, keywords): ...
def analyze_key_derivation(self, func_code): ...
def verify_signature(self, params, expected_sign): ...
```
但每个产品仍需要人工分析和调整。
---
## 六、技术价值评估
| 维度 | 评分 | 说明 |
|------|------|------|
| 算法复杂度 | ⭐⭐⭐ | 中等XOR+移位+置换)|
| 逆向难度 | ⭐⭐⭐⭐ | 较高webpack混淆|
| 代码质量 | ⭐⭐⭐⭐⭐ | 清晰可维护 |
| 文档完整性 | ⭐⭐⭐⭐⭐ | 详细文档 |
| 泛用性 | ⭐⭐ | 仅限混元3D |
| 方法论价值 | ⭐⭐⭐⭐⭐ | 可复用的逆向流程 |
---
## 七、总结
### 算法本身
- **不可泛用**: 硬编码常量和密钥派生方案是混元3D特有的
- **不可迁移**: 不能直接用于其他产品
### 方法论
- **高度可复用**: 逆向流程、工具、技巧适用于所有前端应用
- **学习价值高**: 完整展示了从 JS 混淆代码到 Python 实现的完整过程
### 建议
1. **直接使用**: 如果你需要调用混元3D API
2. **参考学习**: 如果你需要逆向其他前端应用
3. **扩展改进**: 可以构建更通用的前端逆向工具链