You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kali Linux中Java运行异常:Jar文件抛出NoClassDefFoundError求助

解决Kali Linux中运行老版本Jar(如CobaltStrike)出现的java.lang.NoClassDefFoundError问题

我之前在Kali上折腾CobaltStrike 3.8版本的时候,完完全全碰到过一模一样的报错!这个问题的根源其实很好定位:

Exception in thread "main" java.lang.NoClassDefFoundError: sun/swing/plaf/synth/SynthIcon

为什么会出现这个错误?

sun/swing/plaf/synth/SynthIconOracle JDK私有API里的类,而Kali Linux默认预装的是OpenJDK,而且版本普遍是Java 11及以上。从Java 9开始,Oracle官方就把这些以sun.*开头的私有模块给移除并隐藏了——老版本的CobaltStrike(比如你提到的2.5、3.6、3.8)都是基于Java 8开发的,依赖这些私有类,自然就会抛出找不到类的异常。

具体解决方案

这里给你两个可行的办法,按需选择:

1. 全局切换到Java 8(推荐,一劳永逸)

老版本CS对Java 8的兼容性最好,不管是Oracle JDK还是OpenJDK 8都可以,这里以Oracle JDK 8为例:

  • 先卸载当前系统里的高版本OpenJDK,避免冲突:
    sudo apt remove --purge openjdk-*
    sudo apt autoremove
    
  • 下载对应架构的Oracle JDK 8安装包(比如amd64版本),解压到系统的JVM目录:
    sudo tar zxvf jdk-8uXXX-linux-x64.tar.gz -C /usr/lib/jvm/
    
  • update-alternatives配置系统默认Java版本:
    sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_XXX/bin/java 100
    sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_XXX/bin/javac 100
    
  • 验证配置是否成功:
    java -version
    
    输出显示java version "1.8.0_XXX"就说明没问题了,之后直接运行CS的Jar包即可。

2. 临时指定Java版本运行(适合不想全局切换的场景)

如果你不想替换系统默认的Java版本,可以直接用Java 8的可执行文件路径来运行Jar:

/usr/lib/jvm/jdk1.8.0_XXX/bin/java -jar cobaltstrike.jar

这里的jdk1.8.0_XXX要替换成你实际解压的JDK目录名称。

补充说明

如果不想用Oracle JDK,也可以尝试安装OpenJDK 8,它同样包含这些sun.*的私有类,命令如下:

sudo apt install openjdk-8-jdk

安装完成后同样用update-alternatives切换版本即可,不过Oracle JDK对CS这类商业工具的兼容性可能会略好一点。

内容的提问来源于stack exchange,提问作者AxReal GS

火山引擎 最新活动