一个用于分析Jar的Java GUI工具

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/4ra1n/jar-analyzer

项目介绍

一个分析文件的GUI项目 jar ,特别适合代码安全分析。 jar 可以同时分析 多个文件,您可以轻松地在其中搜索方法。 支持类文件反编译,自动建立类和方法之间的调用关系,帮助有经验的Java代码分析人员提高效率。 该工具的详细使用请参考快速入门。

2bb4d0dabb214320

 

核心模块:

我们使用自定义的 JSyntaxPane(非官方)来显示 Java 代码。

如何建造

git clone https://github.com/4ra1n/jar-analyzer
cd jar-analyzer
mvn package

快速开始

(1)第一步:添加Jars文件。

  • 使用按钮打开 jar 文件 Select Jar File
  • 支持上传多个Jar文件一起分析。

请不要担心,加载和构建需要几秒钟。

(2) 第二步:输入您的搜索数据。

我们支持三种格式输入:

  • javax.naming.Context (例如)
  • javax/naming/Context
  • Context (将搜索所有 *.Context 班级)

方法输入只需要一个简单的名称,不需要描述。

请注意:如果 jar 很大,初始化将需要一些时间( rt.jar 花费超过 10 秒)

b01c2ce25e214334

 

这时候可以看到所有分析的类和方法的个数。

(3) 第三步:双击反编译结果即可。

红色光标会尽量指向对应的方法,并不是所有情况都会正确处理。

b07f55c7fd214348

 

反编译时,会建立方法之间的关系。

面板中任意项都可以双击反编译,同时显示其方法关系。

请注意:如果您不能像下面的截图那样反编译,您可以添加相应的jar。 比如我们在没有添加 rt.jar JDK的情况下。 如果加上,就可以反编译成功。

1839a2960f214400

 

您可以按 Ctrl+F 搜索 Java 代码中的字符串。

17c72a9e64214411

 

您可以单击选择项目,然后项目将显示方法详细信息。

d5aaca660e214422

 

您可以右键单击将项目发送到您的连锁店。 Chain可以理解为收藏夹或者记录列表。 链表中也可以双击反编译显示新关系,单击显示详细信息。 如果链中的项目不是您想要的,您可以右键单击将其从链中删除。

所以你可以很容易地为自己建立一个方法链。

20aee983cc214432

 

方法之间的关系项( Who call targetTarget call whom 面板)也可以按上述方式使用。 单击显示详细信息,双击反编译显示新关系,右键添加到链中。

e882ba5ca4214444

 

关于

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

class Test{
    void a(){
        new Test().b();
    }

    void b(){
        Test.c();
    }

    static void c(){
        // code
    }
}

如果当前项目是方法 b

谁调用目标: Testa 方法

目标调用谁: Testc 方法

(2) 我们如何解决实施:

class Demo{
    void demo(){
        new Test().test();
    }
}

interface Test {
    void test();
}

class Test1Impl implements Test {
    @Override
    public void test() {
        // code
    }
}

class Test2Impl implements Test {
    @Override
    public void test() {
        // code
    }
}

现在我们有了 Demo.demo -> Test.test 数据,但实际上是 Demo.demo -> TestImpl.test

在这种情况下,我们添加了新规则: Test.test -> Test1Impl.testTest.test -> Test2Impl.test

确保没有丢失结果,那么我们可以自己用自动反编译的java代码手动分析:

  • Demo.demo -> Test.test
  • Test.test -> Test1Impl.test / Test.test -> Test2Impl.test

(3)我们如何解决继承:

class Zoo{
    void run(){
        Animal dog = new Dog();
        dog.eat();
    }
}

class Animal {
    void eat() {
        // code
    }
}

class Dog extends Animal {
    @Override
    void eat() {
        // code
    }
}

class Cat extends Animal {
    @Override
    void eat() {
        // code
    }
}

中的字节码 Zoo.run -> dog.catINVOKEVIRTUAL Animal.eat ()V ,我们只有一个规则 Zoo.run -> Animal.eat ,lost Zoo.run -> Dog.eat rule。

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

确保没有丢失结果,那么我们可以自己用自动反编译的java代码手动分析:

  • Zoo.run -> Animal.eat
  • Animal.eat -> Dog.eat / Animal.eat -> Cat.eat

 

标签:工具分享, java安全, jar包分析