2017-04-22 3 views
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は静的変数なので、あなたが適切な機能を使用する必要があなたに

答えて

0

ありがとうございましたそのすべてが複数回行われていません。

if(Reason!=DLL_PROCESS_ATTACH) return TRUE; 

そして最後に、適切なクリーンアップのために:

jvm->DetachCurrentThread(); 
関連する問題