Внедрение DLL с JNI, приводящим к сбою существующей JVM - PullRequest
0 голосов
/ 09 апреля 2020

, когда я пытаюсь внедрить DLL с кодом JNI, мой существующий сбой JVM (minecraft). Я получил эту ошибку при попытке использовать функцию JNI. Когда я удалил этот вызов, JVM не обрабатывает код sh.

Cra sh (из прилагаемого отладчика Visual Studio):

Unhandled exception at 0x00000000352B10CB in javaw.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

Мой код DLL:

#include "pch.h"
#include "jni.h"
#include <iostream>

JavaVM* jvm;
JNIEnv* env;
HANDLE jvmHandle;
FARPROC func_JNI_GetCreatedJavaVMs;
JavaVMInitArgs vm_args;

void init() {
    AllocConsole();
    freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);
    std::cout << "This works" << std::endl;

    typedef jint(JNICALL* GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
    GetCreatedJavaVMs jni_GetCreatedJavaVMs;
    jni_GetCreatedJavaVMs = (GetCreatedJavaVMs)GetProcAddress(GetModuleHandle(
        TEXT("jvm.dll")), "JNI_GetCreatedJavaVMs");

    std::cout << "CreatedJavaVMs: "<<jni_GetCreatedJavaVMs << std::endl;

    std::cout << "JVM load succeeded: Version ";
    jint ver = env->GetVersion(); //Removing this removes crashes too.
    std::cout << ((ver >> 16) & 0x0f) << "." << (ver & 0x0f) << std::endl;




    //if (getEnvStat == JNI_EDETACHED)
    //{
    //     vm->AttachCurrentThread((void**)&env, NULL);
    // }

    /*if (env != nullptr)
    {
        //start
    }


    if (env->ExceptionCheck())
    {
        env->ExceptionDescribe();
    }

    vm->DetachCurrentThread();*/

}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    init();
    return TRUE;
}

1 Ответ

1 голос
/ 09 апреля 2020

Вы нигде не инициализируете env. Вы получаете указатель на JNI_GetCreatedJavaVMs, но никогда не вызываете его. От этого до работающего JNIEnv есть несколько шагов ...

...