72 lines
2.3 KiB
Markdown
72 lines
2.3 KiB
Markdown
# Weapon KAW/KAS 纯 Python 还原
|
||
|
||
## 静态调用链
|
||
|
||
APP 的 Weapon 请求拦截器按以下顺序构造请求头:
|
||
|
||
1. `kaw = WeaponHI.g(context)`,对应配置项 `z_y_x_a`。
|
||
2. `payload = encodedPath + (__NS_sig3 or "") + kaw`。
|
||
3. `kas = WeaponHI.a(payload, "")`。
|
||
4. `WeaponHI.a` 调用 `W.pr(99999, 2, payload.length() * 2, payload)`。
|
||
|
||
KAW 是版本/远端配置材料,不按账号计算。KAS 绑定最终 URL,必须在
|
||
`sig/__NS_sig3` 完成后逐请求生成。
|
||
|
||
## mode=2 公式
|
||
|
||
`core.weapon_kas.generate_weapon_kas` 复现以下 native 流程:
|
||
|
||
1. 按 JNI modified UTF-8 编码 payload。
|
||
2. 对 payload 做标准 Base64。
|
||
3. 使用 Weapon 自定义 IV 的 BLAKE2s 分块逻辑生成 8 个 uint32。
|
||
4. 将 8 个字格式化为小写十六进制文本。
|
||
5. 对前 16 个字符执行 `$AI_` 同源的固定加法/XOR 变换。
|
||
6. 在 16 字节结果前加 `00`,输出 34 个十六进制字符。
|
||
|
||
四组 APP 抓取向量已同时由纯 Python 实现和 `libw.so` Unicorn oracle 验证。
|
||
|
||
## KAW 来源
|
||
|
||
CLI 优先级如下:
|
||
|
||
1. `--weapon-kaw`
|
||
2. `KS_WEAPON_KAW`
|
||
3. 本次显式加载的 app-fields 中的 `weapon_kaw` 或 `kaw`
|
||
4. `out/app_login_fields_latest.json` 中独立缓存的 `weapon_kaw` 或 `kaw`
|
||
5. APK 内置 `z_y_x_a` 回退值
|
||
|
||
从已有稳定探针日志提取一次当前版本 KAW:
|
||
|
||
```powershell
|
||
uv run python -m tools.extract_app_login_fields `
|
||
--log out/probe_login_stable_20260726_214809.log `
|
||
--out out/app_login_fields_latest.json
|
||
|
||
```
|
||
|
||
之后 CLI 会独立读取 latest 文件里的 KAW,不会顺带复用其中的手机号、
|
||
设备或 passport 字段。KAW 可跨账号复用,KAS 会按各请求的 path 和
|
||
`__NS_sig3` 现场计算。新日志没有 KAW 时,提取器会保留现有 latest
|
||
文件中的版本级 KAW,避免退回 APK 内置值。
|
||
|
||
## 验证
|
||
|
||
纯 Python 向量:
|
||
|
||
```powershell
|
||
uv run python -m unittest tests.test_weapon_kas -v
|
||
```
|
||
|
||
本地 native 对照:
|
||
|
||
```powershell
|
||
uv run --with pyelftools --with unicorn `
|
||
python -m unittest tests.test_libw_pr_oracle -v
|
||
```
|
||
|
||
只测手机号预检时,终端应出现 `KAS 纯 Python 已启用`,请求元数据中的
|
||
`has_kaw` 和 `has_kas` 应均为 true。
|
||
|
||
KAW/KAS 只补齐 APP 的 Weapon 请求证明。服务端返回 705 时给出的
|
||
`captchaToken` 和 Cookie 绑定属于后续交互式验证链,不是 KAS 的返回值。
|