{"id":48658921,"url":"https://github.com/jar-analyzer/jar-analyzer-engine","last_synced_at":"2026-04-10T09:27:41.797Z","repository":{"id":345570898,"uuid":"1186307207","full_name":"jar-analyzer/jar-analyzer-engine","owner":"jar-analyzer","description":"Java bytecode analysis engine built on ASM, extracts method call graphs, inheritance trees, Spring routes, and string constants from JAR/WAR into SQLite. AI-friendly output for security auditing.","archived":false,"fork":false,"pushed_at":"2026-03-20T04:26:19.000Z","size":437,"stargazers_count":17,"open_issues_count":1,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-20T09:05:03.847Z","etag":null,"topics":["bytecode","call-graph","code-audit","java-asm","java-bytecode","static-analysis"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jar-analyzer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-19T13:44:01.000Z","updated_at":"2026-03-20T08:48:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jar-analyzer/jar-analyzer-engine","commit_stats":null,"previous_names":["jar-analyzer/jar-analyzer-engine"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/jar-analyzer/jar-analyzer-engine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jar-analyzer","download_url":"https://codeload.github.com/jar-analyzer/jar-analyzer-engine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-engine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31636572,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bytecode","call-graph","code-audit","java-asm","java-bytecode","static-analysis"],"created_at":"2026-04-10T09:27:40.248Z","updated_at":"2026-04-10T09:27:41.771Z","avatar_url":"https://github.com/jar-analyzer.png","language":"Java","readme":"\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e🔍 Jar Analyzer Engine\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Java 字节码分析引擎，将 JAR 文件解析 SQLite 数据库，用于安全审计代码分析（AI 友好）\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/jar-analyzer/jar-analyzer-engine/actions/workflows/maven.yml\"\u003e\n    \u003cimg src=\"https://github.com/jar-analyzer/jar-analyzer-engine/actions/workflows/maven.yml/badge.svg\" alt=\"Build Status\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Java-8%2B-orange\" alt=\"Java 8+\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/ASM-9.9.1-blue\" alt=\"ASM 9.9.1\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/SQLite-3.51-green\" alt=\"SQLite\" /\u003e\n  \u003ca href=\"https://github.com/jar-analyzer/jar-analyzer/blob/master/LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-MIT-red\" alt=\"License\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003e [English Version](README_EN.md)\n\n[更新日志](CHANGELOG.md)\n\n## 📖 简介\n\n**Jar Analyzer Engine** 是 Java 字节码安全分析 GUI 工具 [jar-analyzer](https://github.com/jar-analyzer/jar-analyzer) 的**核心引擎**，现已独立提取为可单独使用的命令行工具和编程库。\n\n\u003e `jar-analyzer` 项目连续 `5` 年更新，共发布 `58` 个版本，成熟稳定可用\n\n引擎基于 **ASM 字节码分析框架**，采用**多阶段流水线架构**，自动完成类发现、方法调用图构建、继承关系分析、字符串提取、Spring 路由识别、JavaWeb 组件识别等工作，并将所有结果输出为**结构化的 SQLite 数据库**。\n\n\u003e 💡 **推荐**：将生成的 SQLite 数据库集成到 `Claude Code` 等 AI 工具进行代码审计，结构化数据可使 AI 分析效率大幅提升\n\n\u003e 🤖 **AI 用户必读**：[DATABASE.md](DATABASE.md) 包含完整的数据库表结构与字段说明，请在使用 AI 分析数据库前将该文件提供给 AI 作为上下文参考\n\n感谢以下用户的赞赏和支持\n\n| 用户ID | 赞赏金额 |\n|--------|--------|\n| xrayl  | 50     |\n\n## ✨ 特性亮点\n\n- 🚀 **完整方法调用图** — 追踪所有 `invoke*` 指令（含 Lambda/方法引用），构建精确的 caller → callee 调用关系\n- 🧬 **继承关系分析** — 递归构建完整继承树，自动将子类 Override 方法加入调用图，解决多态分析难题\n- 🌱 **Spring MVC 识别** — 自动识别 Controller、解析 `@RequestMapping` 家族注解，提取完整 URL 路径\n- 🌐 **JavaWeb 组件发现** — 识别 Servlet、Filter、Listener、HandlerInterceptor\n- 📝 **字符串常量提取** — 从方法体 `LDC` 指令和注解中提取字符串（SQL、URL、密钥等敏感信息）\n- ⚡ **快速模式** — 仅分析类结构和方法调用，跳过耗时分析，适合快速摸底\n- 📦 **Spring Boot / WAR 支持** — 嵌套 JAR 解析、类名修正，完美适配 Fat JAR\n- 🛡️ **安全防护** — 内置 Zip Slip 路径穿越攻击防御，损坏类文件自动容错\n- 🔌 **双模式使用** — 既可作为 CLI 工具独立运行，也可作为 Java 库集成到项目中\n- 🔓 **内置反编译** — 集成 FernFlower 反编译引擎，支持 CLI 直接反编译指定类并输出源码\n\n## 🚀 快速开始\n\n### 环境要求\n\n| 依赖 | 版本要求 |\n|------|----------|\n| Java (JDK/JRE) | **8** 或更高 |\n| Maven（仅构建时） | 3.6+ |\n\n### 构建\n\n```bash\ngit clone https://github.com/jar-analyzer/jar-analyzer-engine.git\ncd jar-analyzer-engine\nmvn clean package -DskipTests\n```\n\n构建产物为 fat jar（包含所有依赖），位于 `target/jar-analyzer-engine-1.0.0-jar-with-dependencies.jar`。\n\n### 基本用法\n\n```bash\n# 分析单个 JAR 文件\njava -jar jar-analyzer-engine.jar --jar /path/to/app.jar\n\n# 分析目录下所有 JAR\njava -jar jar-analyzer-engine.jar --jar /path/to/libs/\n\n# 反编译指定类（需先 build 或指定 --jar 自动 build）\njava -jar jar-analyzer-engine.jar --decompile com.example.MyClass\n\n# 首次使用，自动 build + 反编译\njava -jar jar-analyzer-engine.jar --jar /path/to/app.jar --decompile com.example.MyClass\n```\n\n分析完成后将在当前目录生成 SQLite 数据库文件 `jar-analyzer.db`，可使用任何 SQLite 客户端工具查询。分析过程中的临时文件存放在 `jar-analyzer-temp` 目录中，分析完成后可手动删除。\n\n## 📋 命令行参数\n\n### 必填参数\n\n| 参数 | 缩写 | 说明 |\n|------|------|------|\n| `--jar \u003cpath\u003e` | `-j` | **必填**。待分析的 JAR/WAR 文件或包含 JAR 的目录路径 |\n\n### 可选参数\n\n| 参数 | 缩写 | 默认值 | 说明 |\n|------|------|--------|------|\n| `--rt \u003cpath\u003e` | — | 无 | rt.jar 路径，附加 JDK 标准类进行分析 |\n| `--quick` | `-q` | `false` | 启用快速模式 |\n| `--fix-class` | — | `false` | 启用类名修正模式 |\n| `--inner-jars` | — | `false` | 解析 JAR 中嵌套的 JAR |\n| `--no-fix-impl` | — | `false` | 禁用方法实现自动修正 |\n| `--black-list \u003ctext\u003e` | `-b` | 无 | 类/包黑名单（内联文本） |\n| `--white-list \u003ctext\u003e` | `-w` | 无 | 类/包白名单（内联文本） |\n| `--black-list-file \u003cfile\u003e` | — | 无 | 从文件读取黑名单 |\n| `--white-list-file \u003cfile\u003e` | — | 无 | 从文件读取白名单 |\n| `--decompile \u003cclass\u003e` | `-d` | 无 | 反编译指定类并输出源码到控制台（如 `com.example.MyClass`） |\n| `--log-level \u003clevel\u003e` | — | `INFO` | 日志级别：`DEBUG`、`INFO`、`WARN`、`ERROR` |\n| `--help` | `-h` | — | 显示帮助信息 |\n\n## 📚 参数详解\n\n### `--jar` / `-j`（必填）\n\n指定待分析的输入路径，支持三种形式：\n\n- **单个 JAR 文件**：直接分析该 JAR 包\n- **单个 WAR 文件**：自动解压并分析其中的 class 文件\n- **目录路径**：递归扫描目录下所有 `.jar` 文件并分析\n\n```bash\n# 单个 JAR\njava -jar jar-analyzer-engine.jar --jar app.jar\n\n# WAR 文件\njava -jar jar-analyzer-engine.jar --jar webapp.war\n\n# 扫描整个 lib 目录\njava -jar jar-analyzer-engine.jar --jar /opt/tomcat/webapps/ROOT/WEB-INF/lib/\n```\n\n### `--rt`\n\n指定 `rt.jar` 的路径（通常位于 `$JAVA_HOME/jre/lib/rt.jar`），用于将 JDK 标准库的类也纳入分析范围。\n\n这对于需要追踪 JDK 类方法调用链的场景非常有用，例如分析反序列化链时需要知道 `java.util.HashMap` 的方法调用关系。\n\n\u003e **注意**：Java 9+ 已移除 `rt.jar`，该选项主要适用于分析面向 Java 8 的项目。\n\n```bash\njava -jar jar-analyzer-engine.jar --jar app.jar --rt /usr/lib/jvm/java-8/jre/lib/rt.jar\n```\n\n### `--quick` / `-q`（快速模式）\n\n启用快速模式，**仅执行类发现和方法调用分析**，跳过耗时较长的继承关系构建、字符串提取、Spring 分析和 JavaWeb 组件识别。\n\n适合在只关心直接方法调用关系、不需要完整分析结果时使用，可以显著缩短分析时间。\n\n| 分析阶段 | 标准模式 | 快速模式 |\n|----------|:--------:|:--------:|\n| JAR 解压与类发现 | ✅ | ✅ |\n| 方法调用分析 | ✅ | ✅ |\n| 继承关系构建 | ✅ | ❌ |\n| 方法实现/Override 修正 | ✅ | ❌ |\n| 字符串常量提取 | ✅ | ❌ |\n| Spring Controller 分析 | ✅ | ❌ |\n| JavaWeb 组件识别 | ✅ | ❌ |\n\n```bash\n# 快速分析，仅关注方法调用关系\njava -jar jar-analyzer-engine.jar --jar app.jar --quick\n```\n\n### `--fix-class`（类名修正模式）\n\n启用后，引擎会使用 ASM 从字节码中读取每个 class 文件的**真实类名**，而不是依赖文件路径推断。\n\n这在以下场景中非常关键：\n\n- **Spring Boot Fat JAR**：class 文件位于 `BOOT-INF/classes/` 目录下，文件路径包含额外前缀\n- **WAR 文件**：class 文件位于 `WEB-INF/classes/` 目录下\n- **打包工具重新组织目录结构**的情况\n\n```bash\n# 分析 Spring Boot Fat JAR 时推荐使用\njava -jar jar-analyzer-engine.jar --jar springboot-app.jar --fix-class\n```\n\n### `--inner-jars`（嵌套 JAR 解析）\n\n启用后，引擎会递归解析 JAR 包中嵌套的 JAR 文件。\n\n典型应用场景：\n\n- **Spring Boot Fat JAR**：依赖库以 JAR 形式嵌套在 `BOOT-INF/lib/` 中\n- **WAR 文件**：第三方依赖以 JAR 形式嵌套在 `WEB-INF/lib/` 中\n- **任何包含嵌套 JAR 的打包格式**\n\n```bash\n# 分析 Spring Boot 应用（包括嵌套依赖）\njava -jar jar-analyzer-engine.jar --jar springboot-app.jar --inner-jars --fix-class\n```\n\n### `--no-fix-impl`（禁用方法实现修正）\n\n默认情况下，引擎会在构建方法调用关系时自动处理方法的继承/Override 关系：如果代码调用了父类/接口的方法 A，引擎会自动将所有子类中 Override 的方法 A 也加入调用图。\n\n启用 `--no-fix-impl` 可以禁用这一行为，只保留**字面上的直接调用关系**。\n\n```bash\n# 仅记录直接调用，不自动关联子类 override 方法\njava -jar jar-analyzer-engine.jar --jar app.jar --no-fix-impl\n```\n\n### `--log-level`（日志级别）\n\n设置引擎运行时的日志输出级别，默认为 `INFO`。支持以下级别（不区分大小写）：\n\n| 级别 | 说明 |\n|------|------|\n| `DEBUG` | 输出所有调试信息，最详细 |\n| `INFO` | 输出一般运行信息（默认） |\n| `WARN` | 仅输出警告和错误 |\n| `ERROR` | 仅输出错误信息 |\n\n```bash\n# 调试模式，查看详细分析过程\njava -jar jar-analyzer-engine.jar --jar app.jar --log-level debug\n\n# 安静模式，仅显示警告和错误\njava -jar jar-analyzer-engine.jar --jar app.jar --log-level warn\n```\n\n### `--decompile` / `-d`（反编译模式）\n\n指定一个类的全限定名，引擎会从 `jar-analyzer-temp` 临时目录中查找对应的 class 文件，使用内置的 FernFlower 反编译引擎将其反编译为 Java 源码，并输出到控制台。\n\n支持的类名格式：\n- 点分隔：`com.example.service.UserService`\n- 斜杠分隔：`com/example/service/UserService`\n\n引擎会自动处理以下情况：\n- **Spring Boot Fat JAR**：自动搜索 `BOOT-INF/classes/` 前缀\n- **WAR 文件**：自动搜索 `WEB-INF/classes/` 前缀\n- **内部类**：自动包含 `$` 内部类文件一起反编译\n- **模糊匹配**：找不到类时会搜索 temp 目录给出 \"Did you mean?\" 候选建议\n\n```bash\n# 已 build 过（temp 目录存在），直接反编译\njava -jar jar-analyzer-engine.jar --decompile com.example.MyClass\n\n# 首次使用，自动 build + 反编译\njava -jar jar-analyzer-engine.jar --jar app.jar --decompile com.example.MyClass\n```\n\n### 黑白名单过滤\n\n通过黑白名单可以控制哪些类参与分析，减少不必要的分析范围，加速分析过程。\n\n#### 名单语法\n\n```text\n# 这是注释行\n// 这也是注释行\n/* 这也是注释行\n\ncom.example.service.         # 包级别过滤（以 . 结尾，匹配该包下所有类）\ncom.example.service.MyClass  # 类级别过滤（精确匹配某个类）\ncom.a.;com.b.;com.c.Demo    # 分号分隔多项\n```\n\n#### 使用方式\n\n**内联文本**（适合简单规则）：\n\n```bash\n# 黑名单：排除 test 和 mock 包\njava -jar jar-analyzer-engine.jar --jar app.jar --black-list \"com.example.test.;com.example.mock.\"\n\n# 白名单：仅分析 service 和 controller 包\njava -jar jar-analyzer-engine.jar --jar app.jar --white-list \"com.example.service.;com.example.controller.\"\n```\n\n**文件方式**（适合复杂规则）：\n\n```bash\n# 从文件读取名单\njava -jar jar-analyzer-engine.jar --jar app.jar --black-list-file blacklist.txt --white-list-file whitelist.txt\n```\n\n`blacklist.txt` 示例：\n\n```text\n# 排除测试相关\ncom.example.test.\ncom.example.mock.\norg.junit.\n\n# 排除日志相关\norg.slf4j.\nch.qos.logback.\norg.apache.logging.\n```\n\n#### 过滤逻辑\n\n- 如果配置了**白名单**：只有匹配白名单的类才会被分析\n- 如果配置了**黑名单**：匹配黑名单的类会被排除\n- 如果同时配置了黑白名单：先匹配白名单，再排除黑名单\n- 如果都未配置：分析所有类\n\n## ⚙️ 分析流程\n\n引擎采用多阶段流水线架构，各阶段按顺序执行：\n\n```\n输入 (JAR/WAR/CLASS)\n     │\n     ▼\n┌──────────────────────────────┐\n│  阶段 0: JAR 解压与过滤       │  解压文件，应用黑白名单\n│  (0% - 15%)                  │\n└──────────────┬───────────────┘\n               ▼\n┌──────────────────────────────┐\n│  阶段 1: 类发现 (Discovery)   │  提取类/方法/字段/注解信息\n│  (15% - 30%)                 │\n└──────────────┬───────────────┘\n               ▼\n┌──────────────────────────────┐\n│  阶段 2: 方法调用分析          │  分析方法体中的调用指令\n│  (30% - 40%)                 │\n└──────────────┬───────────────┘\n               ▼\n┌──────────────────────────────┐\n│  阶段 3: 继承关系构建          │  构建继承树 + 方法实现映射\n│  (40% - 70%) [标准模式]       │\n└──────────────┬───────────────┘\n               ▼\n┌──────────────────────────────┐\n│  阶段 4: 字符串常量提取        │  提取代码和注解中的字符串\n│  (70% - 80%) [标准模式]       │\n└──────────────┬───────────────┘\n               ▼\n┌──────────────────────────────┐\n│  阶段 5: Spring 分析          │  识别 Controller/Mapping/参数\n│  (80% - 90%) [标准模式]       │\n└──────────────┬───────────────┘\n               ▼\n┌──────────────────────────────┐\n│  阶段 6: JavaWeb 组件识别     │  识别 Servlet/Filter/Listener\n│  [标准模式]                   │\n└──────────────┬───────────────┘\n               ▼\n          SQLite 数据库\n```\n\n### 阶段 0: JAR 解压与过滤\n\n- 解压输入的 JAR/WAR 文件到临时目录\n- 应用黑白名单规则过滤不需要分析的类\n- 如果启用 `--inner-jars`，递归解压嵌套 JAR\n- 如果启用 `--fix-class`，从字节码中读取真实类名\n- 自动提取配置文件（`.yml`、`.yaml`、`.properties`、`.xml`、`.json` 等）\n- 内置 Zip Slip 路径穿越攻击防御\n\n### 阶段 1: 类发现 (Discovery)\n\n通过 ASM `ClassVisitor` 遍历所有 class 文件，提取：\n\n- **类信息**：类名、父类、接口、访问修饰符、版本号\n- **字段信息**：字段名、类型、修饰符、初始值\n- **方法信息**：方法名、描述符、是否静态、访问修饰符、行号\n- **注解信息**：类级和方法级注解及其参数\n\n### 阶段 2: 方法调用分析\n\n分析每个方法体中的字节码调用指令：\n\n- `invokevirtual` — 虚方法调用\n- `invokestatic` — 静态方法调用\n- `invokespecial` — 构造方法/super 调用\n- `invokeinterface` — 接口方法调用\n- `invokedynamic` — Lambda 表达式和方法引用\n\n记录完整的 caller → callee 关系，包括调用的 opcode 类型。\n\n### 阶段 3: 继承关系构建（标准模式）\n\n- 递归构建每个类的**完整继承链**（包括所有祖先类和接口）\n- 构建双向映射：子类 → 所有父类，父类 → 所有子类\n- 查找方法实现/Override 关系：对每个非静态方法，找到所有子类中同名同描述符的方法\n- 如果启用方法实现修正（默认启用），将 Override 方法自动加入调用图\n\n### 阶段 4: 字符串常量提取（标准模式）\n\n- 提取方法体中 `LDC` 指令加载的字符串常量\n- 提取方法注解中的字符串值\n- 可用于 SQL 语句、URL 路径、密钥等敏感信息检索\n\n### 阶段 5: Spring 分析（标准模式）\n\n识别 Spring MVC 相关组件：\n\n- 识别 `@Controller` / `@RestController` 注解的控制器类\n- 解析 `@RequestMapping`、`@GetMapping`、`@PostMapping`、`@PutMapping`、`@DeleteMapping`、`@PatchMapping` 注解\n- 构建完整的 URL 路径（类级 basePath + 方法级 path）\n- 提取 `@RequestParam` 参数映射\n\n### 阶段 6: JavaWeb 组件识别（标准模式）\n\n通过父类/接口关系识别传统 JavaWeb 组件：\n\n- **Servlet**：实现 `javax.servlet.Servlet` / `jakarta.servlet.Servlet` 或继承 `HttpServlet`\n- **Filter**：实现 `javax.servlet.Filter` / `jakarta.servlet.Filter`\n- **Listener**：实现 `ServletContextListener` / `ServletRequestListener` / `HttpSessionListener`\n- **Interceptor**：实现 `HandlerInterceptor` / `AsyncHandlerInterceptor` 或继承 `HandlerInterceptorAdapter`\n\n## 🗄️ 输出数据库\n\n引擎输出一个 SQLite 数据库，包含以下核心表：\n\n| 表名 | 说明 | 核心字段 |\n|------|------|----------|\n| `jar_table` | JAR 文件信息 | jar_name, jar_abs_path |\n| `class_table` | 类信息 | class_name, super_class_name, is_interface, access |\n| `class_file_table` | 类文件路径 | class_name, path_str, jar_name |\n| `member_table` | 字段/成员 | member_name, modifiers, type_class_name, class_name |\n| `method_table` | 方法信息 | method_name, method_desc, is_static, class_name, line_number |\n| `anno_table` | 注解信息 | anno_name, method_name, class_name, visible |\n| `interface_table` | 接口实现 | interface_name, class_name |\n| `method_call_table` | 方法调用关系 | caller_class/method/desc, callee_class/method/desc, op_code |\n| `method_impl_table` | 方法实现/Override | class_name, method_name, impl_class_name |\n| `string_table` | 字符串常量 | value, method_name, class_name |\n| `spring_controller_table` | Spring 控制器 | class_name |\n| `spring_method_table` | Spring Mapping | class_name, method_name, restful_type, path |\n| `spring_interceptor_table` | Spring 拦截器 | class_name |\n| `java_web_table` | Servlet/Filter/Listener | type_name, class_name |\n\n### SQL 查询示例\n\n以下是一些常用的分析查询，可直接在 SQLite 客户端中执行：\n\n```sql\n-- 查找所有 Spring Controller 的 API 路由\nSELECT sm.path, sm.restful_type, sm.class_name, sm.method_name\nFROM spring_method_table sm\nORDER BY sm.path;\n\n-- 查找某个方法的所有调用者（谁调用了它）\nSELECT caller_class_name, caller_method_name\nFROM method_call_table\nWHERE callee_class_name = 'com/example/service/UserService'\n  AND callee_method_name = 'getUser';\n\n-- 查找某个方法调用了哪些方法\nSELECT callee_class_name, callee_method_name\nFROM method_call_table\nWHERE caller_class_name = 'com/example/controller/UserController'\n  AND caller_method_name = 'handleRequest';\n\n-- 查找包含敏感字符串的方法（如密码、密钥等）\nSELECT class_name, method_name, value\nFROM string_table\nWHERE value LIKE '%password%'\n   OR value LIKE '%secret%'\n   OR value LIKE '%token%';\n\n-- 查找所有 Servlet 和 Filter（攻击面枚举）\nSELECT type_name, class_name\nFROM java_web_table\nORDER BY type_name;\n\n-- 查找实现了某个接口的所有类\nSELECT class_name\nFROM interface_table\nWHERE interface_name = 'java/io/Serializable';\n\n-- 查找方法的继承/Override 关系\nSELECT class_name, method_name, method_desc, impl_class_name\nFROM method_impl_table\nWHERE method_name = 'invoke';\n```\n\n## 🎯 典型使用场景\n\n### 1. 分析 Spring Boot 应用\n\n```bash\njava -jar jar-analyzer-engine.jar \\\n  --jar springboot-app.jar \\\n  --fix-class \\\n  --inner-jars\n```\n\n推荐同时启用 `--fix-class` 和 `--inner-jars`，因为 Spring Boot Fat JAR 将 class 文件放在 `BOOT-INF/classes/` 中，依赖库放在 `BOOT-INF/lib/` 中。\n\n### 2. 分析 Tomcat Web 应用\n\n```bash\njava -jar jar-analyzer-engine.jar \\\n  --jar /opt/tomcat/webapps/myapp/WEB-INF/lib/\n```\n\n### 3. 快速分析方法调用链\n\n```bash\njava -jar jar-analyzer-engine.jar \\\n  --jar target.jar \\\n  --quick\n```\n\n### 4. 精确范围分析\n\n```bash\njava -jar jar-analyzer-engine.jar \\\n  --jar app.jar \\\n  --white-list \"com.mycompany.service.;com.mycompany.controller.\" \\\n  --black-list \"com.mycompany.service.test.\"\n```\n\n### 5. 包含 JDK 类分析（反序列化链挖掘等场景）\n\n```bash\njava -jar jar-analyzer-engine.jar \\\n  --jar app.jar \\\n  --rt /usr/lib/jvm/java-8-openjdk/jre/lib/rt.jar\n```\n\n### 6. 反编译指定类查看源码\n\n```bash\n# 分析 + 反编译一步完成\njava -jar jar-analyzer-engine.jar \\\n  --jar app.jar \\\n  --decompile com.example.service.UserService\n\n# 已 build 过，直接反编译\njava -jar jar-analyzer-engine.jar \\\n  --decompile com.example.service.UserService\n```\n\n## 🤖 与 AI 集成进行代码审计\n\n生成的 SQLite 数据库天然适合与 AI 工具结合使用，以下是推荐的工作流：\n\n\u003e 📄 数据库完整表结构请参阅 [DATABASE.md](DATABASE.md)，建议将该文件作为 AI 的上下文输入\n\n### 使用 Claude Code\n\n```bash\n# 1. 先用引擎分析目标应用\njava -jar jar-analyzer-engine.jar --jar target-app.jar\n\n# 2. 在 Claude Code 中，AI 可以直接查询数据库进行分析\n```\n\n在 Claude Code 中，你可以要求 AI 执行以下审计任务：\n\n- **攻击面枚举**：查询所有 Spring Controller 路由和 Servlet/Filter，梳理 Web 入口点\n- **调用链追踪**：从危险方法（如 `Runtime.exec`、`ProcessBuilder.start`）反向追踪调用链，发现潜在 RCE\n- **反序列化分析**：查找实现 `Serializable` 的类，分析 `readObject` 方法的调用图\n- **敏感信息检索**：通过字符串表搜索硬编码密码、API Key、内部 URL 等\n- **权限校验审计**：追踪 Controller 方法是否经过认证/授权拦截器\n\n### 示例对话\n\n```\n用户: 帮我分析 jar-analyzer.db 中所有的 Web 入口点，并追踪哪些入口点最终会调用到 Runtime.exec\n\nAI: 我来查询数据库进行分析...\n    [查询 spring_method_table 获取所有路由]\n    [查询 method_call_table 追踪 Runtime.exec 的调用链]\n    [关联分析，找出可达路径]\n```\n\n## 💻 编程接口\n\n除了 CLI 使用方式，引擎也可以作为库被其他 Java 程序集成：\n\n```java\nimport me.n1ar4.jar.analyzer.engine.EngineConfig;\nimport me.n1ar4.jar.analyzer.engine.EngineBuildRunner;\nimport me.n1ar4.jar.analyzer.engine.ProgressCallback;\n\n// 构建配置\nEngineConfig config = new EngineConfig();\nconfig.setJarPath(Paths.get(\"/path/to/app.jar\"));\nconfig.setQuickMode(false);\nconfig.setFixClass(true);\nconfig.setJarsInJar(true);\nconfig.setFixMethodImpl(true);\n\n// 设置进度回调（可选）\nconfig.setProgressCallback(new ProgressCallback() {\n    @Override\n    public void onProgress(double percent) {\n        System.out.printf(\"进度: %.1f%%\\n\", percent * 100);\n    }\n    \n    @Override\n    public void onMessage(String msg) {\n        System.out.println(msg);\n    }\n});\n\n// 执行分析\nEngineBuildRunner.run(config);\n```\n\n## 🔧 技术栈\n\n| 依赖 | 版本 | 用途 |\n|------|------|------|\n| [ASM](https://asm.ow2.io/) | 9.9.1 | Java 字节码分析框架 |\n| [MyBatis](https://mybatis.org/) | 3.5.19 | ORM / SQL 映射 |\n| [SQLite JDBC](https://github.com/xerial/sqlite-jdbc) | 3.51.3.0 | SQLite 数据库驱动 |\n| [Commons DBCP2](https://commons.apache.org/proper/commons-dbcp/) | 2.14.0 | 数据库连接池 |\n| [Commons Compress](https://commons.apache.org/proper/commons-compress/) | 1.28.0 | JAR/WAR/ZIP 解压 |\n| [JCommander](https://jcommander.org/) | 1.82 | CLI 参数解析 |\n| [Hutool](https://hutool.cn/) | 5.8.43 | 工具方法库 |\n\n## 📁 项目结构\n\n```\njar-analyzer-engine/\n├── src/main/java/me/n1ar4/jar/analyzer/\n│   ├── EngineMain.java              # CLI 主入口\n│   ├── engine/                      # 引擎核心层\n│   │   ├── EngineBuildRunner.java   #   流水线编排核心\n│   │   ├── EngineConfig.java        #   配置类\n│   │   ├── EngineBuildCmd.java      #   CLI 参数定义 (JCommander)\n│   │   ├── ProgressCallback.java    #   进度回调接口\n│   │   ├── EngineConst.java         #   常量定义\n│   │   ├── log/                     #   自定义日志系统\n│   │   └── utils/                   #   工具类 (JAR 解压、黑白名单等)\n│   ├── core/                        # 核心分析层\n│   │   ├── AnalyzeEnv.java          #   全局分析环境\n│   │   ├── DatabaseManager.java     #   数据库管理 \u0026 持久化\n│   │   ├── DiscoveryRunner.java     #   阶段1: 类发现\n│   │   ├── MethodCallRunner.java    #   阶段2: 方法调用分析\n│   │   ├── InheritanceRunner.java   #   阶段3: 继承关系构建\n│   │   ├── InheritanceMap.java      #   继承关系数据结构\n│   │   ├── OtherWebService.java     #   阶段6: JavaWeb 组件识别\n│   │   ├── asm/                     #   ASM 字节码访问器\n│   │   ├── mapper/                  #   MyBatis Mapper 接口 (15个)\n│   │   └── reference/               #   核心数据模型\n│   ├── entity/                      # 数据库实体类 (18个)\n│   ├── decompile/                   # 反编译模块\n│   │   ├── DecompileEngine.java     #   FernFlower 反编译封装\n│   │   └── LRUCache.java            #   反编译结果 LRU 缓存\n│   └── analyze/spring/              # Spring 框架分析\n│       ├── SpringService.java       #   Spring 分析入口\n│       └── asm/                     #   Spring 注解 ASM 访问器\n├── src/main/resources/\n│   ├── mybatis.xml                  # MyBatis 主配置\n│   ├── jdbc.properties              # JDBC 连接配置\n│   └── mappers/                     # MyBatis SQL 映射文件 (15个)\n└── pom.xml                          # Maven 构建配置\n```\n\n## ❓ 常见问题\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: 分析大型项目时内存不足怎么办？\u003c/b\u003e\u003c/summary\u003e\n\n增大 JVM 堆内存：\n\n```bash\njava -Xmx2g -jar jar-analyzer-engine.jar --jar large-app.jar\n```\n\n对于特别大的项目，也可以使用 `--quick` 模式减少内存消耗，或通过黑白名单缩小分析范围。\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: 分析 Spring Boot Fat JAR 结果为空？\u003c/b\u003e\u003c/summary\u003e\n\n需要同时启用 `--fix-class` 和 `--inner-jars`：\n\n```bash\njava -jar jar-analyzer-engine.jar --jar springboot-app.jar --fix-class --inner-jars\n```\n\nSpring Boot Fat JAR 的 class 文件位于 `BOOT-INF/classes/` 中，不启用 `--fix-class` 会导致类名包含 `BOOT-INF.classes.` 前缀。\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: 支持 Java 9+ 模块化 JAR 吗？\u003c/b\u003e\u003c/summary\u003e\n\n支持。引擎使用 ASM 9.9.1，可以处理 Java 8 到 Java 21+ 的 class 文件。但 `--rt` 参数仅适用于 Java 8 的 `rt.jar`，Java 9+ 的模块化 JDK 无需此参数。\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: 是否支持增量分析？\u003c/b\u003e\u003c/summary\u003e\n\n当前版本每次分析会重建整个数据库（覆盖已有文件）。增量分析功能计划在后续版本中支持。\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: 遇到 \"StackMapTable\" 相关错误怎么办？\u003c/b\u003e\u003c/summary\u003e\n\n引擎内置了损坏类文件的容错处理。如果某个 class 文件的 `StackMapTable` 损坏，引擎会自动降级为 `SKIP_FRAMES` 模式重新解析，不会中断整个分析流程。\n\n\u003c/details\u003e\n\n## 🤝 贡献指南\n\n欢迎贡献代码！请遵循以下步骤：\n\n1. **Fork** 本仓库\n2. 创建特性分支：`git checkout -b feature/amazing-feature`\n3. 提交更改：`git commit -m 'feat: add amazing feature'`\n4. 推送分支：`git push origin feature/amazing-feature`\n5. 提交 **Pull Request**\n\n### 开发环境\n\n- JDK 8 或更高版本\n- Maven 3.6+\n- IDE 推荐：IntelliJ IDEA\n\n### 代码规范\n\n- 遵循 Java 标准命名规范\n- 新增功能需保持与 Java 8 的兼容性\n- 提交信息遵循 [Conventional Commits](https://www.conventionalcommits.org/) 规范\n\n## 🔗 相关项目\n\n| 项目 | 说明 |\n|------|------|\n| [jar-analyzer](https://github.com/jar-analyzer/jar-analyzer) | Java 字节码安全分析 GUI 工具（本引擎的上层应用） |\n\n## 📄 许可证\n\n本项目基于 [MIT](https://github.com/jar-analyzer/jar-analyzer/blob/master/LICENSE) 许可证开源。\n\nCopyright © 2022-2026 [4ra1n](https://github.com/4ra1n) (Jar Analyzer Team)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjar-analyzer%2Fjar-analyzer-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjar-analyzer%2Fjar-analyzer-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjar-analyzer%2Fjar-analyzer-engine/lists"}