Добро пожаловать на BlackSAMP - ФОРУМ

  • Приватные и секретные разделы доступны только зарегистрированным пользователям.

    Вся важная информация в нашем ТГ: t.me/gtablack

    На данном форуме запрещено публиковать контент нарушающий Российское законодательство, за это последует блокировка ФА.

Гайд Пишем .DLL инжектор на C++

Количество просмотров: 128
Уровень сложности
Сложно

DarkPhantom

C++/Lua developer
Администратор
Регистрация
18 Авг 2024
Сообщения
151
Решения
4
Реакции
29
Баллы
28
DLL-инъекция — это метод внедрения динамической библиотеки (DLL) в адресное пространство другого процесса, позволяющий выполнять произвольный код внутри него.

Существует несколько способов DLL-инъекции:
- LoadLibrary - самый простой метод, использующий стандартную функцию Windows для загрузки DLL в целевой процесс.
- Manual Mapping - позволяет загружать DLL без использования стандартных API Windows, что затрудняет обнаружение.
- Reflective DLL Injection - загружает DLL непосредственно из памяти, без сохранения файла на диск, что делает метод более скрытным .
- DLL Hijacking - подмена легитимной DLL на вредоносную, чтобы процесс загрузил её вместо оригинала.
- DLL Proxying - создание промежуточной DLL, которая перехватывает вызовы оригинальной библиотеки.
Мы реализуем самый простой метод - LoadLibrary.
Будем писать на C++ используя библиотеку Windows.h .
Алгоритм следующий:
1. Указываем путь к DLL - задаём строку с полным путём к файлу.
2. Открываем целевой процесс - получаем его дескриптор через OpenProcess.
3. Выделяем память - создаём область внутри процесса для хранения пути к DLL.
4. Записываем путь - переносим строку в выделенную память через WriteProcessMemory.
5. Получаем адрес LoadLibraryA - определяем его через GetProcAddress.
6. Создаём удалённый поток - запускаем LoadLibraryA, передавая ему путь к DLL.
7. Ожидаем завершения - ждём завершения потока с помощью WaitForSingleObject.
8. Закрываем дескрипторы - освобождаем память, закрываем поток и процесс.
Готово!
Вот так будет выглядеть код:
C++:
#include <windows.h>
#include <iostream>

int main() {
    // ID процесса, в который будем внедрять DLL
    DWORD processID = 1234; // Замените на реальный PID

    const char* dllPath = "C:\\Users\\User\\huy\\hecker.dll";

    // Открываем процесс
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    if (!hProcess) {
        std::cerr << "Не удалось открыть процесс\n";
        return -1;
    }

    // Выделяем память в процессе
    LPVOID remoteMem = VirtualAllocEx(hProcess, NULL, strlen(dllPath) + 1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    if (!remoteMem) {
        std::cerr << "Не удалось выделить память\n";
        CloseHandle(hProcess);
        return -1;
    }

    // Записываем путь к dll в выделенную память
    WriteProcessMemory(hProcess, remoteMem, dllPath, strlen(dllPath) + 1, NULL);

    // Получаем адрес LoadLibraryA
    LPVOID loadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");

    // Создаем удаленный поток, который загрузит DLL
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibAddr, remoteMem, 0, NULL);
    if (!hThread) {
        std::cerr << "Не удалось создать поток\n";
        VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return -1;
    }

    // Ожидаем завершения потока
    WaitForSingleObject(hThread, INFINITE);

    // Закрываем дескрипторы
    CloseHandle(hThread);
    CloseHandle(hProcess);

    std::cout << "DLL успешно внедрена!\n";
    return 0;
}
Все элементарно , но важно помнить , что любой клиентский античит будет детектить этот лоэдер .
 

DarkPhantom

C++/Lua developer
Администратор
Регистрация
18 Авг 2024
Сообщения
151
Решения
4
Реакции
29
Баллы
28
DLL-инъекция — это метод внедрения динамической библиотеки (DLL) в адресное пространство другого процесса, позволяющий выполнять произвольный код внутри него.

