0
Dll注入を使用して実行中のJavaプロセスでintの値を変更しようとしています。C++ - 実行中のプロセスにコードを注入する(DLLを使用)
私のDLL:
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <jni.h>
using namespace std;
BOOL APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
HMODULE m_hDllInstance = LoadLibrary("jvm.dll");
if(m_hDllInstance == 0)
{
cout << "The jvm.dll could not be found" << endl;
getchar();
}
else
cout << "jvm.dll found" << endl;
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("com/InjectMe");
jfieldID field = env->GetStaticFieldID(cls, "prefix", "I");
jint integer = 1;
env->SetIntField(cls, field, integer);
return TRUE;
}
Javaクラス:
package com;
public class InjectMe
{
static int prefix = 0;
public static void main(String[] args)
{
java.util.Scanner sc = new java.util.Scanner(System.in);
while(true)
{
String s = sc.nextLine();
System.out.println(prefix + ": " + s);
if(prefix == 1)
break;
}
sc.close();
}
}
私は、DLLのインジェクタにGetLastError()
を呼び出すと、私は0を取得するので、私はそれにコードを投稿していません。
次のコードを実行すると、何も起こりません。私は間違って何をしていますか?
env->SetStaticIntField(cls, field, integer);
そしてDllMain()
の開始時に、あなたがそう、同様にこのような何かを追加したい場合があります:
はprefix
は静的変数なので、あなたが適切な機能を使用する必要があなたに