Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Цель урока
Научиться делать простой консольный лоадер с привязкой к сайту
Необходимые компоненты
Visual Studio (С++)
Научиться делать простой консольный лоадер с привязкой к сайту
Необходимые компоненты
Visual Studio (С++)
Давайте начнём с того, что нам нужен сайт / форум. Я выбрал XorPreProces, ведь там есть удобный установщик.
Установить XenForo: Installation and upgrades - XenForo 1 Manual
Далее приступим к установке:
- Средства > Внешние инструменты / Tools > External Tools
- Добавить / Add
- Далее пишем: XorPreProcess. Аргументы: $(ProjectDir) $(ProjectFileName)
- Использовать окно вывода
Далее открываем свойства решения и ставим набор символов "Многобайтовая кодировка" -
Создаем 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;
}
Функция 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;
}
- Оборачиваем каждую строку (все что в кавычках), которую считаете нужной зашифровать, в _xor_
- Сохраняем файл
- Средства - XorPreProcess
- Если где-то подчеркивает красным, то после новой зашифрованной строки добавляем .c_str()
p.s. EncryptString - эту функцию вам нужно сделать самим, чтобы шифровка происходила по ключу и сервер при помощи этого ключа мог расшифровать данные. Также можете скачивать с сайта шифрованную Dll, расшифровывать и инжектить уже ее
Последнее редактирование: