Не нашел ни одного гайда как создать лоадер для чита, поэтому решил сделать В этом гайде будем делать консольный лоадер с авторизацией по логину и паролю через сайт (привязку по HWID придется делать самим по аналогии) Что понадобится: Visual Studio с установленными в нее компонентами C++ (у меня 2019) Мозг (хватит половины) Установим XorPreProcess: Скрытый контент. Для просмотра Вы должны быть зарегистрированным участником (не реклама) Если не желаете регистрироваться на сайте: Скрытый контент. Для просмотра Вы должны быть зарегистрированным участником Установка: Средства - Внешние инструменты Добавить В название пишем XorPreProcess, команда - путь до файла из архива, аргументы - $(ProjectDir) $(ProjectFileName) Ставим галочку "Использовать окно вывода" Должно быть так: В директорию с проектом 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; } В конце вам нужно зашифровать строки: Оборачиваем каждую строку (все что в кавычках), которую считаете нужной зашифровать, в _xor_ Сохраняем файл Средства - XorPreProcess Если где-то подчеркивает красным, то после новой зашифрованной строки добавляем .c_str() p.s. EncryptString - эту функцию вам нужно сделать самим, чтобы шифровка происходила по ключу и сервер при помощи этого ключа мог расшифровать данные.