Méthode DLL d'injection de thread distant Windows C++ (CreateRemoteThread), exemple de code.

        Utilisez la méthode de thread distant CreateRemoteThread pour injecter la DLL que vous souhaitez injecter dans d'autres processus. N'utilisez donc pas cette méthode pour causer des dommages.

        Créons un code DLL qui peut ouvrir une fenêtre, de sorte que le processus apparaisse aussi longtemps que LOAD DLL.

        Code 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;
}

        Le code de processus injecté dans la DLL peut être écrit librement, tant que le programme peut s'exécuter tout le temps. :

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

	}

}

        L'étape suivante consiste à exécuter le code injecté :

        Permettez-moi de parler d'abord des étapes de l'injection, qui sont un peu compliquées.

        1. Obtenez l'ID de processus du processus à injecter, qui peut être obtenu en utilisant le nom du processus.

        2. Utilisez l'API VirtualAllocEx pour ouvrir un morceau de mémoire dans le processus, la taille est exactement le chemin DLL.

        3. Écrivez les informations de chemin DLL dans l'espace de processus via WriteProcessMemory.

        4. Obtenez l'adresse de kernal32 dans ce processus. Parce que tous les exe sous la même plate-forme chargent kernal32 au même endroit.

        5. Obtenez l'adresse de LoadLibraryW dans kernal32, qui est également l'adresse de LoadLibraryW injectée dans le processus.

        6. Créez un thread distant pour exécuter l'opération LoadLibraryW, et le paramètre est le chemin de la DLL à transmettre.

Exemple de code :

#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;
}

        Résultats du :

 

        procxp vérifie que la dll est déjà dans le processus injecté.

        Encore une fois, cette phrase ne peut pas être utilisée pour causer des dommages. Il s'agit d'un moyen courant pour les logiciels piratés ou les plug-ins de jeux de créer certaines de vos propres choses dans d'autres processus. J'ai entendu dire que CreateRemoteThread avait été créé à l'origine par Microsoft pour déboguer d'autres processus, et qu'il était également utilisé par des personnes ayant des arrière-pensées.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44120785/article/details/131690046
conseillé
Classement