We're a community of 1077K IT Pros here for help, advice, solutions, professional growth and fun. Join us!
1,076,301 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Start New Discussion Reply to this Discussion

Creating Bruteforce Program

I'm interested in creating a bruteforce program. What is the most computer resource efficient method to count in base 62? (1,2,3...a,b,c...A,B,C)

11
Contributors
17
Replies
4 Years
Discussion Span
1 Year Ago
Last Updated
23
Views
portege
Light Poster
26 posts since Jul 2006
Reputation Points: 13
Solved Threads: 1
Skill Endorsements: 0

probably something like below: count using normal integers but convert to base62 for display.

#include <cstring>
#include <iostream>
using namespace std;

int main( )
{
	long n = 1234576;
	char buf[255];
	 _itoa( n, buf, 62 );
	cout << buf << "\n";
    return 0;
}

Warning: The above code is not ansi standard. Here is a link you might be able to use if you need something ansi standard.

[edit]I have done a little testing with the algorithms in the link I posted and none of them produce the same result as _itoa() function. The first algorithm for my_atoi() might be a fairly simple fix -- it just leaves off the last digit.[/edit]

Ancient Dragon
Achieved Level 70
Team Colleague
32,140 posts since Aug 2005
Reputation Points: 5,836
Solved Threads: 2,577
Skill Endorsements: 69

Well here is a c++ version that should be portable and returns the same as itoa().

string my_itoa(int value, int base)
{
	string s;
	for(int i = base; value && i ; --i, value /= base)
	{
		s = "0123456789abcdefghijklmnopqrstuvwxyz"[value % base] + s;
	}
	return s;

}
Ancient Dragon
Achieved Level 70
Team Colleague
32,140 posts since Aug 2005
Reputation Points: 5,836
Solved Threads: 2,577
Skill Endorsements: 69

The problem here is that it wouldn't be able to crack a string such as 000 or 0zzz

combustion
Newbie Poster
4 posts since Nov 2009
Reputation Points: 9
Solved Threads: 0
Skill Endorsements: 0

Here's my code, tested for errors:

#include <iostream>
#include <string>
using namespace std;
char chars[]={'0','1','2','3','4','5','6','7','8','9','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'};
string t;
void checkPassword(string password);
void recurse(int width, int position, string baseString);
int  main() {
  cout << "Enter a string: " << endl;
  cin >> t;
  int maxChars = 13;
  for(int i=0;i<maxChars+1;i++) {
    cout << "checking passwords width [" << i << "]..." << endl;
    recurse(i,0,"");
  }
  return 0;
}
void recurse(int width, int position, string baseString) {
  for(int i=0;i<35;i++) {
    if (position < width-1) {
      recurse(width, position + 1, baseString+chars[i]);
    }
    checkPassword(baseString+chars[i]);
  }
}
void checkPassword(string password) {
  if (password==t) {
    cout << "match [" << password << "]" << endl;
    exit(1);
  }
}

it cracks the string h3ar7 in 16 seconds on my computer.

combustion
Newbie Poster
4 posts since Nov 2009
Reputation Points: 9
Solved Threads: 0
Skill Endorsements: 0

There should be 36 in for loop :)
regards

burmix
Newbie Poster
1 post since Dec 2009
Reputation Points: 10
Solved Threads: 0
Skill Endorsements: 0

>>it cracks the string h3ar7 in 16 seconds on my computer.

Thats pretty slow. There is no reason to use recursion here.

firstPerson
Industrious Poster
4,044 posts since Dec 2008
Reputation Points: 851
Solved Threads: 625
Skill Endorsements: 15

How do i find out what the password is after it cracks it?

Shadowlala
Newbie Poster
1 post since Mar 2011
Reputation Points: 10
Solved Threads: 0
Skill Endorsements: 0

Great algo combustion! I have one question can anyone tell me a way with combustions code to make it so it will start with given characters? I've tried a few things but they always seem to reset back to the beginning.

Hereticbeast
Newbie Poster
3 posts since Jun 2011
Reputation Points: 10
Solved Threads: 0
Skill Endorsements: 0
s = "0123456789abcdefghijklmnopqrstuvwxyz"[value % base] + s;

offtopic:I'm having trouble understanding this line, so you're initializing s with "01..yz"
but what does the

[value % base] + s

part actually do?

CPT
Light Poster
35 posts since Aug 2010
Reputation Points: 10
Solved Threads: 1
Skill Endorsements: 0

Would it help if the code looked like this?

string digits = "0123456789abcdefghijklmnopqrstuvwxyz";
int index = value % base;

s = digits[index] + s;
Narue
Bad Cop
Team Colleague
15,460 posts since Sep 2004
Reputation Points: 6,483
Solved Threads: 1,407
Skill Endorsements: 54

Would it help if the code looked like this?

string digits = "0123456789abcdefghijklmnopqrstuvwxyz";
int index = value % base;

s = digits[index] + s;

yes, so how it's possible to define a string followed by an expression, how it's this possible ?

CPT
Light Poster
35 posts since Aug 2010
Reputation Points: 10
Solved Threads: 1
Skill Endorsements: 0