Существует несколько способов DLL-инъекции:
- LoadLibrary - самый простой метод, использующий стандартную функцию Windows для загрузки DLL в целевой процесс.
- Manual Mapping - позволяет загружать DLL без использования стандартных API Windows, что затрудняет обнаружение.
- Reflective DLL Injection - загружает DLL непосредственно из памяти, без сохранения файла на диск, что делает метод более скрытным .
- DLL Hijacking - подмена легитимной DLL на вредоносную, чтобы процесс загрузил её вместо оригинала.
- DLL Proxying - создание промежуточной DLL, которая перехватывает вызовы оригинальной библиотеки.
Мы реализуем самый простой метод - LoadLibrary.
Будем писать на C++ используя библиотеку Windows.h .
Алгоритм следующий:
1. Указываем путь к DLL - задаём строку с полным путём к файлу.
2. Открываем целевой процесс - получаем его дескриптор через OpenProcess.
3. Выделяем память - создаём область внутри процесса для хранения пути к DLL.
4. Записываем путь - переносим строку в выделенную память через WriteProcessMemory.
5. Получаем адрес LoadLibraryA - определяем его через GetProcAddress.
6. Создаём удалённый поток - запускаем LoadLibraryA, передавая ему путь к DLL.
7. Ожидаем завершения - ждём завершения потока с помощью WaitForSingleObject.
8. Закрываем дескрипторы - освобождаем память, закрываем поток и процесс.
Готово!
Вот так будет выглядеть код:
C++:
#include <windows.h>
#include <iostream>

int main() {
    // ID процесса, в который будем внедрять DLL
    DWORD processID = 1234; // Замените на реальный PID

    const char* dllPath = "C:\\Users\\User\\huy\\hecker.dll";

    // Открываем процесс
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    if (!hProcess) {
        std::cerr << "Не удалось открыть процесс\n";
        return -1;
    }

    // Выделяем память в процессе
    LPVOID remoteMem = VirtualAllocEx(hProcess, NULL, strlen(dllPath) + 1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    if (!remoteMem) {
        std::cerr << "Не удалось выделить память\n";
        CloseHandle(hProcess);
        return -1;
    }

    // Записываем путь к dll в выделенную память
    WriteProcessMemory(hProcess, remoteMem, dllPath, strlen(dllPath) + 1, NULL);

    // Получаем адрес LoadLibraryA
    LPVOID loadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");

    // Создаем удаленный поток, который загрузит DLL
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibAddr, remoteMem, 0, NULL);
    if (!hThread) {
        std::cerr << "Не удалось создать поток\n";
        VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return -1;
    }

    // Ожидаем завершения потока
    WaitForSingleObject(hThread, INFINITE);

    // Закрываем дескрипторы
    CloseHandle(hThread);
    CloseHandle(hProcess);

    std::cout << "DLL успешно внедрена!\n";
    return 0;
}
Все элементарно , но важно помнить , что любой клиентский античит будет детектить этот лоэдер .
PID - Process ID
 

DarkPhantom

C++/Lua developer
Администратор
Регистрация
18 Авг 2024
Сообщения
151
Решения
4
Реакции
29
Баллы
28
Автоматическое получение PID процесса по его имени
C++:
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>

DWORD GetProcessIdByName(const char* processName) {
    DWORD pid = 0;
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (snapshot != INVALID_HANDLE_VALUE) {
        PROCESSENTRY32 pe;
        pe.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(snapshot, &pe)) {
            do {
                if (strcmp(pe.szExeFile, processName) == 0) {
                    pid = pe.th32ProcessID;
                    break;
                }
            } while (Process32Next(snapshot, &pe));
        }
        CloseHandle(snapshot);
    }
    return pid;
}

int main() {
    const char* targetProcess = "gta_sa.exe";
    DWORD pid = GetProcessIdByName(targetProcess);
    if (pid) {
        std::cout << "PID процесса " << targetProcess << ": " << pid << std::endl;
    } else {
        std::cout << "Процесс не найден." << std::endl;
    }
    return 0;
}
 
Сверху Снизу