java审计调试方式
字数 1837 2025-08-06 20:12:33
Java审计调试方式详解
0x00 前言
在Java项目审计过程中,我们会遇到多种调试场景,包括:
- 有源码可直接调试
- 只有Jar包或class文件
- 有源码和Jar包但编译依赖问题
- 需要调试native方法的C/C++实现
0x01 调试无源码Jar包(SpringBoot应用)
调试步骤
-
启动Jar包时添加调试参数:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar web.jar当看到"Listening for transport dt_socket at address: xxxx"表示调试端口已开放
-
IDEA添加依赖:
- 新建空项目
File -> Project Structure -> Project Settings -> Libraries- 添加Jar包中的
BOOT-INF/classes作为依赖 - 添加
BOOT-INF/lib下的所有Jar包作为依赖
-
配置Remote JVM Debug:
Add Configuration -> Remote JVM Debug- 配置端口与启动参数一致
- 确保JDK版本与运行环境一致
注意事项
- 直接添加整个Jar包会导致断点失效
- 正确做法是只添加
BOOT-INF/classes目录 - 第三方依赖需要添加
BOOT-INF/lib下的所有Jar包
0x02 调试无源码Web中间件(以Tomcat为例)
调试步骤
-
修改启动脚本添加调试参数:
- Windows (
catalina.bat):set JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" - Linux (
catalina.sh):export JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
- Windows (
-
启动Tomcat:
- Windows:
bin/startup.bat - Linux:
bin/startup.sh
- Windows:
-
IDEA添加依赖:
- 添加
webapp/WEB-INF/classes的class文件 - 添加
WEB-INF/lib中的Jar包
- 添加
-
配置Remote JVM Debug
0x03 无源码调试中加入源码依赖
操作步骤(以Tomcat为例)
- 下载对应版本的Tomcat源码包(
xxx-src.zip) - 解压后找到
java目录(包含Tomcat Java代码) - 在IDEA中:
- 先添加Tomcat的Jar包依赖(位于Tomcat的
lib目录) - 再添加Tomcat Java源码依赖
- 先添加Tomcat的Jar包依赖(位于Tomcat的
效果
- 调试时可查看Tomcat调用栈
- 可查看源码注释等完整信息
0x04 无源码调试中的全局搜索问题
解决方案
-
批量反编译Jar包:
- 使用工具:jad、jd-gui
- 或编写脚本调用IDEA的
java-decompiler.jar
-
将反编译结果放入项目:
- 将得到的"java源码文件"放在IDEA的
src目录下 - 这样全局搜索就能找到代码片段
- 将得到的"java源码文件"放在IDEA的
-
定位类文件:
- 搜索到代码片段后
- 使用
Ctrl+N快捷键根据全类名定位类文件
0x05 调试Java Service Wrapper打包的程序
操作步骤(以zoho项目为例)
-
修改配置文件:
- 编辑
conf/wrapper.conf - 在现有参数后追加调试参数(注意序号连续):
wrapper.java.additional.44=-Xdebug wrapper.java.additional.45=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=23333
- 编辑
-
启动wrapper服务
-
IDEA配置:
- 将相关Jar包添加为依赖
- 配置Remote JVM Debug(端口与配置一致)
0x06 调试native方法
关键步骤
-
编译自定义JDK:
- 需要自行编译包含调试符号的JDK
-
IDEA和CLion联动调试:
- IDEA调试Java部分
- CLion调试native部分
-
具体操作:
- 参考专门的JDK编译和native调试文档
- 需要配置符号路径和调试环境
调试参数说明
常用调试参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005transport=dt_socket:使用socket传输server=y:作为调试服务器suspend=n:不挂起启动address=5005:调试端口
注意事项
-
版本一致性:
- 确保调试端和被调试端的JDK版本一致
-
依赖路径正确性:
- SpringBoot应用必须添加
BOOT-INF/classes而非整个Jar - Web应用需要添加
WEB-INF/classes和WEB-INF/lib
- SpringBoot应用必须添加
-
源码映射:
- 要查看源码注释需要下载对应版本的源码
- 并正确添加到项目依赖中
-
全局搜索:
- 需要反编译后放入项目目录才能搜索到内容
-
native调试:
- 需要特殊的环境配置和JDK编译