java - 禁用仪器库

标签 java instrumentation

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

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

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

但是,上述方法对我来说似乎有些老套,但我一直无法找到直接阻止 -javaagent 参数的方法,也找不到检测检测代理库的简单方法。这些更清洁的替代品是否可行?

最佳答案

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"));

关于java - 禁用仪器库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10713268/

相关文章:

java - Maven 代码覆盖率

java - 变量声明中的括号

java - 数组内的自定义类的对象在序列化后会保留其数据吗?

java - JMenu JMenuCheckboxItem 设置为当前状态

LLVM、-fprofile-instr-generate、对“__llvm_profile_register_function”的 undefined reference

java - 如何检测java方法?

c# - 为 JVM 实现 C#

java - 使用索引与列名提取数据的结果集性能比较

c++ - 使用二进制检测 Hook 函数

java - 如何使用 ByteBuddy 对接口(interface)默认方法进行 rebase ?