ksjsb/docs/weapon_kas.md
2026-07-30 20:25:56 +08:00

2.3 KiB
Raw Blame History

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_kawkaw
  4. out/app_login_fields_latest.json 中独立缓存的 weapon_kawkaw
  5. APK 内置 z_y_x_a 回退值

从已有稳定探针日志提取一次当前版本 KAW

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 向量:

uv run python -m unittest tests.test_weapon_kas -v

本地 native 对照:

uv run --with pyelftools --with unicorn `
  python -m unittest tests.test_libw_pr_oracle -v

只测手机号预检时,终端应出现 KAS 纯 Python 已启用,请求元数据中的 has_kawhas_kas 应均为 true。

KAW/KAS 只补齐 APP 的 Weapon 请求证明。服务端返回 705 时给出的 captchaToken 和 Cookie 绑定属于后续交互式验证链,不是 KAS 的返回值。