如何判断在IDEA中程序正在运行或正在Debug {#如何判断在IDEA中程序正在运行或正在Debug}
给大家分享一个有趣又无用的东西,如何判断在IDEA中程序正在运行或正在Debug
在这个之前我们首先需要了解一个类ManagementFactory ,它是 Java 标准库中的一个类,它提供了访问运行时系统管理接口的工厂方法。通过 ManagementFactory 类,可以获取包括操作系统、内存、线程、类加载器等在内的多种系统管理信息。
一些常用的用途包括:
- 获取运行时信息:可以通过 ManagementFactory.getRuntimeMXBean()方法获取与 Java 虚拟机的运行时信息相关的 bean,包括虚拟机的名称、虚拟机的启动时间、虚拟机的系统属性等。
- 获取操作系统信息:可以使用 ManagementFactory.getOperatingSystemMXBean()方法获取与操作系统相关的 bean,包括 CPU 数量、系统负载等信息。
- 获取内存信息:可以使用 ManagementFactory.getMemoryMXBean()方法获取与内存相关的 bean,包括堆内存使用情况、非堆内存使用情况等。
- 获取线程信息:可以使用 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呢"); } |
下面来看看效果,直接运行
 debug运行
debug运行
简单但是有趣,接下来我们便可以结合之前提到的混淆方案,继续给IDEA做更定向的投毒,同时我们也可以通过这样一串简单的代码去尝试阻止别人在IDEA中运行或者调试我们的代码
 51工具盒子
51工具盒子 
                 
                             
                         
                         
                        