web项目中的jar包调试

Jar 包其实是一堆 Class 文件,按照全限定名为目录结构的一个 Zip 包。

启动:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -jar .\XXXXXX.jar

JDB的调试方法:jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=5005

这里讲了关于JDB的调试方法,但是实际上一般调试还是用IDEA自带的调试工具,这边来调试冰蝎作为演示

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -jar behinder.jar

接着idea进行调试设置,如下所示

java 编译器token java 编译器 中间 调试文件_jar

单个Class文件调试

对于我们获取到的单个 Class 文件,又该如何调试呢?IDEA 支持对于 Jar 包自动反编译并添加断点,但是对于单个 Class 文件,却只会自动反编译,并不允许我们调试添加断点。

首先反编译 Class 文件,找到 Class 文件的全限定名,例如 com.unicodesec.MyClass。根据全限定名,创建目录,例如创建 com 目录,在 com 目录中创建 unicodesec 目录,在 unicodesec 目录中放入我们的 Class 文件。

回到 com 目录中,对 com 目录进行 zip 压缩,并将压缩包的后缀名改成 jar。随后只需要将 jar 包添加到 IDEA 中,按照上面的 Jar 包调试即可。

没有机器码与源码行号的对应关系

新建一个 java 文件,将代码抠出来,粘贴到新建的 java 文件中,但是不是一定就能成功。

这里也有一个恢复行号表的工具:http://dirty-joe.com/

远程调试WEB项目

windows

修改catalina.bat文件,增加调试模式

set JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"

java 编译器token java 编译器 中间 调试文件_Java_02

接着在Tomcat的bin目录下执行如下命令

catalina.bat start

java 编译器token java 编译器 中间 调试文件_反编译_03

将web源码从虚拟机中拷⻉到宿主机,使⽤idea打开,设置远端调试即可

java 编译器token java 编译器 中间 调试文件_反编译_04

调试结果如下图所示

java 编译器token java 编译器 中间 调试文件_java 编译器token_05

mac

修改catalina.sh文件,增加调试模式

# Register custom URL handlers
# Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"

java 编译器token java 编译器 中间 调试文件_jar_06

当反序列化的类对象不在当前的工程中

什么意思呢?就比如你自己调试下自己的内存马,这个内存马是在另一个工程中的代码,此时你反序列化单步跟到实例化的时候却发现跟不进去了,这里我指的跟不进去的是你内存马的代码,这时候你可以在当前调试的工程中创建对应的包名中放入对应的内存马.java的文件,这样就可以进行调试这个内存马的代码了

java 编译器token java 编译器 中间 调试文件_java 编译器token_07

审计的时候搜索无法搜索jar包中的class文件的内容

自己可以通过一些反编译工具,如xjad对目标下的jar包全部进行反编译成java文件,然后再去审计即可

如何对一个jar文件中的class文件进行修改

这里用到的是idea自带的反编译功能,创建一个对应的全限定名的包,然后放入该class文件在idea中进行反编译的内容,复制到自己创建的全限定名下的包下的文件内容中,然后进行编译

编译完了之后会生成一个class文件,把这个class文件进行替换到jar包中即可

docker

docker run --name="bitbucket" -d -p 7990:7990 -p 7999:7999 -p 5050:5050 -e
JVM_SUPPORT_RECOMMENDED_ARGS="-Xdebug -
Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5050"
atlassian/bitbucket-server:7.6.17-ubuntu-jdk11