禁用检测库

时间:2012-05-23 04:02:12

标签: java instrumentation

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

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

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

然而,上面的方法对我来说似乎有些苛刻,但是我找不到直接阻止-javaagent参数的方法,也没有找到检测检测代理库(ies)的简单方法。这些更清洁的替代品是否可能?

2 个答案:

答案 0 :(得分: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"));

答案 1 :(得分: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
    }
}