{"id":9666909,"url":"https://github.com/jar-analyzer/jar-analyzer-v1-gui","last_synced_at":"2025-08-25T09:30:45.158Z","repository":{"id":63872473,"uuid":"571164683","full_name":"jar-analyzer/jar-analyzer-v1-gui","owner":"jar-analyzer","description":"建议使用新版：https://github.com/jar-analyzer/jar-analyzer","archived":true,"fork":false,"pushed_at":"2023-11-30T03:59:12.000Z","size":21177,"stargazers_count":894,"open_issues_count":4,"forks_count":107,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-11-15T22:59:24.158Z","etag":null,"topics":["java-decompiler","program-analysis","static-analysis"],"latest_commit_sha":null,"homepage":"https://github.com/jar-analyzer/jar-analyzer","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","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}},"created_at":"2022-11-27T11:36:13.000Z","updated_at":"2024-11-15T05:07:00.000Z","dependencies_parsed_at":"2023-11-30T04:43:39.229Z","dependency_job_id":null,"html_url":"https://github.com/jar-analyzer/jar-analyzer-v1-gui","commit_stats":null,"previous_names":["4ra1n/jar-analyzer-gui","jar-analyzer/jar-analyzer-v1-gui","4ra1n/jar-analyzer"],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-v1-gui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-v1-gui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-v1-gui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jar-analyzer%2Fjar-analyzer-v1-gui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jar-analyzer","download_url":"https://codeload.github.com/jar-analyzer/jar-analyzer-v1-gui/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230899272,"owners_count":18297246,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["java-decompiler","program-analysis","static-analysis"],"created_at":"2024-05-14T17:12:11.529Z","updated_at":"2024-12-23T00:30:33.053Z","avatar_url":"https://github.com/jar-analyzer.png","language":"Java","funding_links":[],"categories":["Java","开发工具\u0026框架"],"sub_categories":[],"readme":"# Archive\n## Jar Analyzer V2: https://github.com/jar-analyzer/jar-analyzer\n\n# Jar Analyzer\n![](https://img.shields.io/badge/build-passing-brightgreen)\n![](https://img.shields.io/badge/build-Java%208-orange)\n![](https://img.shields.io/github/downloads/4ra1n/jar-analyzer/total)\n![](https://img.shields.io/github/v/release/4ra1n/jar-analyzer)\n![](https://img.shields.io/badge/Java%20Code%20Lines-4576-orange)\n\n## Note\n\n**本项目不再维护**\n\n**建议使用新版 `Jar Analyzer V2` https://github.com/jar-analyzer/jar-analyzer**\n\n[Jar-Analyzer 命令行版本](https://github.com/4ra1n/jar-analyzer-cli)\n\n[Jar-Analyzer Cli Version](https://github.com/4ra1n/jar-analyzer-cli)\n\n## 介绍\n\n简单的介绍：https://mp.weixin.qq.com/s/Rrx6x5M_28YRcQQCdxuEeQ\n\n没有英文文档，老外请自行翻译\n\n一个用于分析`jar`包的GUI工具，尤其适合从事代码安全审计。可以在同时分析多个`jar`文件，可以轻易地搜索目标方法。\n支持反编译字节码并自动构建类和方法之间的关系，帮助Java安全研究员更高效地工作。\n\n**注意：请勿分析过大或过多的的`Jar`包，建议最大不超过`300M`**\n\n[前往下载](https://github.com/4ra1n/jar-analyzer/releases/latest)\n\n可以精确定位方法的位置（左侧灰色游标高亮显示）\n\n![](img/001.png)\n\n可以直接定位字符串（分析常量池相关指令实现精确定位）\n\n![](img/003.png)\n\n可以直接分析`Spring`框架编写的项目\n\n![](img/005.png)\n\n为什么不选择`IDEA`分析：**因为`IDEA`不支持分析无源码的Jar包**\n\n支持六种搜索方式：\n- 直接根据类和方法名搜索（搜索定义）\n- 根据方法调用搜索（该方法在哪里被调用）\n- 搜索字符串（分析`LDC`指令找到精确位置）\n- 正则搜索字符串（分析`LDC`指令找到精确位置）\n- 无脑搜索（分析相关指令找到精确位置）\n- 二进制搜索（直接从二进制里搜）\n\n支持选择三项反编译方式：\n- QuiltFlower (FernFlower变种，推荐方式)\n- Procyon\n- CFR\n\n使用类定制化的`JSyntaxPane`组件（非官方）来展示`Java`代码\n\n（在该库`https://code.google.com/archive/p/jsyntaxpane`的基础上加了很多黑科技）\n\n## 表达式搜索\n\n支持一种超强的表达式搜索，可以随意组合以搜索你想要的信息\n\n| 表达式               | 参数         | 作用       | \n|:------------------|:-----------|:---------|\n| nameContains      | String     | 方法名包含    |\n| startWith         | String     | 方法前缀     |\n| endWith           | String     | 方法后缀     |\n| classNameContains | String     | 类名包含     |\n| returnType        | String     | 方法返回类型   |\n| paramTypeMap      | int String | 方法参数对应关系 |\n| paramsNum         | int        | 方法参数个数   |\n| isStatic          | boolean    | 方法是否静态   |\n| isSubClassOf      | String     | 是谁的子类    |\n| isSuperClassOf    | String     | 是谁的父类    |\n| hasAnno           | String     | 方法的注解    |\n| hasClassAnno      | String     | 类的注解     |\n| hasField          | String     | 类字段      |\n\n注意：\n- `returnType`和`paramTypeMap`要求类似是完整类名，例如`java.lang.String`，基础类型直接写即可例如`int`\n- `isSubClassOf`和`isSuperClassOf`要求完整类名，例如`java.awt.Component`\n- `hasAnno`和`hasClassAnno`不要求完整类名，直接写即可例如`Controller`\n\n![](img/007.png)\n\n### 1.基础搜索\n\n搜索的基础是方法，你希望搜索怎样的方法\n\n例如我希望搜索方法名以`set`开头并以`value`结尾的方法\n\n```java\n#method\n        .startWith(\"set\")\n        .endWith(\"value\")\n```\n\n例如我希望搜索类名包含`Context`且方法名包含`lookup`的方法\n\n```java\n#method\n        .nameContains(\"lookup\")\n        .classNameContains(\"Context\")\n```\n\n例如我希望搜索返回`Process`类型共3个参数且第二个参数为`String`的方法\n\n```java\n#method\n        .returnType(\"java.lang.Process\")\n        .paramsNum(3)\n        .paramTypeMap(1,\"java.lang.String\")\n```\n\n### 2.子类与父类\n\n比如我们想找`javax.naming.spi.ObjectFactory`的所有子类（包括子类的子类等）\n\n编写以下规则即可，程序内部会递归地寻找所有的父类\n\n```java\n#method\n        .isSubClassOf(\"javax.naming.spi.ObjectFactory\")\n```\n\n如果想找某个类的所有父类，使用`isSuperClassOf`即可（注意全类名）\n\n注意以上会直接找到所有符合条件类的所有方法，所以我建议再加一些过滤\n\n例如\n\n```java\n#method\n        .isSubClassOf(\"javax.naming.spi.ObjectFactory\")\n        .startWith(\"xxx\")\n        .paramsNum(0)\n```\n\n### 3.注解搜索\n\n比如我们想找`@Controller`注解的所有类的所有方法\n\n编写以下规则\n\n```java\n#method\n        .hasClassAnno(\"Controller\")\n```\n\n比如想找`@RequestMapping`注解的所有方法\n\n```java\n#method\n        .hasAnno(\"RequestMapping\")\n```\n\n同样地由于找到的是所有符合条件类的所有方法，所以我建议再加一些过滤\n\n### 4.实战分析\n\n根据网上师傅提供的`Swing RCE`条件：\n- 必须有一个set方法\n- set方法必须只有一个参数\n- 这一个参数必须是string类型\n- 该类必须是`Component`子类（包括间接子类）\n\n因此我们编写一条规则\n\n```java\n#method\n        .startWith(\"set\")\n        .paramsNum(1)\n        .paramTypeMap(0,\"java.lang.String\")\n        .isSubClassOf(\"java.awt.Component\")\n```\n\n搜索结果\n\n![](img/008.png)\n\n## Quick Start\n\n重要：请使用`Java 8+`运行（推荐11并已提供内置`Java 11 JRE`的`EXE`版本）\n\n（在`Java 11`中使用了一种更好的字体，其他版本使用默认字体）\n\n(1) 第一步：添加`jar`文件（支持单个`jar`文件和`jar`目录）\n- 点击按钮 `Select Jar File` 打开jar文件\n- 支持上传多个jar文件并且会在一起进行分析\n\n请不要着急，分析jar文件需要花费少量的时间\n\n注意：请等到进度条满时分析完成\n\n(2) 第二步：输入你搜索的信息\n\n我们支持三种格式的输入：\n- `javax.naming.Context` (例如)\n- `javax/naming/Context`\n- `Context` (会搜索所有 `*.Context` 类)\n\n提供了一种快速输入的方式\n\n![](img/006.png)\n\n注意：这里的常见搜索内容可以自定义补充\n\n在当前目录新建`search.txt`文件，一行一个以`#`分割类名和方法，例如\n\n```text\njava.lang.Runtime#getRuntime\njava.lang.String#equals\n```\n\n二进制搜索只会返回是否存在，不会返回具体信息\n\n![](img/004.png)\n\n(3) 第三步：你可以双击进行反编译\n\n游标将会精确地指向方法调用的位置\n\n当反编译的过程中，方法之间的关系会被构建\n\n在面板上的任何地方都可以双击进行反编译，并构建新的方法调用关系和展示\n\n请注意：如果你遇到无法反编译的情况，你需要加载正确的jar文件\n\n例如，我无法反编译`javax.naming.Context`因为我没有加入`rt.jar`文件，如果你加入了它，就可以正常反编译了\n\n你可以使用`Ctrl+F`搜索代码和编辑\n\n你可以单击任何一个选项，接下来将会显示方法的详细信息\n\n你可以右键将选项发送到链中。你可以把链理解为一个收藏夹或记录。在链中你同样可以双击反编译，然后展示新的方法调用关系，或单机显示详情\n如果链中某个选项是你不想要的，可以右键把该选项从链中删除\n\n因此你可以构建出一个只属于你的调用链\n\n`谁调用了当前方法` 和 `当前方法调用了谁` 中的所有方法调用关系同样可以双击反编译，单击看详情，右键加入链\n\n可以一键查看当前类字节码\n\n![](img/002.png)\n\n## 关于\n\n(1) 什么是方法之间的关系\n\n```java\nclass Test{\n    void a(){\n        new Test().b();\n    }\n    \n    void b(){\n        Test.c();\n    }\n    \n    static void c(){\n        // code\n    }\n}\n```\n\n如果当前方法是 `b`\n\n谁调用了当前方法: `Test` class `a` method\n\n当前方法调用了谁: `Test` class `c` method\n\n(2) 如何解决接口实现的问题\n\n```java\nclass Demo{\n    void demo(){\n        new Test().test();\n    }\n}\n\ninterface Test {\n    void test();\n}\n\nclass Test1Impl implements Test {\n    @Override\n    public void test() {\n        // code\n    }\n}\n\nclass Test2Impl implements Test {\n    @Override\n    public void test() {\n        // code\n    }\n}\n```\n\n现在我们有 `Demo.demo -\u003e Test.test` 数据, 但实际上它是 `Demo.demo -\u003e TestImpl.test`.\n\n因此我们添加了新的规则： `Test.test -\u003e Test1Impl.test` 和 `Test.test -\u003e Test2Impl.test`.\n\n首先确保数据不会丢失，然后我们可以自行手动分析反编译的代码\n- `Demo.demo -\u003e Test.test`\n- `Test.test -\u003e Test1Impl.test`/`Test.test -\u003e Test2Impl.test`\n\n(3) 如何解决继承关系\n\n```java\nclass Zoo{\n    void run(){\n        Animal dog = new Dog();\n        dog.eat();\n    }\n}\n\nclass Animal {\n    void eat() {\n        // code\n    }\n}\n\nclass Dog extends Animal {\n    @Override\n    void eat() {\n        // code\n    }\n}\n\nclass Cat extends Animal {\n    @Override\n    void eat() {\n        // code\n    }\n}\n```\n`Zoo.run -\u003e dog.cat` 的字节码是 `INVOKEVIRTUAL Animal.eat ()V`, 但我们只有这条规则 `Zoo.run -\u003e Animal.eat`, 丢失了 `Zoo.run -\u003e Dog.eat` 规则\n\n这种情况下我们添加了新规则： `Animal.eat -\u003e Dog.eat` 和 `Animal.eat -\u003e Cat.eat`\n\n首先确保数据不会丢失，然后我们可以自行手动分析反编译的代码\n- `Zoo.run -\u003e Animal.eat`\n- `Animal.eat -\u003e Dog.eat`/`Animal.eat -\u003e Cat.eat`\n\n## Thanks\n\n\u003cimg src=\"https://resources.jetbrains.com/storage/products/company/brand/logos/IntelliJ_IDEA.svg\" alt=\"IntelliJ IDEA logo.\"\u003e\n\n\nThis project is developed using JetBrains IDEA.\nThanks to JetBrains for providing me with a free license, which is a strong support for me.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjar-analyzer%2Fjar-analyzer-v1-gui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjar-analyzer%2Fjar-analyzer-v1-gui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjar-analyzer%2Fjar-analyzer-v1-gui/lists"}