试图将dll注入已经运行的JVM中?

时间:2014-04-13 16:06:45

标签: java c++ winapi java-native-interface dll-injection

我在HKEY_CLASSES_ROOT *中创建了一个Windows注册表项,其值为:“C:\ test.exe”“%1”,以创建一个新的右键单击上下文菜单项,将所单击文件的文件路径传递给注册test.exe。在test.exe中加载了一个dll文件,该文件应注入已经运行的jvm以调用方法并传递文件路径。问题是.dll虽然在while循环(prototype)中运行,却找不到JVM实例。你能帮我解决一下这个问题吗?我如何访问JVM?感谢

的.java:

public class Main
{
    public static void main(String[] args)
    {   
        while(true)
        {

        }
    }

    public static void readAndOutputFilePath(String result)
    {       
        System.out.println("Java result: "+result); 
        try
        {
            System.in.read();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

的.dll:

HMODULE m_hDllInstance = LoadLibrary("jvm.dll");
if( m_hDllInstance == 0)
{
    printf("The jvm.dll could not be found");
    getchar();    
}
else
    printf("jvm.dll found");


JavaVM *jvm;   
JNIEnv *env;  

typedef jint (JNICALL * GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
GetCreatedJavaVMs jni_GetCreatedJavaVMs = (GetCreatedJavaVMs)GetProcAddress(m_hDllInstance, "JNI_GetCreatedJavaVMs");

jint size = 1;
jint vmCount;

jint ret= jni_GetCreatedJavaVMs(&jvm, size, &vmCount);

cout << endl << "GetCreated: " << vmCount << endl;
getchar();

jint rc = jvm->AttachCurrentThread((void **) & env, NULL);

jclass cls = env->FindClass("Main");
jmethodID mid = env->GetStaticMethodID(cls, "readAndOutputFilePath", "(Ljava/lang/String;)V");

jstring resultString = env->NewStringUTF(path);
env->CallStaticVoidMethod(cls, mid, resultString);
...

2 个答案:

答案 0 :(得分:1)

与独立,独立进程中运行的Java程序进行通信没有什么特别之处。可以使用Java支持的任何IPC工具。本地套接字是第一个想到的东西,但也是共享内存和普通的旧文件系统。

JNI可能无关紧要,因为您的Java程序是在一个单独的进程中 - 除非您想使用某些特定于Windows的通信模式,例如OLE。在这种情况下,您需要用另一种语言编写通信协议,并将它们加载到Java程序中。

答案 1 :(得分:0)

您似乎并不了解JVM究竟是什么。它本身就是一个加载到进程中的DLL。这不仅仅是“在那里”的“事物”。使用JNI调用API,您可以启动它,除非您这样做,否则您不会在自己刚刚开始的.exe中找到'the'JVM。