使用 Python 模拟执行 JavaScript
前面我们了解了一些 JavaScript 逆向的调试技巧,通过这些方法,我们可以找到一些突破口,进而找到关键的方法定义。
比如说,通过一些调试,我们发现加密参数 token 是由 encrypt 方法产生的。如果里面的逻辑相对简单的话,那么我们可以用 Python 完全重写一遍。但是现实情况往往不是这样的,一般来说,一些加密相关的方法通常会引用一些相关标准库,比如说 JavaScript 就有一个广泛使用的库,叫作 crypto-js,这个库实现了很多主流的加密算法,包括对称加密、非对称加密、字符编码等。比如对于 AES 加密,通常我们需要输入待加密文本和加密密钥,实现如下:
const ciphertext = CryptoJS.AES.encrypt(message, key).toString();
对于这样的情况,我们其实没法很轻易地完全重写一遍,因为 Python 中并不一定有和 JavaScript 完全一样的类库。
那么,有什么解决方法吗?有的,既然 JavaScript 已经实现好了,那么我们 Python 直接模拟执行这些 JavaScript 得到结果不就好了吗?
本节中,我们就来了解使用 Python 模拟执行 JavaScript 的解决方案。
案例引入
这里我们先看一个和上文描述的情形非常相似的案例,链接是 https://spa7.scrape.center/ ,如图 11-69 所示。

这是一个 NBA 球星网站,用卡片的形式展示了一些球星的基本信息。另外,每张卡片上其实都有一个加密字符串,这个加密字符串其实和球星的信息是有关联的,并且每个球星的加密字符串也是不同的。
所以,这里我们要做的就是找出这个加密字符串的加密算法并用程序把加密字符串的生成过程模拟出来。
准备工作
本节中,我们需要使用 Python 模拟执行 JavaScript,这里我们使用的库叫作 PyExecJS。我们使用 pip3 命令安装它,具体如下:
pip3 install pyexecjs
PyExecJS 是用于执行 JavaScript 的,但执行 JavaScript 的功能需要依赖 JavaScript 运行环境,所以除了安装好这个库之外,我们还需要安装一个 JavaScript 运行环境,个人比较推荐的是 Node.js。更加详细的安装和配置过程可以参考: https://setup.scrape.center/pyexecjs 。
PyExecJS 库在运行时会检测本地 JavaScript 运行环境来实现 JavaScript 执行,做好如上准备工作之后,接着我们运行代码检查一下运行环境:
import execjs
print(execjs.get().name)
运行结果类似如下:
Node.js (V8)
如果你成功安装好 PyExecJS 库和 Nodejs 的话,其结果就是 Node.js(V8)。当然,如果你安装的是其他的 JavaScript 运行环境,结果也会有所不同。