Kasada ips.js — 是全局 JSVMP 吗?

本文最后更新于:2026年7月24日 晚上

简短结论

不完全是”全局 JSVMP”,但核心逻辑确实跑在一个自定义字节码 VM 里。

区别在于”全局”这个词。像国内一些站点(拼多多 anti_content、某些 _signature)那种,是把整个入口逻辑几乎全量编译成字节码,外面只留一层极薄的解释器入口,属于比较彻底的全局虚拟化。Kasada 的 ips.js(新版路径里也叫 p.js)结构上更像是”VM 解释器 + 字节码 + 常规胶水/库代码”的混合体。

脚本结构拆解

从公开的逆向分析看(OPCODES 那篇经典文章),把脚本 dump 出来大致能分成三块:

1
2
3
4
5
6
7
8
9
10
┌─────────────────────────────┐
│ 顶部:虚拟机逻辑 │ ← 自定义字节码解释器
│ (解释器 + 加载器) │
├─────────────────────────────┤
│ 中间:常规库代码 │ ← 两个有 license 头的库
│ (工具函数、环境探测外壳) │
├─────────────────────────────┤
│ 底部:字节码 │ ← 核心挑战逻辑
│ (PoW、指纹、行为检测) │
└─────────────────────────────┘

关键点:

  • 加载器、部分工具库、环境探测的外壳 — 并没有被虚拟化,是直接可读的 JS
  • 真正被塞进字节码、对你不可读的 — 核心挑战逻辑

PoW 计算、指纹采集、行为检测这些都编译进了 Kasada 专有的字节码,由自定义解释器执行。

对逆向来说的几个关键点

1. VM 让挑战逻辑不透明

VM 的设计让挑战逻辑本身是不透明的——你没法像读 Akamai 的 sensor_data 脚本那样把它当 JS 读懂再复现。逆向的着力点不是”理解算法”,而是”理解 VM 指令集 → dump 字节码 → 运行时跟踪执行流”。

2. 字节码频繁轮换

字节码会频繁轮换,任何在非浏览器环境里模拟 VM 的做法通常几天内就失效。所以指令集 + opcode 语义不是一次性逆完就完事的,需要持续跟踪

3. 产物是三个 header

Header 说明
x-kpsdk-ct 昂贵的会话级 PoW token
x-kpsdk-cd 由会话派生的每请求廉价 token
x-kpsdk-v 版本 pin

三个都得在受保护请求上同时有效,缺一不可。

最终判断

判断标准 结论
整份脚本是否被单一 VM 全量虚拟化 ❌ 否 — 加载器、工具库、环境探测外壳仍是明文 JS
敏感逻辑是否用 JSVMP 保护 ✅ 是 — 核心挑战逻辑全部编译进字节码

参考文献


Kasada ips.js — 是全局 JSVMP 吗?
https://kingjem.github.io/2026/07/21/Kasada-ips-js-JSVMP分析/
作者
Ruhai
发布于
2026年7月21日
许可协议