# acw_sc__v2 生成器
从混淆的HTML代码中提取的 `acw_sc__v2` cookie 生成函数。
## 文件说明
### JavaScript版本
- **acw_sc__v2_generator.js** - JavaScript版本的生成函数,可直接在浏览器控制台中使用
### Python版本
- **acw_sc__v2_fixed.py** - 简化版Python生成器,适合快速使用
- **acw_sc__v2_complete.py** - 完整版Python生成器,包含更多功能和错误处理
- **acw_sc__v2_simple.py** - 最简化版本,直接使用硬编码密钥
## 使用方法
### JavaScript版本
在浏览器控制台中执行:
```javascript
// 加载acw_sc__v2_generator.js文件后
var arg1 = '1EEB3321F0286855D50CD9E96C1CDF3D4A913DB0';
var acwScV2 = generateAcwScV2(arg1);
console.log('acw_sc__v2的值:', acwScV2);
// 设置cookie(可选)
setAcwScV2Cookie(acwScV2);
```
### Python版本
#### 简化版(acw_sc__v2_fixed.py)
```python
from acw_sc__v2_fixed import generate_acw_sc_v2
arg1 = '1EEB3321F0286855D50CD9E96C1CDF3D4A913DB0'
acw_sc_v2 = generate_acw_sc_v2(arg1)
print(f'acw_sc__v2的值: {acw_sc_v2}')
```
#### 完整版(acw_sc__v2_complete.py)
```python
from acw_sc__v2_complete import AcwScV2Generator, generate_acw_sc_v2
# 方法1:使用便捷函数
arg1 = '1EEB3321F0286855D50CD9E96C1CDF3D4A913DB0'
result = generate_acw_sc_v2(arg1)
print(f'acw_sc__v2的值: {result}')
# 方法2:使用生成器类
generator = AcwScV2Generator()
result = generator.generate(arg1)
print(f'acw_sc__v2的值: {result}')
# 方法3:批量生成
test_args = [
'1EEB3321F0286855D50CD9E96C1CDF3D4A913DB0',
'A13D8B4174A10C57667C1CD92E54D01F449CA76E',
'F0286855D50CD9E96C1CDF3D4A913DB01EEB3321'
]
batch_results = generator.generate_batch(test_args)
for arg, res in batch_results.items():
print(f'{arg} -> {res}')
# 方法4:使用自定义密钥
custom_key = 'YXBwbHk=' # Base64编码的密钥
generator.set_key(custom_key)
result = generator.generate(arg1)
print(f'使用自定义密钥的acw_sc__v2值: {result}')
```
## 核心算法
### 1. 字符重排
根据索引映射数组 `m` 重新排列输入字符串 `arg1`:
```python
m = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24]
```
### 2. 密钥解码
将Base64编码的密钥解码为十六进制字符串:
```python
key_encoded = 'Aw5PDg9JAw4='
key_hex = base64.b64decode(key_encoded).hex()
# 结果: '030e4f0e0f49030e'
```
### 3. 异或运算
将重排后的字符串与解码后的密钥进行按位异或:
```python
for x in range(0, min(len(u), len(p)), 2):
u_sub = u[x:x+2]
p_sub = p[x:x+2]
a = format(int(u_sub, 16) ^ int(p_sub, 16), '02x')
v += a
```
## 输入输出示例
### 输入
```python
arg1 = '1EEB3321F0286855D50CD9E96C1CDF3D4A913DB0'
```
### 输出
```python
acw_sc__v2 = '5ad70a13004a0290'
```
## 注意事项
1. **输入长度**:`arg1` 必须是40位的十六进制字符串
2. **输入格式**:`arg1` 必须是有效的十六进制字符串
3. **密钥**:默认使用内置密钥,也可以自定义密钥
4. **输出格式**:输出为十六进制字符串
## 错误处理
完整版生成器包含以下错误处理:
- 输入长度验证
- 输入格式验证
- Base64解码错误处理
- 异常捕获和错误信息输出
## 应用场景
- 网站爬虫:绕过阿里云CDN的反爬虫保护
- 安全测试:测试网站的反爬虫机制
- 学习研究:了解混淆JavaScript代码的逆向工程
## 技术细节
### 混淆技术
原始HTML代码使用了多种混淆技术:
1. **字符串编码**:Base64编码 + URL编码
2. **变量名混淆**:使用无意义的变量名
3. **控制流混淆**:使用闭包和条件函数
4. **反调试**:通过数学计算和正则表达式检测调试器
### 逆向工程
通过分析原始代码,提取出核心算法:
1. 移除反调试逻辑
2. 简化字符串解码
3. 提取核心计算逻辑
4. 重构为可读代码
## 性能优化
- 使用缓存机制避免重复解码
- 批量生成功能提高效率
- 简化算法减少计算量
## 安全提示
本工具仅供学习和研究使用,请勿用于非法用途。使用本工具绕过网站的反爬虫保护可能违反网站的使用条款。
## 许可证
本代码仅供学习和研究使用。
## 联系方式
如有问题或建议,请通过以下方式联系:
- 提交Issue
- 发送Pull Request
- 联系作者
## 更新日志
### v1.0.0 (2024-01-01)
- 初始版本发布
- 支持JavaScript和Python版本
- 包含完整的使用示例
## 致谢
感谢所有为逆向工程和反爬虫技术研究做出贡献的开发者。