Skip to content
This repository has been archived by the owner on Nov 30, 2023. It is now read-only.

Commit

Permalink
readme
Browse files Browse the repository at this point in the history
  • Loading branch information
4ra1n committed Jan 18, 2023
1 parent 2fa4f14 commit 4668490
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 45 deletions.
95 changes: 51 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,55 +1,63 @@
# Jar Analyzer
![](https://img.shields.io/badge/build-passing-brightgreen)
![](https://img.shields.io/badge/build-Java%208-orange)
![](https://img.shields.io/badge/build-Java%2011-orange)
![](https://img.shields.io/github/downloads/4ra1n/jar-analyzer/total)
![](https://img.shields.io/github/v/release/4ra1n/jar-analyzer)
![](https://img.shields.io/badge/Java%20Code%20Lines-3127-orange)

[English Doc](doc/README.md)
![](https://img.shields.io/badge/Java%20Code%20Lines-3505-orange)

## 介绍

**注意:目前`Release`中的版本是旧版本,新版本会有很大的更新,将在最近发布**
没有英文文档,老外请自行翻译

一个用于分析`jar`包的GUI工具,尤其适合从事代码安全审计。可以在同时分析多个`jar`文件,可以轻易地搜索目标方法。
支持反编译字节码并自动构建类和方法之间的关系,帮助Java安全研究员更高效地工作。
更多细节在 Quick Start中。

[前往下载](https://github.com/4ra1n/jar-analyzer/releases/latest)

支持六种搜索方式:
- 直接根据类和方法名搜索(搜索定义)
- 根据方法调用搜索(该方法在哪里被调用)
- 搜索字符串(分析`LDC`指令找到精确位置)
- 正则搜索字符串(分析`LDC`指令找到精确位置)
- 无脑搜索(分析相关指令找到精确位置)
- 二进制搜索(直接从二进制里搜)

支持选择三项反编译方式:
- QuiltFlower (FernFlower)
- QuiltFlower (FernFlower变种,推荐方式)
- Procyon
- CFR

我们使用类定制化的`JSyntaxPane`组件(非官方)来展示`Java`代码
使用类定制化的`JSyntaxPane`组件(非官方)来展示`Java`代码

![](img/005.png)
(在该库`https://code.google.com/archive/p/jsyntaxpane`的基础上加了很多黑科技)

![](img/001.png)

可以直接定位字符串(分析常量池相关指令实现精确定位)

![](img/spring.png)
![](img/003.png)

## 如何构建
可以直接查看字节码

```shell
git clone https://github.com/4ra1n/jar-analyzer
cd jar-analyzer
mvn package
```
![](img/002.png)

可以直接分析`Spring`框架编写的项目

![](img/005.png)

## Quick Start

重要:请使用Java 8 - Java 17运行
重要:请使用Java 11 - Java 17运行 (已提供内置`JRE``EXE`版本)

(测试在`Java 8`中可能有奇怪的`BUG`为了稳妥选择`Java 11`

(1) 第一步:添加`jar`文件(支持单个`jar`文件和`jar`目录)
- 点击按钮 `Select Jar File` 打开jar文件
- 支持上传多个jar文件并且会在一起进行分析

请不要着急,分析jar文件需要花费少量的时间
请不要着急,分析jar文件需要花费少量的时间

注意:请等到标签显示classes和methods总数时分析完成。
注意:请等到进度条满时分析完成

(2) 第二步:输入你搜索的信息

Expand All @@ -58,41 +66,40 @@ mvn package
- `javax/naming/Context`
- `Context` (会搜索所有 `*.Context` 类)

我们支持两种搜索方式:
- 直接根据类和方法名搜索
- 根据方法调用搜索
提供了一种快速输入的方式

方法输入只需要一个简单的名称,不需要`desc`信息。
![](img/006.png)

请注意:如果jar非常大,初始化会比较耗时(例如`rt.jar`会消耗10秒左右)
二进制搜索只会返回是否存在,不会返回具体信息

同时,你可以看到顶部显示已加载的类和方法数量。
![](img/004.png)

(3) 第三步:你可以双击进行反编译

红色的游标将会尽可能地指向方法调用的位置,但目前不能保证所有情况。
游标将会精确地指向方法调用的位置

当反编译的过程中,方法之间的关系会被构建

当反编译的过程中,方法之间的关系会被构建。
在面板上的任何地方都可以双击进行反编译,并构建新的方法调用关系和展示

在面板上的任何地方都可以双击进行反编译,并构建新的方法调用关系和展示。
请注意:如果你遇到无法反编译的情况,你需要加载正确的jar文件

请注意:如果你遇到无法反编译的情况,你需要加载正确的jar文件。
例如,我无法反编译`javax.naming.Context`因为我没有加入`rt.jar`文件,如果你加入了它,就可以正常反编译了。
例如,我无法反编译`javax.naming.Context`因为我没有加入`rt.jar`文件,如果你加入了它,就可以正常反编译了

你可以使用`Ctrl+F`搜索代码和编辑

你可以单击任何一个选项,接下来将会显示方法的详细信息
你可以单击任何一个选项,接下来将会显示方法的详细信息

你可以右键将选项发送到链中。你可以把链理解为一个收藏夹或记录。在链中你同样可以双击反编译,然后展示新的方法调用关系,或单机显示详情
如果链中某个选项是你不想要的,可以右键把该选项从链中删除
你可以右键将选项发送到链中。你可以把链理解为一个收藏夹或记录。在链中你同样可以双击反编译,然后展示新的方法调用关系,或单机显示详情
如果链中某个选项是你不想要的,可以右键把该选项从链中删除

因此你可以构建出一个只属于你的调用链
因此你可以构建出一个只属于你的调用链

`Who call target``Target call whom` 中的所有方法调用关系同样可以双击反编译,单击看详情,右键加入链
`谁调用了当前方法``当前方法调用了谁` 中的所有方法调用关系同样可以双击反编译,单击看详情,右键加入链

## 关于

(1) 什么是方法之间的关系
(1) 什么是方法之间的关系

```java
class Test{
Expand All @@ -112,11 +119,11 @@ class Test{

如果当前方法是 `b`

Who call target: `Test` class `a` method
谁调用了当前方法: `Test` class `a` method

Target call whom: `Test` class `c` method
当前方法调用了谁: `Test` class `c` method

(2) 如何解决接口实现的问题
(2) 如何解决接口实现的问题

```java
class Demo{
Expand Down Expand Up @@ -148,11 +155,11 @@ class Test2Impl implements Test {

因此我们添加了新的规则: `Test.test -> Test1Impl.test``Test.test -> Test2Impl.test`.

首先确保数据不会丢失,然后我们可以自行手动分析反编译的代码
首先确保数据不会丢失,然后我们可以自行手动分析反编译的代码
- `Demo.demo -> Test.test`
- `Test.test -> Test1Impl.test`/`Test.test -> Test2Impl.test`

(3) 如何解决继承关系
(3) 如何解决继承关系

```java
class Zoo{
Expand Down Expand Up @@ -182,10 +189,10 @@ class Cat extends Animal {
}
}
```
`Zoo.run -> dog.cat` 的字节码是 `INVOKEVIRTUAL Animal.eat ()V`, 但我们只有这条规则 `Zoo.run -> Animal.eat`, 丢失了 `Zoo.run -> Dog.eat` 规则
`Zoo.run -> dog.cat` 的字节码是 `INVOKEVIRTUAL Animal.eat ()V`, 但我们只有这条规则 `Zoo.run -> Animal.eat`, 丢失了 `Zoo.run -> Dog.eat` 规则

这种情况下我们添加了新规则: `Animal.eat -> Dog.eat``Animal.eat -> Cat.eat`.
这种情况下我们添加了新规则: `Animal.eat -> Dog.eat``Animal.eat -> Cat.eat`

首先确保数据不会丢失,然后我们可以自行手动分析反编译的代码
首先确保数据不会丢失,然后我们可以自行手动分析反编译的代码
- `Zoo.run -> Animal.eat`
- `Animal.eat -> Dog.eat`/`Animal.eat -> Cat.eat`
Binary file added img/006.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public boolean isCellEditable(int row, int column) {
String[] temp = text.split("\t");
instance.classText.setText(temp[0]);
instance.methodText.setText(temp[1]);
instance.callSearchRadioButton.setSelected(true);
JOptionPane.showMessageDialog(commonPanel, "已设置成功");
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ public void loadJar() {
if (searchList.size() == 0 || searchList.isEmpty()) {
JOptionPane.showMessageDialog(this.jarAnalyzerPanel,
"没有结果!\n" +
"1. 也许你选错了:直接搜索/调用搜索\n" +
"1. 也许你选错了搜索方式\n" +
"2. 也许你应该勾选分析SpringBoot");
}

Expand Down Expand Up @@ -969,6 +969,12 @@ public void mousePressed(MouseEvent e) {
callSearchRadioButton.addActionListener(e -> JOptionPane.showMessageDialog(this.jarAnalyzerPanel,
"什么是搜索调用:\n" +
"搜索某个类的某个方法在哪些地方被调用"));
binaryRadioButton.addActionListener(e -> JOptionPane.showMessageDialog(this.jarAnalyzerPanel,
"什么是二进制搜索:\n" +
"不返回具体信息而是告诉你Jar包是否包含指定字符串"));
greatRadioButton.addActionListener(e -> JOptionPane.showMessageDialog(this.jarAnalyzerPanel,
"什么是无脑搜索:\n" +
"任何地方(参数名/属性/方法名/字符串/等)只要包含指定字符串即可"));

innerJarsCheckBox.addActionListener(e -> {
innerJars = innerJarsCheckBox.isSelected();
Expand Down

0 comments on commit 4668490

Please sign in to comment.