将JNI Dll注入到运行的JVM中,为什么程序会崩溃?

时间:2017-08-06 14:18:42

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

所以我正在为一个游戏(Minecraft)制作一个C ++ Dll作弊/黑客。我创建了一个小样本JNI项目,只是为了测试一下,但是在注入dll后几秒钟,Minecraft停止响应一个' win32未处理的异常'。我没有足够的C ++经验或使用JNI来理解我做错了什么......

这是我的示例代码(实际上并不是黑客,只是想尝试调用clickMouse函数来查看我是否在正确的轨道上):

DWORD WINAPI Main_Thread(LPVOID lpParam)
{
HMODULE m_hDllInstance = LoadLibraryA("jvm.dll");
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);
jint rc = jvm->AttachCurrentThread((void **)& env, NULL);


jclass Minecraft = env->FindClass("net.minecraft.client.Minecraft");
jmethodID constructor = env->GetMethodID(Minecraft, "<init>", "()V");

jobject mc = env->NewObject(Minecraft, constructor);
jmethodID clickMouse = env->GetMethodID(Minecraft, "clickMouse", "()V");


while (!GetAsyncKeyState(VK_END))
{
    env->CallVoidMethod(mc, clickMouse);
}

jvm->DestroyJavaVM();
return S_OK;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID 
lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
    CreateThread(0, 0, Main_Thread, 0, 0, NULL);
}

return TRUE;
}

造成这种情况的原因是什么?我该如何解决?

P.S:对不起,如果代码看起来有点搞笑,在这里粘贴它有点麻烦。

编辑:我尝试在崩溃时运行调试器,它出现了这个:http://imgur.com/a/Uot9K。我还不确定如何解决这个问题......

0 个答案:

没有答案