Jar Analyzer - 一个JAR包分析工具,批量分析搜索,方法调用关系搜索,字符串搜索,Spring分析,CFG分析,JVM Stack Frame分析等众多功能
Jar Analyzer
是一个分析 Jar
文件的 GUI
工具:
Jar
以及批量 Jars
分析LDC
指令定位 Jar
中的字符串Spring Controller/Mapping
CFG
信息JVM 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 -Dmaven.test.skip=true --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.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.cat
的字节码是 INVOKEVIRTUAL Animal.eat ()V
, 但我们只有这条规则 Zoo.run -> Animal.eat
, 丢失了 Zoo.run -> Dog.eat
规则
这种情况下我们添加了新规则: Animal.eat -> Dog.eat
和 Animal.eat -> Cat.eat
首先确保数据不会丢失,然后我们可以自行手动分析反编译的代码
Zoo.run -> Animal.eat
Animal.eat -> Dog.eat
/Animal.eat -> Cat.eat
感谢以下项目提供的思路和代码