google/jsir
GitHub: google/jsir
基于MLIR架构的下一代JavaScript分析工具,旨在实现兼顾数据流分析与无损源码转换的代码反编译与去混淆。
Stars: 541 | Forks: 22
# JSIR - 下一代 JavaScript 分析工具
JSIR 是一个下一代 JavaScript 分析工具。其核心是一个基于 [MLIR](https://mlir.llvm.org) 的高级[中间表示](https://en.wikipedia.org/wiki/Intermediate_representation),它既支持[数据流分析](https://en.wikipedia.org/wiki/Data-flow_analysis),也支持无损转换回源代码。这种独特的设计使其非常适合用于源到源转换。
## 在 Google 的用例
JSIR 在 Google 被用于代码分析和转换用例。例如:
* **反编译**
JSIR 被用于将 [Hermes](https://github.com/facebook/hermes) 字节码一直反编译为 JavaScript 代码,利用了其能够完全提升回源代码的能力。
* **去混淆**:
JSIR 被用于通过利用其源到源转换能力来对 JavaScript 进行去混淆。请参阅我们关于如何结合 Gemini LLM 和 JSIR 进行去混淆的最新[论文](https://arxiv.org/abs/2507.17691)。
## 设计亮点
受 JavaScript 分析和转换的多样化用例驱动,JSIR 需要实现两个看似冲突的目标:
* 它需要足够**高级**,以便能够提升回 AST,从而支持源到源转换和反编译。
* 它需要足够**低级**,以便于数据流分析,从而支持污点分析、常量传播等。
为了实现这些目标,JSIR 定义了一个高级 IR,它使用 MLIR 区域来准确建模控制流结构。
详情请参阅 [intermediate_representation_design.md](docs/intermediate_representation_design.md)。
## 快速入门
### Docker(推荐)
使用 JSIR 最简单的方法是使用 Docker:
```
# 构建 Docker 镜像
docker build -t jsir:latest .
# 运行 jsir_gen
docker run --rm jsir:latest jsir_gen --help
# 分析 JavaScript 文件
docker run --rm -v $(pwd):/workspace jsir:latest jsir_gen --input_file=/workspace/yourfile.js
```
### 安装构建工具
我们仅在 Linux 上测试过 `clang`:
```
# 安装 clang:
sudo apt update
sudo apt install clang
```
我们使用 `Bazel` 构建系统。建议使用 `Bazelisk` 来管理 `Bazel` 版本:
```
# 通过 npm 安装 Bazelisk:
sudo apt install npm
sudo npm install -g @bazel/bazelisk
```
### 构建
注意:构建需要占用大量存储空间。如果空间不足,Bazel 将返回一个令人困惑的错误。
LLVM 获取和构建需要很长时间。我们可以通过构建其中一部分来测试 LLVM 是否已正确包含:
```
# 这将获取 LLVM 并构建其支持库:
bazelisk build @llvm-project//llvm:Support
```
要构建 JSIR:
```
# 构建所有内容:
bazelisk build //...
# 或者,构建单个目标:
bazelisk build //maldoca/js/ir:jsir_gen
# 或者,构建目录中的所有目标:
bazelisk build //maldoca/js/ir/...
```
### 测试
要运行测试用例:
```
# 运行所有测试:
bazelisk test //...
# 或者,运行特定测试:
bazelisk test //maldoca/js/quickjs:quickjs_test
# 或者,运行目录下的所有测试:
bazelisk test //maldoca/js/ir/conversion/...
```
### 运行 `jsir_gen` 工具
将 JavaScript 源文件转换为 JSHIR:
```
bazelisk run //maldoca/js/ir:jsir_gen --\
--input_file=$(pwd)/maldoca/js/ir/conversion/tests/if_statement/input.js \
--passes=source2ast,ast2hir
```
## 其他链接
* **Adversarial JavaScript Analysis with MLIR**
LLVM 开发者大会 2024 演讲
[YouTube](https://www.youtube.com/watch?v=SY1ft5EXI3I)
[Slides](https://llvm.org/devmtg/2024-10/slides/techtalk/Tan-JSIR.pdf)
* **CASCADE: LLM-Powered JavaScript Deobfuscator at Google**
关于结合 LLM + JSIR 进行 JavaScript 去混淆的论文
[arXiv](https://arxiv.org/abs/2507.17691)
## 免责声明
这不是 Google 的官方产品。
标签:CMS安全, DNS重绑定攻击, Docker, Google, Hermes, JavaScript, JSIR, LLVM, MLIR, Nuclei, odt, URL提取, 中间表示, 云安全监控, 代码分析, 凭证管理, 去混淆, 反编译, 可配置连接, 字节码, 安全防御评估, 常量传播, 抽象语法树, 源到源转换, 程序分析, 编译器技术, 请求拦截, 静态分析