Статья ⚡Создание лоадера | Урок #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
    1657996790317.png
    20 KB · Просмотры: 86
  • LauX
  • Заблокирован
  • 678
  • 12
  • 232
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Активность
Пока что здесь никого нет
Сверху Снизу