一个用于分析Jar的Java GUI工具
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/4ra1n/jar-analyzer
项目介绍
一个分析文件的GUI项目 jar ,特别适合代码安全分析。 jar 可以同时分析 多个文件,您可以轻松地在其中搜索方法。 支持类文件反编译,自动建立类和方法之间的调用关系,帮助有经验的Java代码分析人员提高效率。 该工具的详细使用请参考快速入门。

核心模块:
- Java反编译器API: https ://github.com/mstrobel/procyon
- 平面外观和用户界面: https ://github.com/JFormDesigner/FlatLaf
- JSyntaxPane: https ://code.google.com/archive/p/jsyntaxpane
我们使用自定义的 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/ContextContext(将搜索所有*.Context班级)
方法输入只需要一个简单的名称,不需要描述。
请注意:如果 jar 很大,初始化将需要一些时间( rt.jar 花费超过 10 秒)

这时候可以看到所有分析的类和方法的个数。
(3) 第三步:双击反编译结果即可。
红色光标会尽量指向对应的方法,并不是所有情况都会正确处理。

反编译时,会建立方法之间的关系。
面板中任意项都可以双击反编译,同时显示其方法关系。
请注意:如果您不能像下面的截图那样反编译,您可以添加相应的jar。 比如我们在没有添加 rt.jar JDK的情况下。 如果加上,就可以反编译成功。

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

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

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

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

关于
(1)方法之间的关系是什么:
class Test{
void a(){
new Test().b();
}
void b(){
Test.c();
}
static void c(){
// code
}
}
如果当前项目是方法 b
谁调用目标: Test 类 a 方法
目标调用谁: Test 类 c 方法
(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.test 和 Test.test -> Test2Impl.test 。
确保没有丢失结果,那么我们可以自己用自动反编译的java代码手动分析:
Demo.demo -> Test.testTest.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.cat 是 INVOKEVIRTUAL Animal.eat ()V ,我们只有一个规则 Zoo.run -> Animal.eat ,lost Zoo.run -> Dog.eat rule。
在这种情况下,我们添加了新规则: Animal.eat -> Dog.eat 和 Animal.eat -> Cat.eat 。
确保没有丢失结果,那么我们可以自己用自动反编译的java代码手动分析:
Zoo.run -> Animal.eatAnimal.eat -> Dog.eat/Animal.eat -> Cat.eat