🖌️
Functfan的格物致知
  • 写在前面
  • java技术
    • J2EE 全面简介
  • java安全
    • 反序列化漏洞
      • 序列化/反~
      • Ysoserial
        • Java反序列化之Vaadin1
        • Java反序列化之Groovy1
        • Java反序列化之Jdk7u21
        • Java反序列化之Commons beanUtils
        • Java反序列化之Commons-Collections
          • CommonsCollections1
          • CommonsCollections2
          • CommonsCollections1
          • CommonsCollections2
          • CommonsCollections3
          • CommonsCollections4
          • CommonsCollections5
          • CommonsCollections6
          • CommonsCollections7
      • Marshalsec
    • XXE漏洞
      • XXE爱之初印象
      • XXE漏洞写法及防御
      • XXExploiter工具
  • web安全
    • 一句话木马
  • 渗透测试
    • 网络资产收集
    • 端口服务探测
    • 边界突破
    • 内网穿透
    • 容器与K8S安全测试
  • 漏洞挖掘
    • web类框架研究报告
      • Xstream经验
      • weblogic漏洞研究经验笔记
      • WebLogic安全研究报告
    • 漏洞挖掘入门
      • 小白入门
      • 源代码审计方法
        • Java类编译与反编译基础
        • IDEA使用技巧
        • IDEA Java程序调试
      • Fuzzing技术
        • 方法论
          • fuzzing的四个技能
        • 工具集
          • tmnt-Web应用漏洞fuzzer
          • wfuzz-web app fuzzer
          • AFL-基于变异的fuzz工具
      • 物联网漏洞挖掘技术
        • 物联网设备固件模拟分析环境*(亲测下载好慢,不建议使用该教程)
        • 智能设备漏洞挖掘之固件提取
        • pwndbg调试工具使用教程
    • 漏洞情报监测
    • 漏洞安全检测工具
      • 容器安全检测脚本总结
      • WebLogic漏洞检测小工具
    • 漏洞复现
      • 操作系统
        • windows
        • Linux
          • 脏牛漏洞-Docker逃逸POC(dirtycow-vdso)代码分析
          • Dirty CoW脏牛内核提权漏洞(CVE-2016-5195)
      • 数据库
      • WEB服务组件
        • CVE-2020-2883
        • F5 BIG-IP远程代码执行漏洞(CVE-2020-5902)
        • Apache Solr 远程命令执行漏洞(CVE-2019-0193)
      • 云计算安全
        • CVE-2020-15257-容器逃逸-containerd
      • 物联网安全
        • TP-Link SR20 本地网络远程代码执行漏洞
  • CTF比赛
    • BUUCTF-练习场web
    • xctf-攻防世界新手练习区web
    • Exploit利器——Pwntools
  • 新技术研究
    • 区块链
    • 云原生安全
      • 虚拟化hypervisor简介
      • Docker容器基础
        • 云原生攻防研究:容器基础
          • Linux内核基础
          • Docker容器基础
          • 理解容器进程
          • 组件组成:剖析 Docker 组件作用及其底层工作原理
          • Docker镜像的内部结构(四)
          • docker之namespace,cgroup与unionFS
          • Linux内核安全模块之AppArmor
          • Linux沙箱之seccomp
          • Linux权限管理之Capabilities
        • 云原生攻防研究:Docker安全性与攻击面分析
        • 云原生攻防研究:容器逃逸技术概览
        • 云原生攻防研究:针对容器的渗透测试方法
        • 云原生攻防研究:漏洞缓解技术
      • Kubernetes容器编排基础
        • k8s基本概念
        • 云原生攻防研究:Kubernetes安全分析
        • 云原生攻防研究:Kubernetes攻击矩阵
    • 联邦安全
    • 云边协同
    • 安全多方计算
由 GitBook 提供支持
在本页
  • IDEA Java程序调试
  • 一、创建或打开一个Java项目
  • 二、调试模式参数配置
  • 三、在IDEA中启用远程调试
  • 四、远程调试Java应用程序
  • 五、调试Tomcat示例
  1. 漏洞挖掘
  2. 漏洞挖掘入门
  3. 源代码审计方法

IDEA Java程序调试

IDEA Java程序调试

上一页IDEA使用技巧下一页Fuzzing技术

最后更新于4年前

IDEA Java程序调试

一、创建或打开一个Java项目

如果有需要调试的项目源码,可以直接打开一个存在的项目,如果没有项目源码只有class或者jar文件的话需要在IDEA中添加jar到依赖库。

