Code:
// *** SIMPLE C++ BRUTE FORCE EXAMPLE CODE ***
#include <iostream>
#include <string>
using namespace std;
/* CHARACTER LISTS */
char lower[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','\0'};
char upper[27]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','\0'};
char numbs[11]={'0','1','2','3','4','5','6','7','8','9','\0'};
char symbls[30]={'!','?','.',':',',','-','_','#','$','*','+','%','&','/','\\','(',')','[',']','@','=',';','{','}','<','>','|','^','"','\0'};
char alphabet[95]; // This will contain the brute force alphabet
/* VARIABLES */
string password = ""; // We will brute-force this
string bruteword = ""; // The string we want to be =password
string pw = ""; // Just a help variable; contains the matching bruteword
string letters = ""; // Letters that will be added to the current character(alphabet[X]) in order to create the bruteword
bool pw_found = false; // Password ain't found yet.
int maxChars = 15; // Maximum length of the bruteword (can be changed by the user)
int minChars = 1; // Minimum length o. t. BW ( " )
int alph_length = 0; // Length of the char alphabet
/* VOIDS */
void asdf(); // Nonsense, but funny ;P
void createAlph(); // Creates brute alphabet
void check(string bruteword); // Checks if bruteword = password
void brute (int charsInBW, int instance, string letters); // BRUTE BRUTE BRUTE
/* PROGRAM CODE */
int main()
{
// START ROUTINE //
cout << endl;
cout << "Enter a password to attack: ";
cin >> password;
cout << endl;
cout << "Minimum length of the bruteword(default 1): ";
cin >> minChars;
cout << "Maximum length of the bruteword(default 15): ";
cin >> maxChars;
// CREATING THE ALPHABET ARRAY //
createAlph();
// Right before we start...
cout << endl;
cout << "**" << endl;
cout << "Password string that will be attacked: '" << password << "'" << endl;
alph_length = strlen(alphabet);
cout << "Brute force alphabet: " << alphabet << endl;
cout << "Characters: " << alph_length << endl;
asdf(); // Some useless extra feature, I was bored
cout << "**" << endl << endl;
cout << "Press ENTER to start brute forcing..." << endl;
cin.get();cin.get(); // Forces the application to wait for user input
// LET'S GO! //
for( int i=minChars; i<=maxChars ; i++) // Bruteword needs [i] characters.
{ // ( e.g. the brutewords with 1 character don't match? Then use 2 characters etc etc ... )
brute(i,0,letters);
} // Read the comments in void brute() for further information.
// FOR()-LOOP STOPPED, PASSWORD FOUND OR NOT?
if ( pw_found )
{ // match!
cout << "Bruteforcing stopped." << endl << endl;
cout << "PASSWORD MATCH!!! -> " << pw << endl << endl;
cout << "Press ESCAPE to close the application...";
cin.get(); // Forces the application to wait for user input
}
else
{ // no match ... :(
cout << "Bruteforcing stopped." << endl << endl;
cout << "*** No matching password has been found." << endl << endl;
cout << "Press ESCAPE to close the application...";
cin.get(); // Forces the application to wait for user input
}
return 0;
}
void brute(int charsInBW, int instance, string letters)
{
for(int b=0; b<alph_length ; b++ ) // There are [alph_length] characters in char array alphabet( e.g.'a'=position 0 and 'z'=position 25).
{ // Now, alphabet[b] can display every single character in the chosen alphabet.
if( !pw_found ) // Password still unknown?
{
if ( instance+1 != charsInBW ) // How many characters needs the bruteword(this is told by charsInBW)? If >1, then use this ( comparable to "picture in picture" or "mise en abyme" ) ...
{ // It creates [charsInBW-1] running brute voids(and each one of them defines exactly 1 character in the bruteword) that run within a brute void that already started(e.g. the first instance started by int main).
brute(charsInBW, instance+1, alphabet[b]+letters); // "instance+1": One needed brute-instance less, because a new one ...
} // ... with alphabet[b]+(letters of other instances) in the "letters"-string has been started.
else check(alphabet[b]+letters); // This is the last instance which checks ...
} // ... if (current character)+(letters of all other instances) is =password.
else // A matching password has been found!
{
b=alph_length; // This stops the for()-loops in void brute...
maxChars = pw.size(); // ... and in int main().
}
}
}
void check(string bruteword)
{
cout << bruteword << endl;
if ( bruteword == password ) // Bruteword matches?
{
pw_found = true; // Stops the creation of instances in void brute.
pw = bruteword; // Writes a global string for displaying the matching bruteword in int main.
}
}
void createAlph() // Should be self explanatory ...
{
cout << endl;
string answ = ""; // This will store the user's answers during alphabet construction
cout << "Attack with lower case letters(Y/N)? ";
cin >> answ;
if ( answ == "y" || answ == "Y" ) strncat_s(alphabet,sizeof(alphabet),lower,sizeof(lower));
else if ( answ == "n" || answ == "N" ) cout << "*** No lower case letters." << endl;
else cout << "*** Wrong input." << endl << "Lower case letters have NOT been added to the brute force alphabet." << endl;
answ = ""; // Reset for possible rewrite
cout << "Attack with numbers(Y/N)? ";
cin >> answ;
if ( answ == "y" || answ == "Y" ) strncat_s(alphabet,sizeof(alphabet),numbs,sizeof(numbs));
else if ( answ == "n" || answ == "N" ) cout << "*** No numbers." << endl;
else cout << "*** Wrong input." << endl << "Numbers have NOT been added to the brute force alphabet." << endl;
answ = "";
cout << "Attack with upper case letters(Y/N)? ";
cin >> answ;
if ( answ == "y" || answ == "Y" ) strncat_s(alphabet,sizeof(alphabet),upper,sizeof(upper));
else if ( answ == "n" || answ == "N" ) cout << "*** No upper case letters." << endl;
else cout << "*** Wrong input." << endl << "Upper case letters have NOT been added to the brute force alphabet." << endl;
answ = "";
cout << "Attack with symbols(Y/N)? ";
cin >> answ;
if ( answ == "y" || answ == "Y" ) strncat_s(alphabet,sizeof(alphabet),symbls,sizeof(symbls));
else if ( answ == "n" || answ == "N" ) cout << "*** No symbols." << endl;
else cout << "*** Wrong input." << endl << "Symbols have NOT been added to the brute force alphabet." << endl;
answ = "";
}
void asdf()
{
string first = "";
string last = "";
char cFirst=alphabet[0];
char cLast=alphabet[alph_length-1];
for(int i=1; i<=minChars;i++)
{
first=first+cFirst;
}
for(int i=1; i<=maxChars;i++)
{
last=last+cLast;
}
cout << "Going to attack from '" << first << "' to '" << last << "'!" << endl;
}
//
// END OF FILE
* This article was originally published here
Comments
Post a Comment