Требуется написать свой Bruteforce т. е. пользователь вводит какой-то пароль и программа методом перебора всех возможных вариантов находит этот пароль. Предполагается, что программа не может отработать и не найти пароль. Ограничение перебора осуществляется пользователем, т.е будут ли включены в перебор цифры, заглавные буквы, символы и т. д.
Рекомендую ограничить длину вводимого пароля до 4-х символов, больше не надо, иначе программа долго будет работать. Еще лучше, если на этапе разработки программы, длина пароля будет 2 — 3 символа. Кроме того, задайте в программе множество допустимых символов пароля. Например, в пароле могут использоваться только цифры и/или буквы, это заметно поможет ускорить процесс отладки программы-брутфорса.
Автор — NaikoN.
К сожалению, решения данной задачи пока нет. Если Вы решили эту задачу, сообщите нам, и мы выложим её на сайте.
E-mail : admin@cppstudio.com
Комментарии
art_h4rd
Если правильно понял задачку, то вот:
int main() { const int size_str = 10; char pass[size_str]; cout << "Type ur password: "; gets_s(pass, size_str); char res[size_str]{}; int k = strlen(pass); int j(0); while (k--) { for (int i = 48; i <= 122; i++) // ascii table { if (char(i) == pass[j]) { res[j] = char(i); break; } } j++; } res[size_str - 1] = 0x00; cout << "Ur pass: " << res << endl; }Lee Amstrong
Вот так получилось. Я не программист, так что сильно не ругайтеся ^_^
Вывод в консоле: http://dl3.joxi.net/drive/2017/06/12/0004/1779/300787/87/dd69e3bc9d.png
main.cpp
#include <iostream> #include <chrono> //замерить время перебора #include "brutforce.h" using namespace std; int main(int argc, char const *argv[]) { //setlocale( LC_ALL,"Russian" ) //Если ваша консоль не поддерживает кирилицу int alphabet = BRUT_NUMBERS|BRUT_ENG_LOWERCASE|BRUT_ENG_UPPERCASE; cout << '\t' << "Йоба брутфорсер" << endl; while (true) { cout << "__________________________________" << endl; cout << "__________________________________" << endl; cout << endl; cout << "1) Перебрать пароль" << endl; cout << "2) Установить набор символов" << endl; cout << "3) Выход" << endl; cout << endl; int menu_item = 0; cout << "Пункт меню: "; cin >> menu_item; switch (menu_item) { case 1: { set_alphabet(alphabet); string real_password; cout << "Пароль: "; cin >> real_password; if (real_password.empty()) { cout << "Ваш пароль: у вас нет пароля ^_^"; break; } else if (!is_valid_pass(real_password)) { cout << "Пароль содержит недопустимые знаки. Настройте набор символов." << endl; break; } else { if (real_password.size() > 4) { //Если длина пароля больше 4 то выводим предупреждение cout << "ВАШ ПАРОЛЬ БОЛЬШОЙ. ПЕРЕБОРКА МОЖЕТ ЗАНЯТЬ ОЧЕНЬ МНОГО ВРЕМЕНИ!!!" << endl; } //Начинаем перебирать пароль каждый раз увеличивая его длину на 1 int brutedpass_size = 0; auto begin = chrono::high_resolution_clock::now(); while (true) { brutedpass_size++; string brutedpass = brutforce_password(real_password, brutedpass_size); //Если получили пустую строку, то это значит что бароль не найден. Увеличиваем длину поиска if (!brutedpass.empty()) { //оп, пароль найден, выводим auto end = chrono::high_resolution_clock::now(); cout << "Ваш пароль: " << brutedpass << endl; cout << "Перебор занял "; cout << chrono::duration_cast<chrono::seconds>(end-begin).count()<<" секунд(ы)"<< endl; return 0; } } } break; } case 2: { cout << "Текущий набор символов: " << get_alphabet(alphabet) << endl; cout << "Использовать: " << endl; cout << '\t' << "1) Только цифры" << endl; cout << '\t' << "2) Строчные английские буквы" << endl; cout << '\t' << "3) Строчные английские буквы и цифры" << endl; cout << '\t' << "4) Заглавные английские буквы" << endl; cout << '\t' << "5) Заглавные английские буквы и цифры" << endl; cout << '\t' << "6) Заглавные, строчные английские буквы и цифры" << endl; int new_charset = 0; cout << "Пункт меню: "; cin >> new_charset; if (!new_charset || (new_charset < 0)) { cout << "Невозможно установить данный набор" << endl; break; } switch (new_charset) { case 1:{alphabet = BRUT_NUMBERS; break;} case 2:{alphabet = BRUT_ENG_LOWERCASE; break;} case 3:{alphabet = BRUT_NUMBERS|BRUT_ENG_LOWERCASE; break;} case 4:{alphabet = BRUT_ENG_UPPERCASE; break;} case 5:{alphabet = BRUT_NUMBERS|BRUT_ENG_UPPERCASE; break;} case 6:{alphabet = BRUT_NUMBERS|BRUT_ENG_LOWERCASE|BRUT_ENG_UPPERCASE; break;} } cout << "Установлен набор символов: " << get_alphabet(alphabet) << endl; break; } case 3: { return 0; } } cin.clear(); cin.get(); } return 0; }bruteforce.h
bruteforce.cpp
#include <string> #include <vector> #include "brutforce.h" using namespace std; vector<char> alphabet; bool is_valid_char(char ch){ for (size_t i = 0; i < alphabet.size(); i++) { if (alphabet[i] == ch) { return true; } } return false; } bool is_valid_pass(string pass){ for (size_t i = 0; i < pass.size(); i++) { if (!is_valid_char(pass[i])) { return false; } } return true; } string get_alphabet(int letter_set){ string letters = ""; if (letter_set & BRUT_NUMBERS) {letters += "0123456789";} if (letter_set & BRUT_ENG_LOWERCASE) {letters += "abcdefghijklmnopqrstuvwxyz";} if (letter_set & BRUT_ENG_UPPERCASE) {letters += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";} return letters; } void set_alphabet(int letter_set){ string letters = ""; if (letter_set & BRUT_NUMBERS) {letters += "0123456789";} if (letter_set & BRUT_ENG_LOWERCASE) {letters += "abcdefghijklmnopqrstuvwxyz";} if (letter_set & BRUT_ENG_UPPERCASE) {letters += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";} for (size_t i = 0; i < letters.size(); i++) { alphabet.push_back(letters[i]); } } string brutforce_password(string real_password, int brutforce_size){ vector<int> password(brutforce_size); //Вектор в котором элементы - это позиция символа в алфавите (vector<char> alphabet) //На всякий случай присваеваем элементам вектора нули явно for (size_t i = 0; i < password.size(); i++) { password[i] = 0; } //Строка после которой перебор будет идти по новой. Если получим эту строку в цикле перебора, то разорвем его string last_aviable_pass = string(password.size(), alphabet.back()); bool need_break_loop = false; while (!need_break_loop) { for (size_t letter = 0; letter < alphabet.size(); letter++) { password[0] = letter; string pass = string(); for (size_t i = 0; i < password.size(); i++) { pass.push_back(alphabet[password[i]]); } if (pass == real_password) { return pass; } else if (pass == last_aviable_pass) { need_break_loop = true; } } for (size_t i = 1; i < password.size(); i++) { password[i]++; if (password[i] == alphabet.size()) { password[i] = 0; } else { break; } } } return string(); //Возвращаем пустую строку, если пароль не был найден }biggy
Как-то так (на C):
/* * by Biggy * * Bruteforce */ #include <stdio.h> #include <stdlib.h> #include <string.h> void yyy(void); void nyy(void); void nny(void); void yny(void); void yyn(void); int main (void) { char y1 = 0, y2 = 0, y3 = 0; printf("Will you use characters (y/n) ?"); scanf(" %c", &y1); printf("Will you use big characters (y/n) ?"); scanf(" %c", &y2); printf("Will you use numbers (y/n) ?"); scanf(" %c", &y3); if(y1 == 'y' && y2 == 'y' && y3 == 'y') yyy(); else if(y1 == 'n' && y2 == 'y' && y3 == 'y') nyy(); else if(y1 == 'n' && y2 == 'n' && y3 == 'y') nny(); else if(y1 == 'y' && y2 == 'n' && y3 == 'y') yny(); else if(y1 == 'y' && y2 == 'y' && y3 == 'n') yyn(); printf("done."); return EXIT_SUCCESS; } void yyy(void) { char buffer[5] = {0}; char buffer2[5] = {0}; printf("Enter your password ?"); scanf("%4s", buffer); for(char i = '0'; i != '}'; ++i) { for(char j = '0'; j != '}'; ++j) { for(char u = '0'; u != '}'; ++u) { for(char z = '0'; z != '}'; ++z) { if(i == ':') i = 'a'; else if(i == '{') i = 'A'; if(j == ':') j = 'a'; else if(j == '{') j = 'A'; if(u == ':') u = 'a'; else if(u == '{') u = 'A'; if(z == ':') z = 'a'; else if(z == '{') z = 'A'; buffer2[0] = i; buffer2[1] = j; buffer2[2] = u; buffer2[3] = z; //printf("%s\r\n", buffer2); if(strcmp(buffer, buffer2) == 0) printf("Your password: \t%s\r\n", buffer2); if(z == 'Z') break; } if(u == 'Z') break; } if(j == 'Z') break; } if(i == 'Z') break; } return; } void nyy(void) { char buffer[5] = {0}; char buffer2[5] = {0}; printf("Enter your password ?"); scanf("%4s", buffer); for(char i = '0'; i != '}'; ++i) { for(char j = '0'; j != '}'; ++j) { for(char u = '0'; u != '}'; ++u) { for(char z = '0'; z != '}'; ++z) { if(i == ':') i = 'A'; else if(j == ':') j = 'A'; else if(u == ':') u = 'A'; else if(z == ':') z = 'A'; buffer2[0] = i; buffer2[1] = j; buffer2[2] = u; buffer2[3] = z; //printf("%s\r\n", buffer2); if(strcmp(buffer, buffer2) == 0) printf("Your password: \t%s\r\n", buffer2); if(z == 'Z') break; } if(u == 'Z') break; } if(j == 'Z') break; } if(i == 'Z') break; } return; } void nny(void) { char buffer[5] = {0}; char buffer2[5] = {0}; printf("Enter your password ?"); scanf("%4s", buffer); for(int i = 48; i < 58; ++i) { for(int j = 48; j < 58; ++j) { for(int u = 48; u < 58; ++u) { for(int z = 48; z < 58; ++z) { buffer2[0] = i; buffer2[1] = j; buffer2[2] = u; buffer2[3] = z; //printf("%s\r\n", buffer2); if(strcmp(buffer, buffer2) == 0) printf("Your password: \t%s\r\n", buffer2); } } } } return; } void yny(void) { char buffer[5] = {0}; char buffer2[5] = {0}; printf("Enter your password ?"); scanf("%4s", buffer); for(char i = '0'; i != '}'; ++i) { for(char j = '0'; j != '}'; ++j) { for(char u = '0'; u != '}'; ++u) { for(char z = '0'; z != '}'; ++z) { if(i == ':') i = 'a'; else if(j == ':') j = 'a'; else if(u == ':') u = 'a'; else if(z == ':') z = 'a'; buffer2[0] = i; buffer2[1] = j; buffer2[2] = u; buffer2[3] = z; //printf("%s\r\n", buffer2); if(strcmp(buffer, buffer2) == 0) printf("Your password: \t%s\r\n", buffer2); if(z == 'z') break; } if(u == 'z') break; } if(j == 'z') break; } if(i == 'z') break; } return; } void yyn(void) { char buffer[5] = {0}; char buffer2[5] = {0}; printf("Enter your password ?"); scanf("%4s", buffer); for(char i = 'a'; i != '}'; ++i) { for(char j = 'a'; j != '}'; ++j) { for(char u = 'a'; u != '}'; ++u) { for(char z = 'a'; z != '}'; ++z) { if(i == 'z') i = 'A'; else if(j == 'z') j = 'A'; else if(u == 'z') u = 'A'; else if(z == 'z') z = 'A'; buffer2[0] = i; buffer2[1] = j; buffer2[2] = u; buffer2[3] = z; printf("%s\r\n", buffer2); /* if(strcmp(buffer, buffer2) == 0) printf("Your password: \t%s\r\n", buffer2); */ if(z == 'Z') break; } if(u == 'Z') break; } if(j == 'Z') break; } if(i == 'Z') break; } return; }Артем Коршенко
Вот такой вариант. Алгоритм, к сожалению не мой, переписал с С# на С++, нашел на каком-то читерском сайте.
Код: pastebin.com/ETUNPfaW