Java 附加到已经运行的JVM
有没有办法连接到已经运行的JVM 例如,在JNI中,您可以使用Java 附加到已经运行的JVM,java,c++,jvm,java-native-interface,Java,C++,Jvm,Java Native Interface,有没有办法连接到已经运行的JVM 例如,在JNI中,您可以使用JNI\u CreateJavaVM创建VM,运行jar并检查其所有类 但是,如果jar已经在运行,我就找不到方法连接到它的JVM并与它的类通信,或者获取它的env指针 另一个问题是,如果jar加载了我的本机库(.dll),并且我想在.dll中创建一个JVM,那么我就不能。。如果jar不调用我的函数,我也不能附加jar的当前JVM Java方面的示例: class Foo { static {loadLibrary("Foo"
JNI\u CreateJavaVM
创建VM,运行jar并检查其所有类
但是,如果jar已经在运行,我就找不到方法连接到它的JVM并与它的类通信,或者获取它的env
指针
另一个问题是,如果jar加载了我的本机库(.dll),并且我想在.dll中创建一个JVM,那么我就不能。。如果jar不调用我的函数,我也不能附加jar的当前JVM
Java方面的示例:
class Foo
{
static {loadLibrary("Foo")}
}
在C++方面:
void Foo()
{
//CreateJVM
//Attach to the current process..
//Call function from the jar that loaded me.
}
如果jar没有首先调用Foo
,这是无法完成的
有什么想法吗?没有办法获取当前JVM或附加到当前JVM或外部JVM实例吗?没有办法。JNI只允许两种型号:
- 非Java程序创建JVM
- Java程序调用本机方法
java.exe
,或javaw.exe
,或iexplore.exe
)。常用的注射技术是使用2)在DLL中,使用
GetModuleHandle
3)使用GetProcAddress
4)调用函数,如果成功,使用JavaVM
结构中的AttachCurrentThread
函数指针将线程附加到找到的第一个JVM
5)完成
有用链接:这是针对windows、linux还是其他操作系统的?您使用的是哪个C调试器/IDE?我可能缺少smth,但您不能打开调试端口并连接到它吗?在调试器中,点击pause VM并期待一切?我正在使用代码块,我在Windows上。我不知道你打开调试器并点击暂停是什么意思。@CantChooseUsernames如果你使用了我的答案,请告诉我。您可以在运行的java进程中注入动态链接库,并连接到JVM。看看我的答案。在窗户上很好用。是的!这是有效的:D我没有使用
SetWindowsHook
。相反,我只是使用CreateThread
和LoadLibrary
组合进行注入。尽管如此,它还是有效的我很高兴@CantChooseServerNames快乐编码!(注意JNI内存泄漏:-)@CantChooseServerNames侧注:使用SetWindowsHookEx
,您可以选择连接到“GUI”线程。这可能很重要。