Статья ⚡Создание лоадера | Урок #1

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


Необходимые компоненты
Visual Studio (С++)

Давайте начнём с того, что нам нужен сайт / форум. Я выбрал XorPreProces, ведь там есть удобный установщик.
Установить XenForo: Installation and upgrades - XenForo 1 Manual

Далее приступим к установке:
  1. Средства > Внешние инструменты / Tools > External Tools
  2. Добавить / Add
  3. Далее пишем: XorPreProcess. Аргументы: $(ProjectDir) $(ProjectFileName)
  4. Использовать окно вывода
В директорию VS мы должны закинуть XorStr.hpp и само собой подключить его к проекту
Далее открываем свойства решения и ставим набор символов "Многобайтовая кодировка" -
Создаем Main.cpp:
C++:
#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):
C++:
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 андетект (уже нет)

Функция main:
C++:
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 - эту функцию вам нужно сделать самим, чтобы шифровка происходила по ключу и сервер при помощи этого ключа мог расшифровать данные. Также можете скачивать с сайта шифрованную Dll, расшифровывать и инжектить уже ее
 
Последнее редактирование:
  • LauX
  • Заблокирован
  • 678
  • 12
  • 232
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Да не, в иде просто можно открыть и спокойно вытащить юрл через реквесты
 
  • 1
  • 0
Контакты для связи отсутствуют.
че делать если в xorstr.hpp такое? не шарю просто
 

Вложения

  • 1657996790317.png
    20 KB · Просмотры: 89
  • LauX
  • Заблокирован
  • 678
  • 12
  • 232
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Активность
Пока что здесь никого нет
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше...