143 lines
9.3 KiB
C++
Executable File
143 lines
9.3 KiB
C++
Executable File
#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; //Завершение
|
||
|
||
} |