3

是否可以在 Java 应用程序中禁用检测库,或者检查当前是否正在运行?

出于安全原因,我的目标是防止用户在我的应用程序上运行检测实现。

经过一些实验,我自己提出了一个理论解决方案,其中我发现java.class.path系统属性在路径分隔符之后以 -javaagent VM 参数 jar 文件的路径结尾。从这个属性中,我可以检查一个类路径属性是否是我的程序本身未指定的外部 jar,如果检测到外来 jar,则终止我的应用程序。

但是,上面的方法对我来说似乎有些 hacky,但我还没有找到直接阻止 -javaagent 参数的方法,也没有找到检测仪器代理库的简单方法。这些更清洁的替代品中的任何一种都可能吗?

4

2 回答 2

4

Java 代理也可以在运行时加载:

vm = com.sun.tools.attach.VirtualMachine.attach(pid);
agent = new File("agent.jar");
vm.loadAgent(agent.toString());
vm.detach();

我认为您的代码在这种情况下不起作用。
可以像这样检查是否允许附加:

SecurityManager sm = System.getSecurityManager();
if (sm != null)
    sm.checkPermission(new AttachPermission("attachVirtualMachine"));
于 2014-08-07T06:51:52.150 回答
2

在做了更多研究之后,几天前我在编写了一个临时的类路径属性分析器后找到了一个可靠的解决方案。

我使用 RuntimeMXBean 获取 VM 参数,然后检查 -javaagent: 参数。

RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean();
List<String> args = RuntimemxBean.getInputArguments();
for (String arg : args) {
    if (arg.contains("-javaagent:")) {
        // block application from running
    }
}
于 2012-06-01T04:52:58.430 回答