Jar Analyzer 是一个分析 Jar 文件的 GUI 工具:
- 支持大
Jar以及批量Jars分析 - 方便地搜索方法之间的调用关系
- 分析
LDC指令定位Jar中的字符串 - 一键分析
Spring Controller/Mapping - 对于方法字节码和指令的高级分析
- 一键反编译,优化对内部类的处理
- 一键生成方法的
CFG分析结果 - 一键生成方法的
Stack Frame分析结果
更多的功能正在开发中
有问题和建议欢迎提 issue
指令分析
CFG 分析
JVM Stack Frame 分析
分析 Spring Framework
首页
方法调用搜索 (支持 equals/like 选项,支持黑名单过滤)
方法调用关系
高级分析:正在开发中
本工具已经根据 1080P 适配 (考虑到绝大多数机器应该大于等于这个分辨率)
如果你的电脑在 1080P 下无法正常显示,请调整缩放到 100%
以 Windows 11 为例:右键显示设置
本工具的基本原理:
- 解压所有
Jar文件到jar-analyzer-temp目录 - 在当前目录构建数据库
jar-analyzer.db文件 - 在当前目录新建文件
.jar-analyzer记录状态
注意:当 Jar 数量较多或巨大时可能导致临时目录和数据库文件巨大
在 release 中提供四种下载:
system使用系统JDK/JRE的启动脚本 (需要自行安装JRE)embed内置安全Y4 JRE的启动脚本 (无需另外安装一键启动)linux内置shell启动脚本 (需要自行安装JRE)- 简单的
Jar文件,不提供启动脚本
由于本工具仅在 Windows 中测试,其他操作系统可能会有未知的问题,欢迎提 issue
一般情况下,推荐使用内置 Y4 JRE 的 embed 版本启动 (这是一个定制的安全的 JRE 8)
关于 Y4 JDK/JRE 项目: https://github.com/Y4Sec-Team/jdk8u
构建一般基于 Java 8
- 下载
JDK 8 - 使用
Maven(https://maven.apache.org/download.cgi) - 使用
Python 3辅助 (https://www.python.org/downloads/)
步骤:
(1) mvn -B package -DskipTests --file pom.xml
(2) python build.py
(3) 复制 JRE 到 embed 版
如果你希望体验老版本 (不再维护) 的 Jar Analyzer 可以访问:
为什么我不选择 IDEA 而要选择 Jar Analyzer V2 工具:
- 因为
IDEA不支持分析无源码的Jar包 - 本工具有一些进阶功能是
IDEA不支持的 (指令/CFG/Stack分析)
(1) 什么是方法之间的关系
class Test{
void a(){
new Test().b();
}
void b(){
Test.c();
}
static void c(){
// code
}
}如果当前方法是 b
对于 a 来说,它的 callee 是 b
对于 b 来说,它的 caller 是 a
(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.
首先确保数据不会丢失,然后我们可以自行手动分析反编译的代码
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, 丢失了 Zoo.run -> Dog.eat 规则
这种情况下我们添加了新规则: Animal.eat -> Dog.eat 和 Animal.eat -> Cat.eat
首先确保数据不会丢失,然后我们可以自行手动分析反编译的代码
Zoo.run -> Animal.eatAnimal.eat -> Dog.eat/Animal.eat -> Cat.eat
感谢以下项目提供的思路和代码