二、调试模式参数配置

Java应用程序可以在运行时添加启动参数即可调试,需要注意的是不同的JDK版本的调试参数可能会不一样。

JDK5-8:

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

JDK9+:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005

suspend=n表示的是启动Java应用时是否立即进入调试模式,suspend=y表示启动即暂停,suspend=n则表示启动时不需要暂停。address=*:5005表示的是Debug监听的服务地址和端口,根据需求修改,上述配置会监听到0.0.0.0。

三、在IDEA中启用远程调试

点击工具栏的Add Configuration...,点击左侧的+号,选择Remote,如下图:

image-20200519165645657

配置远程Debug信息,填入远程服务的IP地址、端口信息,注意JDK版本,JDK8+使用的调试参数是不一样的,最后如果默认选择的classpath不对需要手动选择下classpath。

四、远程调试Java应用程序

以调试模式启动Java应用也很简单,只需要加上调试参数即可:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 Test

这个时候程序会处于等待状态(光标会一致闪烁,等待远程连接):

4.1 有源码调试

假设我们有需要调试的应用程序代码,我们可以直接在Java类上设置断点即可调试。

示例-Test.java:

/**
 * Creator: yz
 * Date: 2020-05-19
 */
public class Test {

    public static void main(String[] args) {
          System.out.println(args);
    }

}

这个时候就可以看到程序已经运行至断点的位置了:

4.2 无源码,只有jar或者class文件调试

如上示例,假设我们这个时候只有Test.class的class文件或者Test.class对应的test.jar文件,我们应该怎么调试呢?

只有class的情况下我们进入源码所在的包,然后打包成jar文件即可:

cd src
jar -cvf test.jar *
ls -la

命令执行结果:

已添加清单
正在添加: Test.class(输入 = 342) (输出 = 187)(压缩了 45%)
[yz@yz:src]$ ls -la
total 16
drwxr-xr-x  4 yz  staff  128 May 19 17:21 .
drwxr-xr-x  5 yz  staff  160 May 19 16:57 ..
-rw-r--r--  1 yz  staff  342 May 19 17:20 Test.class
-rw-r--r--  1 yz  staff  641 May 19 17:22 test.jar

这个时候统计目录就会生成一个test.jar,我们只需要把这个jar添加到classpath然后设置好断点就可以调试了。

添加jar到IDEA的classpath,可以直接选择jar目录或者jar文件然后右键Add as Library,也可以选择项目以外的目录或者jar文件。

示例-直接选择项目中的jar:

示例-选择项目以外的jar:

选择jar需要添加的classpath信息,通常不需要修改:

启动Test示例:

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

展开test.jar并在Test.class中设置断点,最后点击工具栏的调试按钮即可调试:

五、调试Tomcat示例

常见的中间件启动脚本中都内置了调试参数,如Tomcat的bin/catalina.sh就内置了调试参数:

但最简单直接的方式是直接在Tomcat的启动脚本catalina.sh(Windows换成catalina.bat)中添加Debug参数即可:

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

然后再使用catalina.sh启动Tomcat就会发现Tomcat会处于等待远程连接状态:

接下来就只需要导入Tomcat的jar并设置断点就可以调试了。

添加Tomcat的lib目录到IDEA的classpath:

展开左侧External Libraries->lib->选择需要断点的类->点击工具栏的Debug:

然后在webapps/ROOT目录下新建一个test.jsp:

<%=request.getParameter("id")%>

最后点击工具栏的Debug后控制台的Tomcat就会自动启动,知道触发断点为止,上图示例中我设置的断点是org.apache.catalina.connector.RequestFacade#getParameter,所以需要使用浏览器请求任意页面并传入参数(访问http://localhost:8080/test.jsp?id=yzmm)即可进入断点:

其实调试Tomcat最简单的方式是直接启动一个Maven Web项目并使用Tomcat启动,然后在pom.xml中配置对应版本的Tomcat的依赖就可以直接Debug了,使用这种调试方法可以让您学会如何使用IDEA调试任意的Java程序,仅此而已。

image-20200519165749366
image-20200519171103826

在待调试的程序点设置断点,并点击IDEA Debug配置:

image-20200519171503538
image-20200519172506843
image-20200519173445416
image-20200519172552668
image-20200519173128450
image-20200519173228789
image-20200519174040635
image-20200519175322193
image-20200519175350559
image-20200519175529897
image-20200519175927288
image-20200519180418785
image-20200519171214694