簡體   English   中英

C ++-將代碼注入到正在運行的進程中(使用DLL)

[英]C++ - Injecting code into running process (using DLL)

我正在嘗試使用Dll注入更改正在運行的Java進程中的int值。

我的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,所以我沒有將代碼發布到它。

當我運行以下代碼時,什么都沒有發生。 我究竟做錯了什么?

謝謝

由於prefix是靜態變量,因此您需要使用適當的函數:

env->SetStaticIntField(cls, field, integer);

並且在DllMain()的開始處,您可能還想添加這樣的內容,因此所有操作都不能只完成一次:

if( Reason!=DLL_PROCESS_ATTACH ) return TRUE;

最后,進行適當的清理:

jvm->DetachCurrentThread();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM