Cpp/BrutForce.cpp
2026-05-17 02:56:32 +03:00

143 lines
9.3 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include<iostream>//Ввод вывод
#include<fstream>//Работа с файлами
#include<string>//Работа со строками
#include<vector>//Работа с динамическими массивами
#include<algorithm>//Работа с алгоритмами
#include<chrono>//Работа с временем
#include<thread>//Работа с многопоточностью
std::vector<std::string>usernames;// Храним имена пользователей
std::vector<std::string>passwords;// Храним пароли
void addUserFromFile()// Объявляем функцию добавления пользователей в файл
{
std::ifstream file("users.txt");// Создаём объект file типа std::ifstream
if(!file){//Если файл не открылся
std::cout<<"Файл не найден"<<std::endl;//Выводим сообщение об ошибке
return ;//Завершаем функцию
}
std::string username, password;// Объявляем переменные типа string для пароля и имени пользователя
while (file >> username >> password){//Цикл читает файл до тех пор пока есть сходства
usernames.push_back(username);//Добавляем элемент в конец вектора
passwords.push_back(password);//Добавляем объект в конец вектора
}
}
bool Verifier(const std::string& username, const std::string& password,//Проверка совпадений
const std::vector<std::string>& usernames, const std::vector<std::string>& passwords)//Списки логинов и паролей
{
for (size_t i=0; i<usernames.size(); i++)//Проходим по всем логигнам
{
if(usernames[i] == username && passwords[i] == password){//Если логин и пароль совпадают
return true;//Вход разрешён
}
}
return false;//конец проверки
}
bool userExists(const std::string& username){//Проверяем наличие пользователя
for(const auto& existing: usernames){//Перебираем список логинов
if(existing == username){//Если логин найден
return true;//Пользователь существует
}
}
return false;//Пользователь не найден
}
void bruteSmart(const std::string& targetPassword, const std::string& charset){//Функция умного подбора пароля
std::string current = std::string(targetPassword.length(), '.');//Строка заготовка из точек
for (size_t i=0; i<targetPassword.length();++i){//Перебираем каждый символ пароля
for(char c : charset){//Перебираем каждый символ из набора символов
current[i]=c;//Подставляем символ
std::cout<<"Пробуем: "<<current<<"\r"<<std::flush;//Вывод текущей попытки
std::this_thread::sleep_for(std::chrono::milliseconds(30));//Небольшая задержка
if(c == targetPassword[i]){//Если символ совпал с оригиналом
break;//Переходим к следующему символу
}
}
}
std::cout<<"\nПароль подобран: "<<current<<std::endl;//Выводим найденный пароль
}
void bruteForce(const std::string& username){//Запуск брутфорса по логину
auto it =std::find(usernames.begin(), usernames.end(), username);//Ищем логин в списке
if(it == usernames.end()){//Если не найден
std::cout<<"Пользователь не найден"<<std::endl;//Выводим сообщение
return;//Выход из функции
}
size_t index = std::distance(usernames.begin(), it);//Получаем индекс пользователя
std::string targetPassword = passwords[index];//Получаем его пароль
const std::string charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-_=+[]{};:'\",.<>?/\\|~";//Допустимые символы
std::cout<<"Запуск брутфорса на пользователя: " << username<<std::endl;//Вывод надписи
bruteSmart(targetPassword, charset);//Вызов самого брутфорса
}
int main(){
addUserFromFile();//Добавляем пользователя в файл
while(true){//Бесконечный цикл для отображения
std::cout<<"\n===MENU==="<<std::endl;//Выводим надпись MENU
std::cout<<"1. Проверка пользователя"<<std::endl;//Выводим надпись "1. Проверка пользователя"
std::cout<<"2. Зарегистрировать нового пользователя"<<std::endl;//Выводим надпись "2.Зарегистрировать пользователя ""
std::cout<<"3. Брутфорс"<<std::endl;//Вывод "Брутфорс"
std::cout<<"4. Выход"<<std::endl;//Вывод надписи "3.Выход"
std::cout<<"Выбери действие: "<<std::endl;//Выводим "Выбери действие"
int choice;// Переменная хранящаяя выбор пользователя (1 , 2 или 3)
std::cin>>choice;//Ввод с клавиатуры
std::cin.ignore(); // пропускаем символ новой строки после ввода, чтобы избежать проблем с последующим вводом строк
if(choice==1){//Условие выбора
std::string username;//Переменная хранит имя пользователя и пароль
std::cout<<"Введи логин: ";//Запрашиваем логин
std::getline(std::cin, username);//Вводим логин с клавиатуры
if(userExists(username)){//Если введеные пользователем данные совпадают
std::cout<<"Пользователь найден"<<std::endl;//Выводим разрешенный доступ
}else{//Иначе
std::cout<<"Неверный логин или пароль"<<std::endl;//Выводим ошибку
}
}else if (choice ==2){//Условие выбора
std::string newUsername, newPassword;//Переменная хранящая новый пароль и логигн для регистрации нового пользователя
std::cout<<"Придумай логин: ";//Запрашиваем новыйь
std::getline(std::cin, newUsername);//Вводим с клавиатуры
std::cout<<"Придумай пароль: ";//Запрашиваем
std::getline(std::cin, newPassword);//Вводим новый пароль читая всю строку
if(userExists(newUsername)){//Если пользователь уже существует
std::cout<<"Такой пользователь уже существует"<<std::endl;//Выводим сообщение
}else{//Иначе
usernames.push_back(newUsername);//Добавляем логин
passwords.push_back(newPassword);//Добавляем логин
std::ofstream outFile("users.txt", std::ios::app);//Открываем файл для записи
if(outFile){
outFile<<newUsername<<" "<<newPassword<<std::endl;//Сохраняем данные
std::cout<<"регистрация успешна"<<std::endl;//Вывод сообщения
}else{//Иначе
std::cout<<"Ошибка записи в файл"<<std::endl;//Выводим ошибку
}
}
}else if(choice == 3){//Если выбор 3
std::string username;//Переменная для хранения имени пользователя
std::cout<<"Введите имя пользователя для брутфорса: ";//Выводим запрос на ввод
std::getline(std::cin,username);//Ввод имени пользователя(с учетом пробелов)
bruteForce(username);//Запуск буртфорса
}else if(choice ==4){//Если выбор 4
std::cout<<"Выход..."<<std::endl;//Выводим надпись
break;//Завершение программы
}else{//Если введен некорректный пункт меню
std::cout<<"Некорректный выбор, попробуй еще раз"<<std::endl;//Ошибка
}
}
return 0; //Завершение
}