java审计调试方式
字数 1837 2025-08-06 20:12:33

Java审计调试方式详解

0x00 前言

在Java项目审计过程中,我们会遇到多种调试场景,包括:

  1. 有源码可直接调试
  2. 只有Jar包或class文件
  3. 有源码和Jar包但编译依赖问题
  4. 需要调试native方法的C/C++实现

0x01 调试无源码Jar包(SpringBoot应用)

调试步骤

  1. 启动Jar包时添加调试参数

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

    当看到"Listening for transport dt_socket at address: xxxx"表示调试端口已开放

  2. IDEA添加依赖

    • 新建空项目
    • File -> Project Structure -> Project Settings -> Libraries
    • 添加Jar包中的BOOT-INF/classes作为依赖
    • 添加BOOT-INF/lib下的所有Jar包作为依赖
  3. 配置Remote JVM Debug

    • Add Configuration -> Remote JVM Debug
    • 配置端口与启动参数一致
    • 确保JDK版本与运行环境一致

注意事项

  • 直接添加整个Jar包会导致断点失效
  • 正确做法是只添加BOOT-INF/classes目录
  • 第三方依赖需要添加BOOT-INF/lib下的所有Jar包

0x02 调试无源码Web中间件(以Tomcat为例)

调试步骤

  1. 修改启动脚本添加调试参数

    • 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"
      
  2. 启动Tomcat

    • Windows: bin/startup.bat
    • Linux: bin/startup.sh
  3. IDEA添加依赖

    • 添加webapp/WEB-INF/classes的class文件
    • 添加WEB-INF/lib中的Jar包
  4. 配置Remote JVM Debug

0x03 无源码调试中加入源码依赖

操作步骤(以Tomcat为例)

  1. 下载对应版本的Tomcat源码包(xxx-src.zip)
  2. 解压后找到java目录(包含Tomcat Java代码)
  3. 在IDEA中:
    • 先添加Tomcat的Jar包依赖(位于Tomcat的lib目录)
    • 再添加Tomcat Java源码依赖

效果

  • 调试时可查看Tomcat调用栈
  • 可查看源码注释等完整信息

0x04 无源码调试中的全局搜索问题

解决方案

  1. 批量反编译Jar包

    • 使用工具:jad、jd-gui
    • 或编写脚本调用IDEA的java-decompiler.jar
  2. 将反编译结果放入项目

    • 将得到的"java源码文件"放在IDEA的src目录下
    • 这样全局搜索就能找到代码片段
  3. 定位类文件

    • 搜索到代码片段后
    • 使用Ctrl+N快捷键根据全类名定位类文件

0x05 调试Java Service Wrapper打包的程序

操作步骤(以zoho项目为例)

  1. 修改配置文件

    • 编辑conf/wrapper.conf
    • 在现有参数后追加调试参数(注意序号连续):
      wrapper.java.additional.44=-Xdebug
      wrapper.java.additional.45=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=23333
      
  2. 启动wrapper服务

  3. IDEA配置

    • 将相关Jar包添加为依赖
    • 配置Remote JVM Debug(端口与配置一致)

0x06 调试native方法

关键步骤

  1. 编译自定义JDK

    • 需要自行编译包含调试符号的JDK
  2. IDEA和CLion联动调试

    • IDEA调试Java部分
    • CLion调试native部分
  3. 具体操作

    • 参考专门的JDK编译和native调试文档
    • 需要配置符号路径和调试环境

调试参数说明

常用调试参数:

  • -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
    • transport=dt_socket:使用socket传输
    • server=y:作为调试服务器
    • suspend=n:不挂起启动
    • address=5005:调试端口

注意事项

  1. 版本一致性

    • 确保调试端和被调试端的JDK版本一致
  2. 依赖路径正确性

    • SpringBoot应用必须添加BOOT-INF/classes而非整个Jar
    • Web应用需要添加WEB-INF/classesWEB-INF/lib
  3. 源码映射

    • 要查看源码注释需要下载对应版本的源码
    • 并正确添加到项目依赖中
  4. 全局搜索

    • 需要反编译后放入项目目录才能搜索到内容
  5. native调试

    • 需要特殊的环境配置和JDK编译
Java审计调试方式详解 0x00 前言 在Java项目审计过程中,我们会遇到多种调试场景,包括: 有源码可直接调试 只有Jar包或class文件 有源码和Jar包但编译依赖问题 需要调试native方法的C/C++实现 0x01 调试无源码Jar包(SpringBoot应用) 调试步骤 启动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 ): Linux ( catalina.sh ): 启动Tomcat : Windows: bin/startup.bat Linux: bin/startup.sh 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调用栈 可查看源码注释等完整信息 0x04 无源码调试中的全局搜索问题 解决方案 批量反编译Jar包 : 使用工具:jad、jd-gui 或编写脚本调用IDEA的 java-decompiler.jar 将反编译结果放入项目 : 将得到的"java源码文件"放在IDEA的 src 目录下 这样全局搜索就能找到代码片段 定位类文件 : 搜索到代码片段后 使用 Ctrl+N 快捷键根据全类名定位类文件 0x05 调试Java Service Wrapper打包的程序 操作步骤(以zoho项目为例) 修改配置文件 : 编辑 conf/wrapper.conf 在现有参数后追加调试参数(注意序号连续): 启动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=5005 transport=dt_socket :使用socket传输 server=y :作为调试服务器 suspend=n :不挂起启动 address=5005 :调试端口 注意事项 版本一致性 : 确保调试端和被调试端的JDK版本一致 依赖路径正确性 : SpringBoot应用必须添加 BOOT-INF/classes 而非整个Jar Web应用需要添加 WEB-INF/classes 和 WEB-INF/lib 源码映射 : 要查看源码注释需要下载对应版本的源码 并正确添加到项目依赖中 全局搜索 : 需要反编译后放入项目目录才能搜索到内容 native调试 : 需要特殊的环境配置和JDK编译