使用sa-jli将ClassDump禁用到正在运行的JVM进程

问题描述 投票:1回答:1

我试图通过设置-XX:+ DisableAttachMechanism来保护正在运行的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中设置一些选项来阻止此行为?或者任何可以解决的问题?

谢谢。

java jvm
1个回答
3
投票

一般来说,这是不可能的。

可维护性代理(sa-jdi)不需要来自目标进程的协作。它只是使用ptrace系统调用来停止目标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
© www.soinside.com 2019 - 2024. All rights reserved.