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提取, 中间表示, 云安全监控, 代码分析, 凭证管理, 去混淆, 反编译, 可配置连接, 字节码, 安全防御评估, 常量传播, 抽象语法树, 源到源转换, 程序分析, 编译器技术, 请求拦截, 静态分析