JavaHook 是一个小型 Java attach/hook 工具雏形,目标是提供类似 Arthas 的运行时能力,但入口是精致、轻量的 JavaFX GUI。
- Attach 到本机 JVM,agent 在目标进程内启动
127.0.0.1本地控制端口。 - 查看已加载类,按包名/类名过滤。
- Dump 已加载类字节码到本地目录。
- 本地选择
.class热替换目标 JVM 中的同名类。 - 选择 jar 做批量热替换,按同包名、同类名匹配已加载类。
- 动态载入 jar、class 文件所在目录或 classes 根目录中的类。
- 反射读取/修改静态字段,调用静态方法。
- 动态追踪事件流:
- 按类名/方法名采样目标线程栈。
- 可开启全类追踪。
- 可追踪 ImageIO、JavaFX Image、AWT image 相关加载栈,并显示调用类。
- 可采样匹配类的静态字段初始值和变化。
javahook-agent: attach agent,提供本地 HTTP RPC。javahook-gui: JavaFX 桌面 GUI,负责 attach、操作类和展示 trace 事件。javahook-common: GUI 侧共享的小工具,目前包含轻量 JSON。
需要 JDK 8。当前工程按 Java 8 编译,方便直接使用 JDK 8 自带 JavaFX 和 tools.jar。
mvn package如果 Maven 的默认本地仓库不可写,可以把仓库放到项目内:
mvn "-Dmaven.repo.local=D:\_Project\Java\JavaHook\.m2\repository" packagerun-gui.cmd也可以手动启动:
java -cp "javahook-gui\target\javahook-gui-0.1.0-SNAPSHOT.jar;javahook-common\target\javahook-common-0.1.0-SNAPSHOT.jar;%JAVA_HOME%\lib\tools.jar" com.javahook.gui.MainApp- 先运行目标 Java 程序。
- 启动 JavaHook GUI。
- 在顶部选择目标 JVM,点击
Attach。 - 在
类操作中过滤并选择类,可执行 dump、.class替换或 jar 批量替换。 - 在
动态追踪中配置类名/方法名、图片加载或静态值追踪,然后点击开始。
- JVM 标准
redefineClasses通常不能新增/删除字段、方法或改变继承结构,只适合方法体等兼容修改。 - 当前追踪是低侵入采样式追踪,不会改写业务字节码;后续可以在
TraceService边界内接入 ASM/Byte Buddy 做真正的入参、返回值、异常插桩。 - 反射修改 v0 只支持静态字段和静态方法,实例对象引用管理可以后续扩展。