如何判断在IDEA中程序正在运行或正在Debug

如何判断在IDEA中程序正在运行或正在Debug

给大家分享一个有趣又无用的东西,如何判断在IDEA中程序正在运行或正在Debug

在这个之前我们首先需要了解一个类ManagementFactory ,它是 Java 标准库中的一个类,它提供了访问运行时系统管理接口的工厂方法。通过 ManagementFactory 类,可以获取包括操作系统、内存、线程、类加载器等在内的多种系统管理信息。

一些常用的用途包括:

  1. 获取运行时信息:可以通过 ManagementFactory.getRuntimeMXBean() 方法获取与 Java 虚拟机的运行时信息相关的 bean,包括虚拟机的名称、虚拟机的启动时间、虚拟机的系统属性等。
  2. 获取操作系统信息:可以使用 ManagementFactory.getOperatingSystemMXBean() 方法获取与操作系统相关的 bean,包括 CPU 数量、系统负载等信息。
  3. 获取内存信息:可以使用 ManagementFactory.getMemoryMXBean() 方法获取与内存相关的 bean,包括堆内存使用情况、非堆内存使用情况等。
  4. 获取线程信息:可以使用 ManagementFactory.getThreadMXBean() 方法获取与线程相关的 bean,包括线程数量、线程状态等。

因此我们通过 ManagementFactory.getRuntimeMXBean().getInputArguments() 即可获得所有 JVM 参数

通过下面这样简单的代码我们可以

1
2
3
4
List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
for (String arg : inputArguments) {
System.out.println(arg);
}

以我的电脑为例,普通运行时

1
2
-javaagent:/Applications/myapp/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=51347:/Applications/myapp/IntelliJ IDEA.app/Contents/bin
-Dfile.encoding=UTF-8

debug时

1
2
3
-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51362,suspend=y,server=n
-javaagent:/Users/y4tacker/Library/Caches/JetBrains/IntelliJIdea2021.3/captureAgent/debugger-agent.jar
-Dfile.encoding=UTF-8

我们不难发现在运行时与debug时,注入了不同的Agent对象,因此我们便可以利用这个差异性去判断程序是在运行还是在debug,当然为了减小检测的动静如果我们不使用ManagementFactory怎么办?

解决方法也很简单,既然注入了不同的Agent那么就必然在加载时就有着不同的类

因此通过下面这样简单的几行代码,就能解决这个问题啦

1
2
3
4
5
6
7
8
try {
Thread.currentThread().getContextClassLoader().loadClass("com.intellij.rt.debugger.agent.CaptureAgent");
System.out.println("我在debug呢");
}catch (java.lang.ClassNotFoundException e){
Thread.currentThread().getContextClassLoader().loadClass("com.intellij.rt.ant.execution.AntMain2");
System.out.println("我没在debug呢");

}

下面来看看效果,直接运行

image-20240104233416198debug运行image-20240104233434028

简单但是有趣,接下来我们便可以结合之前提到的混淆方案,继续给IDEA做更定向的投毒,同时我们也可以通过这样一串简单的代码去尝试阻止别人在IDEA中运行或者调试我们的代码