有没有办法附加到已经运行的 JVM?
例如,在 JNI 中您可以使用JNI_CreateJavaVM
创建一个虚拟机并运行一个 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
first.
有任何想法吗?是否没有办法获取当前 JVM 或附加到它或外部 JVM 实例?
是的你可以。
1)在托管 JVM 的进程中注入 DLL(例如,java.exe
, or javaw.exe
, or iexplore.exe
)。常见的注射技术是使用设置WindowsHookEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990.aspx
2)在DLL中,获取模块句柄jvm.dll
using GetModuleHandle
3)获取地址JNI_GetCreatedJavaVMs
函数,使用GetProcAddress
4)调用该函数,如果成功,则使用以下命令将线程附加到找到的第一个 JVMAttachCurrentThread
函数指针来自JavaVM
结构。
5) Done.
有用的链接:调用API http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)