能力值:
( LV3,RANK:30 )
|
-
-
2 楼
先写下我目前尝试的进展,作抛砖引玉。
如果将test变量从函数局部变成Test类的static,就比较简单:
public class Test {
private static boolean test = true;
public static void main(String[] args) {
while (test) {
System.out.println("Hello World");
try { Thread.sleep(1000); } catch (Exception e) {}
}
System.out.println("Bye-bye");
}
}
我们直接使用 ps -ef | grep java 然后 gdb -p <pid>
基本原理是执行JNI的API,使用 JNI_GetCreatedJavaVMs 可以得到JVM的指针,再 AttachCurrentThread 可以得到env指针。通过env的 FindClass, GetStaticFieldID, SetStaticBooleanField 就可以将test的值从true变为false了。
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
被某原sun公司的jvm expert给解决了,使用Hotspot Serviceability Agent可以打印出具体的stack frame并有机会得到local variable的内存地址,然后gdb patch就可以了。
|
|
|