使用sa-jdi.jar dump 内存中的class

本文介绍了一种从运行中的Java进程中Dump特定类文件的方法。通过使用sd-jdi.jar工具包中的ClassDump实用程序,结合自定义过滤器,能够有效地提取指定前缀的类文件字节码,并保存为.class文件,便于进一步分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在分析一个 jar 包时发现他把关键类采用了运行时使用 classloader 的方式加载了。懒得分析算法了,可以使用 jdk 自带的工具 dump 出需要的class.

正文

从运行的java进程里dump出运行中的类的class文件的方法,所知道的有两种

  • 用agent attatch 到进程,然后利用 Instrumentation和 ClassFileTransformer就可以获取 到类的字节码了。

  • 使用 sd-jdi.jar里的工具

本文介绍的就是使用 sd-jdi.jar 来dump. sd-jdi.jar里自带的的 sun.jvm.hotspot.tools.jcore.ClassDump 可以把类的class内容dump到文件里。

ClassDump 里可以设置两个 System properties

  • sun.jvm.hotspot.tools.jcore.filter Filter的类名
  • sun.jvm.hotspot.tools.jcore.outputDir 输出的目录
示例

首先写一个 filter


import sun.jvm.hotspot.tools.jcore.ClassFilter;
import sun.jvm.hotspot.oops.InstanceKlass;
import sun.jvm.hotspot.tools.jcore.ClassDump;
public class MyFilter implements ClassFilter {
    @Override
    public boolean canInclude(InstanceKlass kls) {
        String klassName = kls.getName().asString();
        return klassName.startsWith("com/fr/license/selector/");
    }
}  

代码很显而易见了, 作用是 dump 所有 以 com/fr/license/selector/ 开头的 类的· 字节码。

然后编译成class文件

要使用这个首先需要把 sa-jdi.jar 加到 javaclasspath 里。

paste image

进入 刚刚写的 filter 类的class文件的目录下。执行


java  -Dsun.jvm.hotspot.tools.jcore.filter=MyFilter  -Dsun.jvm.hotspot.tools.jcore.outputDir=d:\dump  sun.jvm.hotspot.tools.jcore.ClassDump 5308

MyFilter 改为你自己的类名, 5308 为目标 java进程的 pid(可以使用 jps 查看)。然后就会在 d:\dump 产生相应的 class 文件。

问题解决

  • 如果直接点击应用的 exe, 来启动应用,使用 jps 获取到的 pid, 可能没有办法附加, 所以我们要找到启动的命令, 比如 bat脚本里面。

  • 一般大型应用会自带 jre, 我们要使用上面的技术,替换 jre,为我们的,才能正常dump, 否则会出现版本不匹配。
  • windows下还需把 sawindbg.dll 放到 jre/bin/ 和java.exe 同目录下。否则可能会遇到 加载不了这个 dll 的问题。

paste image

最后

搞java应用第一步还是找到启动的命令,便于后面的分析。一般别使用 exe启动应用

转载于:https://www.cnblogs.com/hac425/p/9416705.html

### 解决Java项目中缺失`sa-jdi.jar`文件的方法 当遇到Java项目中缺少`sa-jdi.jar`的情况时,通常是因为该库未被正确配置或路径设置不正确。以下是几种可能的解决方案: #### 1. 设置环境变量 确保已正确定义了`JAVA_HOME`环境变量指向正确的JDK安装目录[^2]。这一步对于确保所有依赖于JDK工具链的应用程序都能正常工作至关重要。 #### 2. 添加至类路径 如果是在命令行下执行,则可以在启动应用程序之前通过 `-classpath` 参数指定 `sa-jdi.jar` 的位置;如果是IDE内开发,则需进入项目的构建路径设置界面,手动添加此Jar包到工程的Library列表里。 #### 3. 使用Maven或Gradle管理依赖 推荐采用自动化构建工具如 Maven 或 Gradle 来管理第三方库。这样不仅简化了版本控制还减少了人为错误的可能性。下面是一个简单的例子展示如何在pom.xml中声明对`sa-jdi.jar`(假设它存在于公共仓库)的依赖关系: ```xml <dependency> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> <version>1.2.1</version> </dependency> ``` 需要注意的是,由于`sa-jdi.jar`并非公开发布的标准组件,因此有时可能无法直接从中央仓库获取。此时可以考虑下载官方提供的二进制分发版并按照上述方式本地引入。 #### 4. 安装完整的JDK套件 某些情况下,单独安装特定版本的 JDK 可能会遗漏一些辅助性的工具集。建议重新安装最新稳定版本的 Oracle JDK 或 OpenJDK ,以确保获得全部必要的支持文件[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值