opalj/opal
GitHub: opalj/opal
一个用 Scala 编写的可扩展 Java 字节码分析与工程化框架,覆盖从字节码解析、静态分析到架构验证的完整工具链。
Stars: 76 | Forks: 33

# 概述
OPAL 是一个用于分析和工程化 Java 字节码的可扩展库。
OPAL 完全使用 Scala 编写,并利用 Scala 的高级语言特性,提供了前所未有的灵活性和易用性。
OPAL 从一开始就本着*可扩展性*、*可适应性*和*可伸缩性*(内存和性能方面)的理念进行设计。
OPAL 的许多部分要么已经实现了并行化,要么提供了实现高度并发分析的必要基础设施,或者至少是线程安全的。
## 主要项目
OPAL 由以下几个项目组成:
* **Common** (OPAL/common):包含在分析(字节)代码时非常有用的通用函数、数据结构(例如 TrieMaps)和图算法(例如,计算强连通分量、计算支配者信息等)。
* **Static Analysis Infrastructure** (OPAL/si):包含一个基于格的通用框架,用于实现模块化的静态分析。
* **Bytecode Infrastructure** (OPAL/bi):解析 Java 1.0 到 Java 25 字节码所需的基础设施。
* **Bytecode Disassembler** (OPAL/da):一个 Java 字节码反汇编器,提供类文件的一一对应表示,可用于创建可读的 Java 类文件 HTML 表示形式。
* **Bytecode Creator** (OPAL/bc):用于工程化 Java 字节码的最基础基础设施。
* **Bytecode Assembler** (OPAL/ba):用于组装 Java 类文件的嵌入式 DSL。
* **Bytecode Representation** (OPAL/br):OPAL 的 Java 字节码基础表示形式。实现了对 Java 类文件进行基本分析的所有功能。
* **Abstract Interpretation Framework** (OPAL/ai):基于抽象解释框架的实现,可用于轻松实现不同精度级别的分析。
* **IFDS** (OPAL/ifds):与语言无关的 IFDS 算法实现。未来将移至 si 中。
* **IDE** (OPAL/ide):IDE 分析的通用实现。
* **Three Address Code** (OPAL/tac):提供两种基于三地址码的中间表示。一种是直接基于字节码创建的简单表示,另一种是更高阶的类 SSA 表示,它利用基本抽象解释的结果,直接提供 CFG 以及 Def-Use 信息。
* **Dependencies Extraction** (OPAL/de):提供对项目源代码依赖关系进行提取和分析的支持。该项目是其他项目(例如,用于检查架构)的基础。
* **Architecture Validation** (OPAL/av):一个小型框架,用于根据指定的架构来检查项目实际实现的架构。
* **Framework** (OPAL/framework):基本上只是聚合了所有子项目,以便能够轻松获取所有子项目的一致快照。通常,当您想使用 OPAL 时,建议声明对该项目的依赖。
* **Demos** (OPAL/demos):包含可运行的代码示例,演示如何使用 OPAL。Demo 项目中的代码主要作为教学资源。要运行这些示例,请启动 `sbt` 控制台 (Scala Build Tools) 并将当前项目切换为 "Demos"(`project Demos`)。之后您可以 `run` 几个小型的演示分析。
* **APK** (OPAL/apk):提供对解析 Android APK 包的支持,支持 DEX 和原生代码。
## 开发者工具
OPAL 还附带了许多不断增加的工具,旨在帮助开发者熟悉 Java 字节码和/或 OPAL。这些项目位于 `DEVELOPING_OPAL/tools` 文件夹中,可以使用 SBT 控制台运行。
## 构建 OPAL
以下内容适用于“Master/Develop”分支。
OPAL 使用 SBT 作为其构建工具,使用 SBT 控制台操作 OPAL 尤为简单。
请确保您至少安装并运行了 Java 16(运行 OPAL,即不编译测试固件,在 Java 8 下应该仍然可以正常工作)、Scala 3.7.3 和 SBT 1.11.7,并且 SBT 可以使用至少 4GB 的内存(-Xmx4G)。下载 OPAL 的最新快照或克隆仓库。
进入 OPAL 的根文件夹。
* 调用 `sbt cleanBuild`。这将编译所有核心项目(包括测试),生成项目级别的 ScalaDoc 文档,并将项目发布到您的本地 ivy 目录。
* [可选 - 但强烈推荐] 编辑文件 `local.sbt` 并指定两个系统属性(`JAVA_OPTS`):`-Dorg.opalj.threads.CPUBoundTasks=8
-Dorg.opalj.threads.IOBoundTasks=24` - 根据您的机器将值设置为适当的值(`CPUBoundTasks === "实际 CPU(核心)数量"`,`IOBoundTasks === "(超线程)核心数 * 1.5"`)。您也可以在使用 sbt 时通过输入以下命令来设置这些属性:
`eval sys.props("org.opalj.threads.CPUBoundTasks") = "1"`。
* 调用 `sbt test` 运行单元测试,以测试一切是否按预期工作。请注意,某些测试会生成一些附加的(彩色)输出。但是,只要所有测试都成功且没有错误,一切就没有问题。*如果 `sbt test` 失败,可能是由于内存不足。在这种情况下,需要为 SBT 本身分配更多内存。*
* 调用 `stest it:test` 运行集成测试套件。执行此测试套件可能需要很长时间(在具有 32GB 内存和 8 核心的快速台式机上大约需要 2 小时)。
您已准备就绪。
**故障排除**
如果在构建 OPAL 时遇到问题,请考虑以下选项。
- 确保您的编辑器/sbt/... 使用了正确的文件编码。所有文件均使用 UTF-8 编码。(这在您使用 Windows 时尤为重要。)
- 增加堆内存大小;要构建并运行所有测试,您应该为 sbt 分配至少 12GB 的内存。
## 使用 OPAL
要开始使用,请访问[项目网页](http://www.opal-project.de)。此外,`Demos` 项目中的代码包含许多较短的示例,演示了如何解决常见的重复性任务。大多数示例可以直接执行。
## 使用示例
启动 sbt 控制台。(在 OPAL 的根文件夹中,在命令行调用 `sbt`。)
使用命令 `project Demos` 将项目切换到 Demos,然后输入 `run` 来运行其中一个演示。
# 更多信息
* [关于如何编写分析的问题 (Stackoverflow)](http://stackoverflow.com/questions/tagged/opal-framework?sort=newest)
* [OPAL 项目](http://www.opal-project.de)
标签:AI SDK, GHAS, IFDS算法, Java字节码, Java安全, odt, Scala, Wayback Machine, 代码安全分析, 反汇编, 图算法, 字节码工程, 并发编程, 抽象解释, 抽象语法树, 编译器后端, 软件分析工具, 错误基检测, 静态代码分析, 静态分析框架