PDA

View Full Version : Word List Generator



SyntaXmasteR
08-22-2007, 02:14 PM
This tool is a basic word generator. It will create every possible combination for the character set you supply. It runs on my computer (AMD athlon 64 Bit 2.2 GHZ 2GB RAM) at over 500,000 combinations a second. I wrote this to compare run times of C++ & PHP, but I'm sure you can think of many uses for it:

Sorry for the weird layout. My compiler was acting up with tabs.


#include <iostream>
#include <string>
#include <time.h>
#include <stdlib.h>
#include <fstream>
using namespace std;

int main()
{ // DATA ENTRY BEGIN --------------------------------------------------------
system("cls");
unsigned short int error=0;
string poss;//POSSIBLE CHARACTER COMBINATIONS
unsigned short int pass;//MAXIMUM PASSWORD LENGTH
string password; //ACTUAL PASSWORD
unsigned short int found=0;

cout << "SELECT CHARACTER SET:\n\n";
cout << "\t*. abcdefghijklmnopqrstuvwxyz\n";
cout << "\t2. ABCDEFGHIJKLMNOPQRSTUVWXYZ\n";
cout << "\t*. 0*2*45678*\n\n";
cout << "\t4. ***\n";
cout << "\t5. ***&*\n";
cout << "\t6. Other\n\t";
cout << "----------------------------------\n\t";

unsigned short int choice; // SELECTION FROM CHARACTER SET
string dataset; //STRING FOR CHARACTER SET
cin >> choice;

switch ( choice ) {

case * :
// Process for test = *
dataset="abcdefghijklmnopqrstuvwxyz";
break;

case 2 :
// Process for test = 5
dataset="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;

case * :
// Process for test = 5
dataset="0*2*45678*";
break;

case 4 :
// Process for test = 5
dataset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;

case 5 :
// Process for test = 5
dataset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0*2*45678*";
break;

case 6 :
// Process for all other cases.
cout << "\nENTER YOUR OWN CHARACTER SET: ";
cin >> dataset;
break;

default :
error=*;

}
if(error==0){
poss=dataset;

cout << "\nENTER PASSWORDS MAXIMUM LENGTH: ";
cin >> pass;

unsigned short int i=0;
while(poss[i])
{
i++;
}

int pass_array[pass-*];
unsigned short int j=0;
while(j<pass)
{
pass_array[j]=0;
j++;
}

unsigned short int comb_max=i-*; // SIZE OF COMBINATIONS ARRAY
signed short int pass_max=j-*; // MAXIMUM SIZE OF PASSWORD

signed short int pointer; //POINTER WILL EQUAL THE CURRENT PASS SIZE
// THIS ENABLES THE FLOATING POINT TO CHANGE THE COMBINATIONS

unsigned int counter=0; // COUNTER FOR EACH COMBINATION TRY

// DATA ENTRY END ----------------------------------------------------------

// OPENS THE TEXT FILE TO WRITE PASSWORDS TO
ofstream myfile;
myfile.open ("c:\\passwords.txt");
// -----------------------------------------

// ---- start timer ----
time_t start,end;
double dif;
time (&start);

while(pass_max>=0)
{
do
{
pointer=pass_max;
while(pass_array[pointer]<=comb_max)
{
string curr;// CURRENT PASSWORD TRY
counter++;
j=0;
while(j<=pass_max)
{
curr+= poss[pass_array[j]];
j++;
}
myfile << curr << " \n";
pass_array[pointer]=pass_array[pointer]+*;
}
pass_array[pointer]=0;
pointer--;
while(pass_array[pointer]==comb_max)
{
pass_array[pointer]=0;
pointer--;
}
pass_array[pointer]=pass_array[pointer]+*;
}
while(pointer>=0);

pass_max--;
}
// ---- end timer ----
end:
time (&end);
dif = difftime (end,start);

// ---- close text file ---- //
myfile.close();
// ------------------------- //

// ----- DISPLAY RESULTS ---- //
unsigned int combinations_per_second;
combinations_per_second=counter/dif;
system("cls");
cout << "\nWORDLIST CREATED";
cout << "\n------------------------------";
cout << "\nRUN TIME:\t " << dif << " sec";
cout << "\nCOMBINATIONS:\t " << counter;
cout << "\nCOMB/SEC: \t " << combinations_per_second;
cout << "\n\n\n";
system("pause");
return 0;
}else{
cout << "\tINVALID CHOICE!";
system("pause");
}
}

Moonbat
08-22-2007, 05:35 PM
Man, I wish I had the time to learn all this programming that you have, I feel like a nub :p

Once again, nice work SyntaX!

Ezekiel
08-22-2007, 07:14 PM
Remember that all system() function usage slows programs down, so don't use them in any loops or CPU-intensive parts.

It doesn't look like you did. Good.

Moonbat
08-22-2007, 07:21 PM
He used system('pause') in the last while loop of his code, dunno if that counts or not.

Ezekiel
08-22-2007, 07:38 PM
Probably not; if the intention is to pause, CPU usage won't be a concern.

Yeah, it's ok.

SyntaXmasteR
08-29-2007, 07:11 PM
Very good job. I was wondering about something like this. Too bad you need a separate program to make the hashes though.

Actually You dont need a separate program, I just havn't figured out how to use the hash.h files associated with c++. If you can demonstrate the use of the function I can easily add it in.

SyntaXmasteR
08-29-2007, 09:50 PM
LOL, Its funny you mention that because I actually have written all that already. I output the combinations to a file using c++ (because its the fastest). Then I run a PHP script (because I cant figure out md5 in c++) that takes the output and hashes each one. Then I run another c++ script (because its the fastest) that compares each line of the file to passwords. LoL Crazy stuff, but whatever works right?

About your code
Your code crashes because * is always * and that will fall into an infinite loop.

poss is an array. Lets say poss is this: poss=array("55","2","whatever")
This means that poss[i] is pointing to an element in the array only when i is 0,*,2.
Once i=* poss[*] does not exist so it returns FALSE. This makes it fall out of the loop.

IN PHP IT IS A LITTLE DIFFERENT


$test=array("55","2","whatever"); $i=0;

while(isset($test[$i])){
echo "SET AND NO ERRORS";
$i++;
}


You will get a WARNING (not exactly an error) if you do it this way:


$test=array("55","2","whatever"); $i=0;

while($test[$i]){
echo "SET AND NO ERRORS";
$i++;
}


It will throw a warning in your PHP logs about '*'. I try to keep my logs completely clean of warnings and errors. This way you can really see when something is going wrong.