Jar Analyzer
是一个分析 Jar
文件的 GUI
工具:
- 支持大
Jar
以及批量Jars
分析 - 方便地搜索方法之间的调用关系
- 分析
LDC
指令定位Jar
中的字符串 - 一键分析
Spring Controller/Mapping
- 对于方法字节码和指令的高级分析
- 一键反编译,优化对内部类的处理
- 一键生成方法的
CFG
分析结果 - 一键生成方法的
Stack Frame
分析结果 - 远程分析
Tomcat
中的Servlet
等组件 - 自定义
SQL
语句进行高级分析 - 支持运行基于
Java
的脚本语言Y4 Lang
更多的功能正在开发中
有问题和建议欢迎提 issue
Jar Analyzer
的用途
- 场景1:从大量
JAR
中分析某个方法在哪个JAR
里定义(精确到具体类具体方法) - 场景2:从大量
JAR
中分析哪里调用了Runtime.exec
方法(精确到具体类具体方法) - 场景3:从大量
JAR
中分析字符串${jndi
出现在哪些方法(精确到具体类具体方法) - 场景4:从大量
JAR
中分析有哪些Spring Controller/Mapping
信息(精确到具体类具体方法) - 场景5:你需要深入地分析某个方法中
JVM
指令调用的传参(带有图形界面) - 场景6:你需要深入地分析某个方法中
JVM
指令和栈帧的状态(带有图形界面) - 场景7:你需要深入地分析某个方法的
Control Flow Graph
(带有图形界面) - 场景8:你有一个
Tomcat
需要远程分析其中的Servlet/Filter/Listener
信息
指令分析
CFG
分析
带图形的 Stack Frame
分析
分析 Spring Framework
从 2.8
版本开始支持 tomcat
分析(一检查杀内存马)
自定义 SQL
语句任意分析
支持运行基于 Java
的脚本语言 Y4 Lang
方法调用搜索 (支持 equals/like
选项,支持黑名单过滤)
方法调用关系
注意:
- 在
Windows
下请勿双击启动,请使用java -jar
或双击bat
脚本启动 - 如果使用
java -jar
启动乱码,请加入-Dfile.encoding=UTF-8
参数
本工具已经根据 1080P
适配 (考虑到绝大多数机器应该大于等于这个分辨率)
如果你的电脑在 1080P
下无法正常显示,请调整缩放到 100%
以 Windows 11
为例:右键显示设置
本工具的基本原理:
- 解压所有
Jar
文件到jar-analyzer-temp
目录 - 在当前目录构建数据库
jar-analyzer.db
文件 - 在当前目录新建文件
.jar-analyzer
记录状态
注意:当 Jar
数量较多或巨大时可能导致临时目录和数据库文件巨大
如果你不想使用 GUI
版本,本项目也支持命令行方式:
Usage: java -jar jar-analyzer.jar [command] [command options]
Commands:
build build database
Usage: build [options]
Options:
--del-cache
delete old cache
Default: false
--del-exist
delete old database
Default: false
-j, --jar
jar file/dir
gui start jar-analyzer gui
Usage: gui
示例:对当前目录的 test.jar
进行分析和构建数据库,并删除缓存和当前目录旧数据库
java -jar jar-analyzer.jar build --jar 1.jar --del-cache --del-exist
在 release
中提供四种下载:
- 推荐
embed
版内置JRE 8
的启动脚本 (无需另外安装一键启动) system
使用系统JDK/JRE
的启动脚本 (需要自行安装JDK/JRE
)linux
内置shell
启动脚本 (需要自行安装JDK/JRE
)- 简单的
jar
文件,不提供启动脚本 (使用java -jar
启动)
推荐使用 embed
版,经过了较多测试,完善支持 tomcat-analyzer
模块
由于本工具仅在 Windows
和 Java 8
中测试,其他环境可能有未知的问题,欢迎提 issue
该项目位于me.n1ar4.shell.analyzer
中,这是一个分析Tomcat
内存马的工具
该项目位于me.n1ar4.y4lang
中,这是一个简单的脚本语言
该项目位于me.n1ar4.http
中,这是一个手动构造和解析HTTP/1.1
协议的HTTP
客户端库
该项目位于me.n1ar4.y4json
中,这是一个模仿Fastjson API
定义的简单的JSON
序列化和反序列化库
该项目位于me.n1ar4.log
中,这是一个模仿Log4j2 API
的日志库
请使用 Java 8
- 下载
JDK 8
- 使用
Maven
(https://maven.apache.org/download.cgi) - 使用
Python 3
辅助 (https://www.python.org/downloads/)
步骤:
(1) package.bat
(2) cd agent
(3) package.bat
(4) cd ..
(5) python build.py
(6) 复制 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
感谢以下项目提供的思路和代码