# 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 的返回值。