[Source] - Создание лоадера для чита на C++ | ФОРУМ СОЦИАЛЬНОЙ ИНЖЕНЕРИИ ⭐️MeHack⭐️ - Читы, базы, раздачи аккаунтов, сливы скриптов, способы заработка

[Source] Создание лоадера для чита на C++

Тема в разделе "C/C++", создана пользователем MeeFix, 25.01.22.Просмотров: 543

  1. MeeFix Реклама и Сотрудничество

    MeeFix

    Администратор

    117 сообщения
    132 симпатий
    1
    розыгрышей
    8 лет с нами
    29 дней с нами
    Не нашел ни одного гайда как создать лоадер для чита, поэтому решил сделать
    В этом гайде будем делать консольный лоадер с авторизацией по логину и паролю через сайт (привязку по HWID придется делать самим по аналогии)

    Что понадобится:
    1. Visual Studio с установленными в нее компонентами C++ (у меня 2019)
    2. Мозг (хватит половины)
    Установим XorPreProcess: Скрытый контент. Для просмотра Вы должны быть зарегистрированным участником (не реклама)
    Если не желаете регистрироваться на сайте: Скрытый контент. Для просмотра Вы должны быть зарегистрированным участником

    Установка:
    1. Средства - Внешние инструменты
    2. Добавить
    3. В название пишем XorPreProcess, команда - путь до файла из архива, аргументы - $(ProjectDir) $(ProjectFileName)
    4. Ставим галочку "Использовать окно вывода"
    Должно быть так:
    В директорию с проектом VS кидаем файл XorStr.hpp и подключаем его к проекту

    Далее открываем свойства решения и ставим набор символов "Многобайтовая кодировка" -
    Создаем Main.cpp:

    Код:
    /*
                supported by murkware.xyz
    */
    #define _CRT_SECURE_NO_WARNINGS
    #include <Windows.h> // WinAPI
    #include <Psapi.h>
    #include <TlHelp32.h>
    #include <urlmon.h> // работа с сетью
    #include <WinInet.h> // работа с сетью
    
    #include <iostream>
    #include <string>
    #include <ctime>
    #include <cmath>
    #include <comdef.h>
    #include <fstream>
    using namespace std;
    
    #include "XorStr.hpp" // шифровка строк
    
    #pragma comment(lib, "urlmon.lib") // работа с сетью
    #pragma comment(lib, "wininet.lib") // работа с сетью
    #pragma comment(lib, "psapi.lib") // работа с сетью
    
    void EncryptString(string& str, string key); // шифровку строк по ключу пишем сами :)
    
    const char* alphabet = "qwertyuiopasdfghjklzxcvbnm0123456789";
    Здесь мы подключили все необходимые заголовки и обозначили переменную алфавита

    Функции для инжектора (используется LoadLibraryA и вместо CreateRemoteThread используется NtCreateThreadEx):

    Код:
    typedef NTSTATUS(__stdcall* f_NtCreateThreadEx)(HANDLE* pHandle, ACCESS_MASK DesiredAccess, void* pAttr, HANDLE hProc, void* pFunc, void* pArg,
        ULONG Flags, SIZE_T ZeroBits, SIZE_T StackSize, SIZE_T MaxStackSize, void* pAttrListOut);
    
    HANDLE StartRoutine(HANDLE hTargetProc, void* pRoutine, void* pArg)
    {
        auto _NtCTE = reinterpret_cast<f_NtCreateThreadEx>(GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtCreateThreadEx"));
        if (!_NtCTE)
            return CreateRemoteThreadEx(hTargetProc, nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(pRoutine), pArg, 0, nullptr, nullptr);
    
        HANDLE hRet = nullptr;
        _NtCTE(&hRet, THREAD_ALL_ACCESS, nullptr, hTargetProc, pRoutine, pArg, 0, 0, 0, 0, nullptr);
        return hRet;
    }
    
    int Inject(const char* szDllFile, HANDLE hProc)
    {
        if (!hProc)
            return 1;
    
        ifstream dll(szDllFile);
        if (!dll.is_open())
            return 1;
    
        auto Len = lstrlenA(szDllFile);
    
        void* pArg = VirtualAllocEx(hProc, nullptr, Len, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
        if (!pArg)
            return 1;
    
        if (!WriteProcessMemory(hProc, pArg, szDllFile, Len, nullptr))
        {
            VirtualFreeEx(hProc, pArg, 0, MEM_RELEASE);
            return 1;
        }
    
        DWORD dwExitCode = 0;
        HANDLE hThread = StartRoutine(hProc, LoadLibraryA, pArg);
        if (!hThread)
        {
            VirtualFreeEx(hProc, pArg, 0, MEM_RELEASE);
            return 1;
        }
    
        WaitForSingleObject(hThread, INFINITE);
        GetExitCodeThread(hThread, &dwExitCode);
        CloseHandle(hThread);
    
        VirtualFreeEx(hProc, pArg, 0, MEM_RELEASE);
    
        if (!dwExitCode)
            return 1;
    
        return 0;
    }
    
    Метод инжекта можете заменить, но этот пока в CS:GO андетект (хз я в неё не играл 2 года...)

    Функция main:

    Код:
    int main()
    {
        setlocale(LC_ALL, "rus"); // ставим русскую локализацию
        srand(time(0)); // обнуляем рандомную генерацию
        SetConsoleTitle("skeet loader");
    
        string login;
        string pass;
        string key = "          ";
    
        for (int i = 0; i < 10; i++) // генерируем ключ дешифровки
        {
            key[i] = alphabet[abs(int(rand()) % 36)];
        }
    
        cout << "Введите логин: ";
        cin >> login;
        EncryptString(login, key); // шифруем логин
        cout << "Введите пароль: ";
        cin >> pass;
        EncryptString(pass, key); // шифруем пароль
    
        // на стороне сервера данные должны быть расшифрованы по ключу и сравнены с данными БД
    
        string query = "gamesense.pub/check.php?login=" + login + "&pass=" + pass + "&key=" + key; // адрес нашего запроса
    
        HINTERNET hInternet = InternetOpen("Agent Name", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); // инициализируем подключение
        if (!hInternet) { cout << "Ошибка инициализации подключения\n"; system("pause > nul"); InternetCloseHandle(hInternet); return 0; }
    
        HINTERNET hUrl = InternetOpenUrl(hInternet, query.c_str(), 0, 0, 0, 0); // делаем запрос
        if(!hUrl) { cout << "Ошибка подключения\n"; system("pause > nul"); InternetCloseHandle(hInternet); InternetCloseHandle(hUrl); return 0; }
    
        char buf[1];
        BOOL result = InternetReadFile(hUrl, LPSTR(buf), 1, 0); // читаем ответ
    
        if(!result) { cout << "Ошибка получения результата\n"; system("pause > nul"); InternetCloseHandle(hInternet); InternetCloseHandle(hUrl); return 0; }
    
        // сравниваем результат
        // для положительного ответа должно вывести 1
        if (strcmp((const char*)buf[0], "1")) { cout << "Неверный логин или пароль\n"; system("pause > nul"); InternetCloseHandle(hInternet); InternetCloseHandle(hUrl); return 0; }
    
        string EndFile = getenv("APPDATA");
        for (int i = 0; i < 12; i++)
        {
            EndFile += alphabet[abs(int(rand()) % 36)];
        }
        EndFile += ".dll";
    
        cout << "Загрузка Dll\n";
    
        DeleteUrlCacheEntry("gamesense.pub/skeet.dll"); // очищаем кэш
        // скачиваем dll
        if(URLDownloadToFile(0, "gamesense.pub/skeet.dll", EndFile.c_str(), 0, 0) != S_OK) { cout << "Ошибка загрузки Dll\n"; system("pause > nul"); InternetCloseHandle(hInternet); InternetCloseHandle(hUrl); return 0; }
    
        cout << "Инжект\n";
    
        HANDLE hProc = GetProcessByName("csgo.exe");
        if(!hProc || hProc == 0) { cout << "CS:GO не запущена\n"; system("pause > nul"); InternetCloseHandle(hInternet); InternetCloseHandle(hUrl); return 0; }
    
        if (Inject(EndFile.c_str(), hProc)) { cout << "Ошибка инжекта\n"; system("pause > nul"); InternetCloseHandle(hInternet); InternetCloseHandle(hUrl); return 0; }
    
        InternetCloseHandle(hInternet);
        InternetCloseHandle(hUrl);
    
        cout << "Чит запущен, можете играть\n";
        Sleep(60000);
    
        return 0;
    }
    В конце вам нужно зашифровать строки:
    1. Оборачиваем каждую строку (все что в кавычках), которую считаете нужной зашифровать, в _xor_
    2. Сохраняем файл
    3. Средства - XorPreProcess
    4. Если где-то подчеркивает красным, то после новой зашифрованной строки добавляем .c_str()

    p.s. EncryptString - эту функцию вам нужно сделать самим, чтобы шифровка происходила по ключу и сервер при помощи этого ключа мог расшифровать данные.