给大家分享一个有趣又无用的东西,如何判断在IDEA中程序正在运行或正在Debug
在这个之前我们首先需要了解一个类ManagementFactory
,它是 Java 标准库中的一个类,它提供了访问运行时系统管理接口的工厂方法。通过 ManagementFactory
类,可以获取包括操作系统、内存、线程、类加载器等在内的多种系统管理信息。
一些常用的用途包括:
- 获取运行时信息:可以通过
ManagementFactory.getRuntimeMXBean()
方法获取与 Java 虚拟机的运行时信息相关的 bean,包括虚拟机的名称、虚拟机的启动时间、虚拟机的系统属性等。 - 获取操作系统信息:可以使用
ManagementFactory.getOperatingSystemMXBean()
方法获取与操作系统相关的 bean,包括 CPU 数量、系统负载等信息。 - 获取内存信息:可以使用
ManagementFactory.getMemoryMXBean()
方法获取与内存相关的 bean,包括堆内存使用情况、非堆内存使用情况等。 - 获取线程信息:可以使用
ManagementFactory.getThreadMXBean()
方法获取与线程相关的 bean,包括线程数量、线程状态等。
因此我们通过 ManagementFactory.getRuntimeMXBean().getInputArguments()
即可获得所有 JVM 参数
通过下面这样简单的代码我们可以
1 | List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments(); |
以我的电脑为例,普通运行时
1 | -javaagent:/Applications/myapp/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=51347:/Applications/myapp/IntelliJ IDEA.app/Contents/bin |
debug时
1 | -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51362,suspend=y,server=n |
我们不难发现在运行时与debug时,注入了不同的Agent对象,因此我们便可以利用这个差异性去判断程序是在运行还是在debug,当然为了减小检测的动静如果我们不使用ManagementFactory
怎么办?
解决方法也很简单,既然注入了不同的Agent那么就必然在加载时就有着不同的类
因此通过下面这样简单的几行代码,就能解决这个问题啦
1 | try { |
下面来看看效果,直接运行
debug运行
简单但是有趣,接下来我们便可以结合之前提到的混淆方案,继续给IDEA做更定向的投毒,同时我们也可以通过这样一串简单的代码去尝试阻止别人在IDEA中运行或者调试我们的代码