Статья Как написать Инжектор с нуля [C++]

  • LauX
  • Заблокирован
  • 676
  • 12
  • 233
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.


Как написать Инжектор с нуля на C++​

В данной статье я вам расскажу и покажу как работает инжектор dll и как написать инжектор с нуля с методом LoadLibrary, я вам расскажу о каждом методе и последовательно как и что происходит, для новичков будет особенно полезная статья потому-что в интернете мало где можно найти написание инжектора с нуля на языке C++ давайте начнем

Что такое Инжектор? - это метод используемый для запуска кода в адресном пространстве другого процесса, заставляя его загружать библиотеку динамической компоновки
Соответственно для инжектора нам нужна динамическая библиотека которая будет выполнять код в адресном пространстве который мы освободим и создадим поток!

Давайте начнем писать сам инжектор, а с динамической библиотекой вы уже сами разберетесь или можете найти на форуме

Для начало нам нужно подключить несколько инклудов
#include <Windows.h>
#include <TlHelp32.h>


Нам нужна будет функция с помощью которой мы будем получать PID процесса, при открытий программ он генерируется всегда рандомно
Поэтому нам нужно получить его что бы на основе его открыть ручку процесса и предоставить нам полный доступ к процессу в User Mode

C++:
DWORD GetProcessID(const char* processName)
    {
        if (!processName)
            return 0;

        DWORD id = 0;
        HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

        if (hSnap)
        {
            PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
            if (Process32First(hSnap, &pe32))
            {
                while (Process32Next(hSnap, &pe32))
                {
                    if (strcmp(processName, pe32.szExeFile) == 0)
                    {
                        id = pe32.th32ProcessID;
                        break;
                    }
                }
            }
        }CloseHandle(hSnap);
        return id;
    }

Теперь давайте в нашем main() найдем процесс нужной нам игры куда будем внедрять, откроем дескриптор процесса (получаем полный доступ) и освободим память и создадим наш поток адресного пространства
C++:
int main() {
  
    DWORD gameProcess = 0; // Создаем переменную под наш GetProcessID метод
    const char* DllPath = "name.dll"; // Наша DLL которую инжектим, в данном случае он найдет рядом с инжектором (только)
  
    gameProcess = GetProcessID("csgo.exe");
    if (!gameProcess) { // Если наш процесс не был найден
        printf("Process csgo was not found");
    }
  
    // Если процесс найден открываем ручку
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, gameProcess);
    if (hProcess == INVALID_HANDLE_VALUE) {
        // Если нашу ручку не удалось открыть
        printf("Handle Error");
    }
  
    void* allocated = VirtualAllocEx(hProcess, 0, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); // Освобождаем память под нашу DLL
            if (!WriteProcessMemory(hProcess, allocated, DllPath, strlen(DllPath) + '\0', 0)) // Записываем нашу DLL и проверяем что если неудалось записать
            {
                CloseHandle(hProcess);
                return false;
            }
            void* hThread = CreateRemoteThread(hProcess, 0, 0, (PTHREAD_START_ROUTINE)LoadLibraryA, allocated, 0, 0); // Создаем поток адресса которого мы освободили это наша DLL
            if (hThread != 0) // закрываем Handle
                CloseHandle(hThread);
  
            CloseHandle(hProcess); // Закрываем Handle Process
  
            printf("Inject Successfulled"); // Инжект произошел успешно
            return 0; // Возвращаем 0
}
 
Последнее редактирование:
Сверху Снизу