问题:Burp Suite加载插件出现NoClassDefFoundError问题解决方案

问题描述:

插件工程中测试代码运行成功了,然后右键工程>Export>JAR file导出插件。最后使用Burp Suite加载该插件时,出现以下错误!

java.lang.ClassNotFoundException: org.apache.http.HttpEntity
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at burp.hie.a(Unknown Source)
    at burp.hie.<init>(Unknown Source)
    at burp.sxf.a(Unknown Source)
    at burp.r5h.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

问题分析:

这是在运行时找不到依赖,下图中相同工程不同编译的方式。导致jar文件的结构很不一样。左边可以成功被burp加载运行,右边会报ClassNotFoundException。

jar文目录结构

说明右图中lib中的jar文件无法被Burp调用。而我们需要编译成像左图结构的jar文件。右键工程>Export>Runable JAR file就可以导出该结构的jar。但这样的前提是你的工程中必须有main函数。所以这样导出会包含垃圾代码。下面介绍更好的一些方法。

其实将问题转换为java问题的话,就像解决以下问题一样:

[问题]A工程调用B.jar,而B.jar依赖于c.jar。这是如何让A能成功调用B.jar?

  1. A工程同时引入B.jar,C.jar
  2. 先将B.jar和C.jar打成一个jar(BC.jar),A工程只需要引入BC.jar。有以下两种方式打成一个jar:
    • 编译到一起
    • B.jar中包含C.jar,A工程引入B.jar(尚未成功,可以参考Export>Runable JAR file>Packeage required libraries into generated JAR生成的JAR代码,使用代码的方式找到相关类。)
  1. 单独编译A工程为A.jar,但是运行时使用以下命令运行。

     java -cp C.jar;B.jar;A.jar A.main
    

更多原理请阅读java中的jar文件

解决方法:

  • Export>JAR

    java -classpath lib\commons-codec-1.9.jar;lib\fluent-hc-4.5.3.ja;lib\httpclient-4.5.3.jar;lib\httpclient-cache-4.5.3.jar;lib\httpcore-4.4.8.jar;lib\httpmime-4.5.3.jarr;BurpLoader.jar larry.lau.BurpLoader
    
  • 右键工程>Export>Runable JAR file

  • 编写ant xml文件

  • 使用fatjar编译

  • 使用maven编译

参考文章

java.lang.NoClassDefFoundError: org/apache/http/HttpEntity

JAR包引用其它JAR包的classpath问题

results matching ""

    No results matching ""