Java 使用sa jli禁用正在运行的JVM进程的类转储

Java 使用sa jli禁用正在运行的JVM进程的类转储,java,jvm,Java,Jvm,我试图通过设置-XX:+DisableAttachmentMechanism在运行的JVM中保护我的类 然而,我发现这个过程阻止了像jconsole这样的工具附加,但我仍然可以使用以下命令转储JVM中所有加载的类: java -Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=com.xxxx -classpath ".:./bin:$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.tools.jco

我试图通过设置-XX:+DisableAttachmentMechanism在运行的JVM中保护我的类

然而,我发现这个过程阻止了像jconsole这样的工具附加,但我仍然可以使用以下命令转储JVM中所有加载的类:

java -Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=com.xxxx -classpath ".:./bin:$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.tools.jcore.ClassDump 1234
有没有办法通过在运行的JVM中设置一些选项来停止这种行为?或者什么可以解决的


谢谢。

一般来说,这是不可能的

可服务性代理(sa jdi)不需要目标进程的合作。它只是使用syscall停止目标JVM,并在JVM不知道的情况下读取进程的内存

但是,您可以通过覆盖Serviceability Agent使用的变量来加大调试的难度。特别是,如果重置
gHotSpotVMStructs
全局变量,SA将无法重建内部VM结构,因此基于SA的工具将停止工作

为此,请编译以下
novmstructs.c
程序:

extern void *gHotSpotVMStructs;

int Agent_OnLoad(void *vm, char *options, void *reserved) {
    gHotSpotVMStructs = 0;
    return 0;
}
如何编译:

gcc -fPIC -nostdlib -shared -olibnostructs.so -O2 nostructs.c
然后将生成的库作为代理运行Java应用程序:

java -agentpath:/path/to/libnostructs.so ...
下次有人试图调用ClassDump或其他基于SA的实用程序时,将发生异常:

Attaching to process ID 574, please wait...
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
        at sun.tools.jstack.JStack.main(JStack.java:106)
Caused by: java.lang.RuntimeException: gHotSpotVMStructs was not initialized properly in the remote process; can not continue
        at sun.jvm.hotspot.HotSpotTypeDataBase.readVMStructs(HotSpotTypeDataBase.java:418)
        at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:91)
        at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:395)
        at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
        at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
        at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
        at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
        ... 6 more
正在附加到进程ID 574,请稍候。。。
线程“main”java.lang.reflect.InvocationTargetException中出现异常
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于sun.tools.jstack.jstack.runJStackTool(jstack.java:140)
位于sun.tools.jstack.jstack.main(jstack.java:106)
原因:java.lang.RuntimeException:gHotSpotVMStructs在远程进程中未正确初始化;不能继续
位于sun.jvm.HotSpotTypeDataBase.readVMStructs(hostpottypedatabase.java:418)
在sun.jvm.HotSpotTypeDataBase.hostpottypedatabase.java:91
位于sun.jvm.hotspot.hostpotagent.setupVM(hostpotagent.java:395)
位于sun.jvm.hotspot.hostpotagent.go(hostpotagent.java:305)
位于sun.jvm.hotspot.hostpotagent.attach(hostpotagent.java:140)
位于sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
位于sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
位于sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
... 还有6个

一般来说,这是不可能的

可服务性代理(sa jdi)不需要目标进程的合作。它只是使用syscall停止目标JVM,并在JVM不知道的情况下读取进程的内存

但是,您可以通过覆盖Serviceability Agent使用的变量来加大调试的难度。特别是,如果重置
gHotSpotVMStructs
全局变量,SA将无法重建内部VM结构,因此基于SA的工具将停止工作

为此,请编译以下
novmstructs.c
程序:

extern void *gHotSpotVMStructs;

int Agent_OnLoad(void *vm, char *options, void *reserved) {
    gHotSpotVMStructs = 0;
    return 0;
}
如何编译:

gcc -fPIC -nostdlib -shared -olibnostructs.so -O2 nostructs.c
然后将生成的库作为代理运行Java应用程序:

java -agentpath:/path/to/libnostructs.so ...
下次有人试图调用ClassDump或其他基于SA的实用程序时,将发生异常:

Attaching to process ID 574, please wait...
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
        at sun.tools.jstack.JStack.main(JStack.java:106)
Caused by: java.lang.RuntimeException: gHotSpotVMStructs was not initialized properly in the remote process; can not continue
        at sun.jvm.hotspot.HotSpotTypeDataBase.readVMStructs(HotSpotTypeDataBase.java:418)
        at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:91)
        at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:395)
        at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
        at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
        at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
        at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
        ... 6 more
正在附加到进程ID 574,请稍候。。。
线程“main”java.lang.reflect.InvocationTargetException中出现异常
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于sun.tools.jstack.jstack.runJStackTool(jstack.java:140)
位于sun.tools.jstack.jstack.main(jstack.java:106)
原因:java.lang.RuntimeException:gHotSpotVMStructs在远程进程中未正确初始化;不能继续
位于sun.jvm.HotSpotTypeDataBase.readVMStructs(hostpottypedatabase.java:418)
在sun.jvm.HotSpotTypeDataBase.hostpottypedatabase.java:91
位于sun.jvm.hotspot.hostpotagent.setupVM(hostpotagent.java:395)
位于sun.jvm.hotspot.hostpotagent.go(hostpotagent.java:305)
位于sun.jvm.hotspot.hostpotagent.attach(hostpotagent.java:140)
位于sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
位于sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
位于sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
... 还有6个

您有充分的理由需要这个吗?如果是这样的话,那是什么呢?我只是不希望在将类分发和部署到客户机服务器时以任何方式读取它们。我已经有了一个工具来加密类,并在加载到jvm时解密它们。我不希望他们被抛弃,这是不可能做到的。告诉你的客户,如果他们放弃课程,你会起诉他们,这样更有效,也更便宜。谢谢,行吗?你有理由需要这个吗?如果是这样的话,那是什么呢?我只是不希望在将类分发和部署到客户机服务器时以任何方式读取它们。我已经有了一个工具来加密类,并在加载到jvm时解密它们。我不希望他们被抛弃,这是不可能做到的。告诉你的客户,如果他们转储这些类,你会起诉他们,这样更有效,也更便宜。谢谢,会这样做的谢谢你的明确回答,我向客户解释说,这超出了我们的范围,我们干脆放弃……你可以在Linux上禁用
ptrace
,谢谢你的明确回答,我向客户解释过,这超出了我们的范围,我们干脆放弃……你可以在linux上禁用
ptrace