How would it not be possible? This isn't any different from adding two integer literals together (ie. 2 + 3 ). The compiler manages storage for the temporary objects, and you can use those objects in a valid expression. Just like + is a valid operator for integers, [] is a valid operator for a pointer to char (the value type of a string literal).

Narue
Bad Cop
Team Colleague
15,460 posts since Sep 2004
Reputation Points: 6,483
Solved Threads: 1,407
Skill Endorsements: 54

And '+' is defined as the concatenation-operator for the std::string class, so

string s = "foo";
    char c = 'a';
    s = c + s;
    cout << s << endl;

would display "afoo"

raptr_dflo
Practically a Master Poster
605 posts since Aug 2010
Reputation Points: 76
Solved Threads: 83
Skill Endorsements: 1

Great algo combustion! I have one question can anyone tell me a way with combustions code to make it so it will start with given characters? I've tried a few things but they always seem to reset back to the beginning.

Any ideas? Or is it not possible?

Hereticbeast
Newbie Poster
3 posts since Jun 2011
Reputation Points: 10
Solved Threads: 0
Skill Endorsements: 0

Anything is possible, but I can't read minds yet. Please post the current state of your code along with a description of what you're trying to do, what results you're seeing instead, any error messages, and finally whatever specific questions you have.

raptr_dflo
Practically a Master Poster
605 posts since Aug 2010
Reputation Points: 76
Solved Threads: 83
Skill Endorsements: 1
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
char chars[]={'0','1','2','3','4','5','6','7','8','9','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'};
string t;
int startchars[3];
bool start = true;
void checkPassword(string password);
void recurse(int width, int position, string baseString);
int  main() {
  cout << "Enter a string: " << endl;
  cin >> t;
  startchars[0] = 5;
  startchars[1] = 10;
  startchars[2] = 15;
  int maxChars = 13;
  for(int i=3;i<maxChars+1;i++) {
    cout << "checking passwords width [" << i << "]..." << endl;
    recurse(i,0,"");
  }
  return 0;
}
void recurse(int width, int position, string baseString) {
  printf("Width: %d Position: %d String: %s\n",width,position,baseString.c_str());
  for(int i=0;i<36;i++) {
    if (position < width-1) {
      printf("Recurse2 i: %d width: %d position: %d string: %s\n",i,width,position + 1,baseString.c_str());
      if(start)
      {
          recurse(width, position + 1, baseString+chars[startchars[i]]);
          if(i >= sizeof(startchars))
              start = false;
      }
      else
      {
          recurse(width, position + 1, baseString+chars[i]);
      }
    }
    printf("Width: %d Position: %d String: %s\n",width,position,baseString.c_str());
    checkPassword(baseString+chars[i]);
    Sleep(100);
  }
}
void checkPassword(string password) {
   cout << "trying " << password << endl;
  if (password==t) {
    cout << "match [" << password << "]" << endl;
    system("Pause");
    exit(1);
  }
}

This is combustions code but modifyied to try to specify where I want it to start. Problem is the first char specified for start is correct but the second is the same as first and when it goes to flip the chars before the last char in the string they reset back to the beginning instead of going to the next char after the specified char. The idea is to have it so if program exits, it can pick up where it left off instead of starting back at the beginning.

Hereticbeast
Newbie Poster
3 posts since Jun 2011
Reputation Points: 10
Solved Threads: 0
Skill Endorsements: 0

It will help if you understand what combustion's code is doing in the first place.

A previous commenter pointed out that recursion isn't strictly necessary for this problem, and probably slows down the algorithm a great deal. In addition, his recurse() function calls checkPassword() too often: since he's looping over desired password-width outside of the function, he should only be checking the password if the postion == width-1 (he's filled the password to the desired width), the code calls the function for all widths as the recursion unwinds. Finally, another commenter also pointed out an actual error in the code: as written, an input password with a 'z' in it will never be matched.

That said, it's very hard (if not impossible) to restart a recursive process in the middle, if the "program exits" for some reason other than completing its task normally. Then, to be able to "pick up where it left off", the program needs to save its state to some external file which it can read back in when it is started. Otherwise, how would it know that it didn't finish the previous time?

So, I'd recommend (1) understanding what combustion's code is actually doing (printing out the password being tested inside checkPassword() should be sufficient, understanding -why- it works that way is bonus), (2) unrolling the recursion into a simple set of nested loops which accomplishes the same thing, (3) being able to save the current state of testing out to a file and successfully read it back in, (4) save the state periodically (but not on every password attempt, or you'll spend far more time updating the state than you do actually testing the current password -- maybe maintain a counter and save the state after every N checks -- then if you kill the program, it will have to back up to the last save point, but not all the way to the beginning), (5) undersstand how to pick up from a saved state and continue on correctly, and (6) don't forget to take care of the saved state when the program successfully completes so it can start again from the beginning.

While this is probably a silly amount of effort for this sample program, you'll learn a surprising amount of real-world programming skills. Good luck.

raptr_dflo
Practically a Master Poster
605 posts since Aug 2010
Reputation Points: 76
Solved Threads: 83
Skill Endorsements: 1

This article has been dead for over three months: Start a new discussion instead

Post: Markdown Syntax: Formatting Help
 
You
 
© 2013 DaniWeb® LLC
Page rendered in 0.1166 seconds using 2.73MB