Método DLL de inyección de hilo remoto de Windows C++ (CreateRemoteThread), ejemplo de código.

        Use el método CreateRemoteThread de subproceso remoto para inyectar la DLL que desea inyectar en otros procesos, así que no use este método para causar daños.

        Vamos a crear un código DLL que pueda abrir una ventana, de modo que el proceso aparezca mientras LOAD DLL.

        Código DLL:

#include <windows.h>

// DLL入口点函数
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        // 弹窗代码
        MessageBox(NULL, L"Hello from YourDLL!", L"DLL Injection", MB_OK | MB_ICONINFORMATION);
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

        El código de proceso inyectado en la DLL se puede escribir libremente, siempre que el programa pueda ejecutarse todo el tiempo. :

#include<windows.h>
#include<iostream>
int main()
{
	while (1)
	{
		Sleep(1000 * 2);
		std::cout << "***\n" << std::endl;

	}

}

        El siguiente paso es ejecutar el código inyectado:

        Permítanme hablar primero sobre los pasos de la inyección, que es un poco complicado.

        1. Obtenga el ID de proceso del proceso que se va a inyectar, que se puede obtener utilizando el nombre del proceso.

        2. Use la API de VirtualAllocEx para abrir una parte de la memoria en el proceso, el tamaño es exactamente la ruta DLL.

        3. Escriba la información de la ruta de la DLL en el espacio del proceso a través de WriteProcessMemory.

        4. Obtenga la dirección de kernal32 en este proceso. Porque todos los exe bajo la misma plataforma cargan kernal32 en la misma ubicación.

        5. Obtenga la dirección de LoadLibraryW en kernal32, que también es la dirección de LoadLibraryW inyectada en el proceso.

        6. Cree un subproceso remoto para ejecutar la operación LoadLibraryW, y el parámetro es la ruta de la DLL que se pasará.

Ejemplo de código:

#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>

// 获取目标进程ID
DWORD GetTargetProcessID(const TCHAR* targetProcessName)
{
    DWORD processID = 0;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 processEntry;
        processEntry.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(hSnapshot, &processEntry))
        {
            do
            {
                if (_tcsicmp(processEntry.szExeFile, targetProcessName) == 0)
                {
                    processID = processEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnapshot, &processEntry));
        }
        CloseHandle(hSnapshot);
    }
    return processID;
}

// 远程线程注入DLL
BOOL InjectDll(DWORD processID, const TCHAR* dllPath)
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    if (hProcess == NULL)
    {
        return FALSE;
    }

    LPVOID dllPathAddress = VirtualAllocEx(hProcess, NULL, _tcslen(dllPath) * sizeof(TCHAR), MEM_COMMIT, PAGE_READWRITE);
    if (dllPathAddress == NULL)
    {
        CloseHandle(hProcess);
        return FALSE;
    }

    SIZE_T bytesWritten;
    if (!WriteProcessMemory(hProcess, dllPathAddress, dllPath, _tcslen(dllPath) * sizeof(TCHAR), &bytesWritten))
    {
        VirtualFreeEx(hProcess, dllPathAddress, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return FALSE;
    }

    HMODULE kernel32Module = GetModuleHandle(_T("kernel32.dll"));
    LPTHREAD_START_ROUTINE loadLibraryFunction = (LPTHREAD_START_ROUTINE)GetProcAddress(kernel32Module, "LoadLibraryW");
    HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, loadLibraryFunction, dllPathAddress, 0, NULL);
    if (hRemoteThread == NULL)
    {
        VirtualFreeEx(hProcess, dllPathAddress, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return FALSE;
    }

    WaitForSingleObject(hRemoteThread, INFINITE);
    VirtualFreeEx(hProcess, dllPathAddress, 0, MEM_RELEASE);
    CloseHandle(hRemoteThread);
    CloseHandle(hProcess);
    return TRUE;
}

int main()
{
    const TCHAR* targetProcessName = _T("runTest.exe"); // 目标进程的名称
    const TCHAR* dllPath = _T("C:\\Users\\admin\\source\\repos\\DLLinject\\x64\\Debug\\DLLinject.dll"); // 自定义DLL的路径

    DWORD targetProcessID = GetTargetProcessID(targetProcessName);
    if (targetProcessID != 0)
    {
        if (InjectDll(targetProcessID, dllPath))
        {
            printf("DLL injected successfully.\n");
        }
        else
        {
            printf("Failed to inject DLL.\n");
        }
    }
    else
    {
        printf("Target process not found.\n");
    }

    return 0;
}

        Resultados de la:

 

        procxp comprueba que la dll ya está en el proceso inyectado.

        Nuevamente, esa oración no puede usarse para causar daño. Esta es una forma común de software pirateado o complementos de juegos, para hacer algunas de sus propias cosas en otros procesos. Escuché que CreateRemoteThread fue creado originalmente por Microsoft para depurar otros procesos, y también fue utilizado por personas con motivos ocultos.

Supongo que te gusta

Origin blog.csdn.net/weixin_44120785/article/details/131690046
Recomendado
Clasificación