2.3 KiB
2.3 KiB
Weapon KAW/KAS 纯 Python 还原
静态调用链
APP 的 Weapon 请求拦截器按以下顺序构造请求头:
kaw = WeaponHI.g(context),对应配置项z_y_x_a。payload = encodedPath + (__NS_sig3 or "") + kaw。kas = WeaponHI.a(payload, "")。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 流程:
- 按 JNI modified UTF-8 编码 payload。
- 对 payload 做标准 Base64。
- 使用 Weapon 自定义 IV 的 BLAKE2s 分块逻辑生成 8 个 uint32。
- 将 8 个字格式化为小写十六进制文本。
- 对前 16 个字符执行
$AI_同源的固定加法/XOR 变换。 - 在 16 字节结果前加
00,输出 34 个十六进制字符。
四组 APP 抓取向量已同时由纯 Python 实现和 libw.so Unicorn oracle 验证。
KAW 来源
CLI 优先级如下:
--weapon-kawKS_WEAPON_KAW- 本次显式加载的 app-fields 中的
weapon_kaw或kaw out/app_login_fields_latest.json中独立缓存的weapon_kaw或kaw- 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_kaw 和 has_kas 应均为 true。
KAW/KAS 只补齐 APP 的 Weapon 请求证明。服务端返回 705 时给出的
captchaToken 和 Cookie 绑定属于后续交互式验证链,不是 KAS 的返回值。