Source code Brute Forcer C++

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