Brute_Force Algorithmus



  • Da ich mich in letzter Zeit ein wenig mit Brute-Force Algo. beschäftigt habe, wollte ich natürlich eine mögliche Lösung Programmieren\Implementieren.

    Dieser Algorithmus ist mit Verschachtelten for schleifen Implementiert wie ihr sehen könnt. Auserdem hatt jede Breite sein eigenen Thread ,um die Geschwindikeit auf Multicore Cpu's zu steigern.

    Meine Frage ist nun, würde sich eine Runde auf zwei Threads verteilt lohnen, abgesehen von dem Synchronisierungs aufwand (Semaphor).?

    Hier ist der Code..

    //=========================================================================
    //
    // File    : (BF & Dictionary) Hash Cracker v1.0.7
    //
    // Author  : Lowbyte
    //                           
    // Create  : .03.2009, ,  
    //
    // Last Up : .03.2009, ,  
    //
    // Prog.L  : C
    //
    // Project : 001104N
    //
    //=========================================================================
    
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <time.h>
    #include <math.h>
    #include <stdlib.h>
    #include "console.h"
    #include "QuickHash.h"
    
    #pragma comment( lib, "QuickHashS.lib" )
    
    int DIC(void);
    int BF_(int width);
    int ML(void);
    char memory_reduction(register char a_ptr ,register char b_ptr);
    char convchartohex(register char c);
    BOOL cls();
    
    void MD2(void);void MD4(void);void MD5(void);
    void SHA1(void);void SHA2256(void);void SHA2384(void);void SHA2512(void);
    void RIPEMD128(void);void RIPEMD160(void);void RIPEMD256(void);void RIPEMD320(void);
    void PANAMA(void);void TIGER(void);
    void (*HASH[])(int z) = { MD2 ,MD4 ,MD5 ,SHA1 ,SHA2256 ,SHA2384 ,SHA2512 ,RIPEMD128 ,RIPEMD160 ,RIPEMD256 ,RIPEMD320 ,PANAMA ,TIGER };
    
    DWORD WINAPI STATUS(LPVOID ThreadIns);
    DWORD WINAPI THREAD(LPVOID r);
    
    unsigned char chartable[100];
    unsigned char *chartable0[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ ",
    							 "abcdefghijklmnopqrstuvwxyz ",
    							 "1234567890",
    							 "1234567890!\"#$%&'()*+,-./:;<=>?@[]^_`{| }",
    							 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ",
    							 "abcdefghijklmnopqrstuvwxyz!\"#$%&'()*+,-./:;<=>?@[]^_`{|} ",
    							 "abcdefghijklmnopqrstuvwxyz1234567890 "};
    
    char *Hash_Name[]={"MD2","MD4","MD5","SHA1","SHA2_256","SHA2_384","SHA2_512","RIPEMD128",
    				   "RIPEMD160","RIPEMD256","RIPEMD320","PANAMA","TIGER"};
    
    int Hash_Size[]={16,16,16,20,32,48,64,16,20,32,40,32,24};
    
    unsigned char hash_buf[250];
    unsigned char tmp_hash_buf[250];
    unsigned char table[250];
    unsigned char tmpbuf[15][250];
    unsigned char digesthex[15][250];
    unsigned char output_hash[130];
    char pw[15];
    
    HANDLE HStat;
    DWORD StatId;
    HANDLE ThreadH[15];
    DWORD ThreadID[15];
    
    int stab;
    long long count;
    long long len=0;
    int SIZEH=0;
    int DIGESTSIZE=0;
    char hashname[15];
    int modflag;
    int ctable;
    long slen;
    
    FILE *fileptr;
    
    int main()
    {
    
    	int op=0;
    
    	/* console style */
    	setColor(23);
    
    	do
    	{
    		system("title LB");
    		printf("\n - (BF & DIC) Hash Cracker v1.0.5 -\n\n");
    		printf("Options:\n");
    
    		printf("\n1. Brute-Force [ATK]");
    		printf("\n2. Dictionary [ATK]");
    		printf("\n3. Manual [ATK]");
    		printf("\n0. Exit\n\n");
    
    		printf("Input:");
    		fflush(stdin);
    		scanf("%1i" ,&op);
    
    		switch(op) {
    
    			case 1: BF();
    					break;
    			case 2: DIC();
    					break;
    			case 3: ML();
    					break;
    			case 0: return 0;
    
    		   default: printf("Wrong input !\n");
    					_sleep(2000);
    					cls();
    					break;
    		}
    		cls();
    	}
    	while(1);
    
    	return 0;
    }
    
    /* Dictionary ATK function */
    
    int DIC(void)
    {
    
    	WIN32_FIND_DATA data;
    	HANDLE h;
    	struct stat attr;
    	char tmp[126];
    	char hash_buf[250];
    	int mod;
    	size_t table_len=0;
    	size_t pass_len=0;
    	long i=0;
    	int rc=0;
    	int d_flag=0;
    	int f_flag=0;
    	int s;
    	int j ,m ,c; 
    	int flag=0;
    
    	cls();
    	printf("\nDictionary HASH CRACKER v1.05 by lb\n");
    	printf("\n");
    	printf("\n0.MD2_128  3.SHA1_128 6.SHA2_512     9.RIPEMD_256  12.TIGER_192 ");
    	printf("\n1.MD4_128  4.SHA2_256 7.RIPEMD_128  10.RIPEMD_320               ");
    	printf("\n2.MD5_128  5.SHA2_384 8.RIPEMD_160  11.PANAMA_256             \n");
    
    	printf("\nInput mod:");
    	scanf("%2i", &mod);
    
    	/* Define digest size */
    	DIGESTSIZE = Hash_Size[mod];
    
    	fflush(stdin);
    	printf("\nInput Hash:");
    	fgets(&hash_buf[0] ,130 ,stdin);
    	hash_buf[(strlen(hash_buf)-1)]='\0';
    
    	/* Memory reduction */
    	for(j=0,m=0;(j<DIGESTSIZE);j++) {
    		c = memory_reduction(hash_buf[m] ,hash_buf[m+1]);
    		tmp_hash_buf[j]=c;
    		m +=2;
    	}
    	tmp_hash_buf[DIGESTSIZE]='\0';
    
    	strcpy(&output_hash[0] ,&hash_buf[0]);
    	strcpy(hash_buf ,tmp_hash_buf);
    
    	do
    	{
    		rc=0;
    		printf("\nInput dictionary or dictionaries of the path (FQPN):");
    		fflush(stdin);
    		fgets(&table[0] ,250 ,stdin);
    		table_len=strlen(table);
    		table[(table_len)-1]='\0';
    		for(s=(int)strlen(table)-1;(s>0);s--){
    			if(table[s]=='\\'){
    				d_flag=1;
    			}
    			if(d_flag==1)
    			break;
    		}
    		if(table[strlen(table)-4] == '.'){
    			f_flag=1;
    		}
    
    		if( !((f_flag == 1) || (d_flag == 1)) ){
    			printf("wrong input !");
    			_sleep(2000);
    			cls();
    			rc=1;
    		}
    	}
    	while(rc);
    
    	if(d_flag==1) {
    
    		strcat(table ,"\\*");
    
    		h = FindFirstFile(table, &data);
    		do
    		{
    
    			if(! strcmp(data.cFileName,".") ) {
    				flag=1;
    			}
    			if(! strcmp(data.cFileName,"..") ) {
    				flag=1;
    			}
    
    			if(flag!=1) {
    
    				strcpy(&tmp[0] ,&table[0]);
    				strcpy(&tmp[strlen(tmp)-1] ,"\\");
    				strcat(tmp ,data.cFileName);
    				stat(tmp, &attr);
    
    				if(attr.st_mode & S_IFDIR ) {
    					;
    				}else if(attr.st_mode & S_IFREG) {
    
    					printf("%s\n", data.cFileName);
    					fileptr = fopen(tmp ,"r+");
    					if(fileptr==NULL){
    						printf("\nKann File nicht oeffnen / finden ...\n");
    						getchar();
    						return 0;
    					}
    
    					while( fgets(&pw[0] ,250 ,fileptr) ){
    						pass_len = strlen(&pw[0]);
    						pw[pass_len-1]='\0';
    
    						(*HASH[mod])(0);
    						i++;
    
    						if( ! strncmp(&hash_buf[0] ,&digesthex[0][0] ,DIGESTSIZE) ) {
    							printf("\nLine:%li Cracked Hash :%s - Password :%s\n",i ,&output_hash[0] , &pw[0] );
    							getchar();
    							return 0;
    						}
    
    					}
    
    					fclose(fileptr);
    				}
    
    			}
    
    		flag=0;
    
    		}
    		while( FindNextFile(h ,&data) );
    		FindClose(h);
    		printf("\nNot find ...\n");
    		_sleep(3000);
    		cls();
    
    	} else {
    		printf("%s\n", data.cFileName);
    		fileptr = fopen(table ,"r+");
    		if(fileptr==NULL){
    			printf("\nKann File nicht oeffnen / finden ...\n");
    			getchar();
    			return 0;
    		}
    
    		while( fgets(&pw[0] ,250 ,fileptr) ){
    			pass_len = strlen(&pw[0]);
    			pw[pass_len-1]='\0';
    
    			(*HASH[mod])(0);
    			i++;
    
    			if( ! strncmp(&hash_buf[0] ,&digesthex[0][0] ,DIGESTSIZE) ) {
    				printf("\nLine:%li Cracked Hash :%s - Password :%s\n",i ,&digesthex[0][0] , &pw[0] );
    				getchar();
    				return 0;
    			}
    
    		}
    
    		fclose(fileptr);
    
    		printf("\nNot find ...\n");
    		getchar();
    
    	}
    
    	return 0;
    }
    
    /* Brute-force ATK function */
    
    int BF(void)
    {
    
    	int j ,m ,c ,f ,h;
    	clock_t start, end;
    
    	/* --					       INPUT					        --*/  
    
    	cls();
    	printf("\nBRUTE-FORCE HASH CRACKER v1.07 by LB\n\n");
    
    	printf("Hash mod's:");		            printf("\t\t\tAlphabet's:\n\n");		
    
    	printf("0 -MD2       7 -RIPEMD128 ");		printf("\t0 - A-Z space\n");
    	printf("1 -MD4       8 -RIPEMD192 ");		printf("\t1 - a-z space\n");
    	printf("2 -MD5       9 -RIPEMD256 ");		printf("\t2 - 0-9\n");
    	printf("3 -SHA1     10 -RIPEMD320 ");		printf("\t3 - 0-9 sonderzeichen\n");
    	printf("4 -SHA256   11 -PANAMA    ");		printf("\t4 - A-Z a-z space\n");
    	printf("5 -SHA384   12 -TIGER     ");		printf("\t5 - a-z sonderzeichen\n");
    	printf("6 -SHA512                ");		printf("\t6 - a-z 0-9 space\n");
    
    	/* Input algorithmus mod */
    	do
    	{
    		printf("\nInput Algorithmus mod:");
    		scanf("%2i", &modflag );
    		fflush(stdin);
    		if(!(modflag < 13)) {
    			printf("\nWrong input !\n");
    			_sleep(1000);
    		}
    	}
    	while(!(modflag < 13));
    
    	/* Define digestsize */
    	strcpy(&hashname[0], Hash_Name[modflag]);
    	SIZEH=Hash_Size[modflag];
    
    	/* INPUT HASH */
    	fflush(stdin);
    	printf("\nInput Hash:");
    	fgets(&hash_buf[0] ,130 ,stdin);
    	hash_buf[(strlen(hash_buf)-1)]='\0';
    
    	/* Memory reduction */
    	for(j=0,m=0;(j<SIZEH);j++) {
    		c = memory_reduction(hash_buf[m] ,hash_buf[m+1]);
    		tmp_hash_buf[j]=c;
    		m +=2;
    	}
    	tmp_hash_buf[SIZEH]='\0';
    
    	strcpy(&output_hash[0] ,&hash_buf[0]);
    	strcpy(hash_buf ,tmp_hash_buf);
    
    	/* INPUT ALPHABET */
    	do
    	{
    		printf("\nInput Alphabet (0-6):");
    		scanf("%1i", &ctable );
    		fflush(stdin);
    		if(!(ctable < 7)) {
    			printf("\nWrong input !\n");
    			_sleep(1000);
    		}
    	}
    	while(!(ctable < 7));
    
    	/* INPUT WORD BREITE */
    	do
    	{
    
    		printf("\nInput WORD breite (MAX 15):");
    		scanf("%2i",&slen);
    		fflush(stdin);
    		if(!(slen <= 15)) {
    			printf("\nWrong input !\n");
    			_sleep(1000);
    		}
    	}
    	while(!(slen <= 15));
    
    	cls();
    	/* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
    
    	/* Copy alphabet */
    	strcpy(&chartable[0] ,chartable0[ctable]);
    
    	/* Get size of table */
    	stab = strlen(chartable);
    
    	/* Start Thread Status */
    	HStat = CreateThread(NULL ,0 ,STATUS ,(LPVOID)(long long)slen ,0 ,&StatId );
    
    	/* Zeitmessung start*/
    	start = clock();
    
    	/* Start BF Algo. */
    	for(f=0;(f<slen);f++) {
    		ThreadH[f] = CreateThread(NULL ,0 ,&THREAD ,(LPVOID) (f+1) ,0 ,&ThreadID[f]);
    	}
    
    	/* Warten auf alle Objekte */
        WaitForMultipleObjects( 
            slen,
            ThreadH,
            TRUE,
            INFINITE);
    
    	/* Zeitmessung ende */
    	end = clock();
    
    	_sleep(1111);
    	TerminateThread(HStat,0);
    	_sleep(1111);
    
    	/* Handle Release */
    	for(f=0;(f<slen);f++) {
    		CloseHandle(ThreadH[f]);
    	}
    	CloseHandle(HStat);
    
    	/* Output */
    	printf("\n\n --Process completed-- \n");
    	printf("\nAlgorithmus :%s",&hashname[0]);
    	printf("\nAlphabet:%s", &chartable[0]);
    	printf("\nWORD breite:%i",slen);
    	printf("\nCombinations:%li",count);
    	printf("\nTime:%.2fSec",(float)(end-start) / CLOCKS_PER_SEC);
    
    	count=0;
    	getchar();
    
    	return 0;
    
    }
    
    DWORD WINAPI THREAD(r)
    {
    
    	BF_(r);
    	ExitThread(0);
    }
    
    /* Round 15 */
    int BF_(int width)
    {
    	int r[15]={0};
    	register int i ,f ,d;
    	register int p=0;
    
    	for(r[0]=0;(r[0]<stab);r[0]++) {
    	  for(r[1]=0;(r[1]<stab);r[1]++) {
    		for(r[2]=0;(r[2]<stab);r[2]++) {
    		  for(r[3]=0;(r[3]<stab);r[3]++) {
    			for(r[4]=0;(r[4]<stab);r[4]++) {
    			  for(r[5]=0;(r[5]<stab);r[5]++) {
    				for(r[6]=0;(r[6]<stab);r[6]++) {
    				  for(r[7]=0;(r[7]<stab);r[7]++) {
    					for(r[8]=0;(r[8]<stab);r[8]++) {
    					  for(r[9]=0;(r[9]<stab);r[9]++) {
    						for(r[10]=0;(r[10]<stab);r[10]++) {
    						  for(r[11]=0;(r[11]<stab);r[11]++) {
    							for(r[12]=0;(r[12]<stab);r[12]++) {
    							  for(r[13]=0;(r[13]<stab);r[13]++) {
    								  for(r[14]=0;(r[14]<stab);r[14]++) {
    
    									for(f=0,d=14;(f<width);f++ ,d--){
    										tmpbuf[width-1][f]  =  chartable[r[d]];
    									}
    									tmpbuf[width-1][f]='\0';
    									//printf("%s", &tmpbuf[1][0]);
    									//getchar();
    
    									(*HASH[modflag])(width-1);
    
    									if( ! memcmp(&hash_buf[0] ,&digesthex[width-1][0],SIZEH) ) {
    										_sleep(501);
    										TerminateThread(HStat,1);
    										printf("\n\nCracked Hash :%s - Password :%s\n\n" ,&output_hash[0] , &tmpbuf[width-1][0] );
    										for(i=0;i<15;i++) {
    											if(i!=(width-1)){
    							    				TerminateThread(ThreadH[i],0);
    											}	
    										}
    
    										return 0;
    									}
    
    									count++;
    
    								  }
    								  if(width==1)
    									return 0;
    								}
    								if(width==2)
    								  return 0;
    							  }
    							  if(width==3)
    							    return 0;
    						    }
    							if(width==4)
    							  return 0;
    					      }
    						  if(width==5)
    							return 0;
    				        }
    						if(width==6)
    						  return 0;
    			          }
    					  if(width==7)
    						return 0;
    				   }
    					if(width==8)
    					  return 0;
    				  }
    				  if(width==9)
    					return 0;
    				}
    				if(width==10)
    				  return 0;
                  }
    			  if(width==11)
    				return 0;
                }
    			if(width==12)
    			  return 0;
              }
    		  if(width==13)
    			return 0;
            }
    		if(width==14)
    		  return 0;
    	  }
    
    	return 0;
    } 
    
    int ML()
    {
    	return 0;
    }
    
    /*----------------- Hash Algorithm ----------------*/
    
    void MD2(z){ SL_MD2_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void MD4(z){ SL_MD4_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void MD5(z){ SL_MD5_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void SHA1(z){ SL_SHA1_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void SHA2256(z){ SL_SHA256_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void SHA2384(z){ SL_SHA384_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void SHA2512(z){ SL_SHA512_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void RIPEMD128(z){ SL_RIPEMD128_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void RIPEMD160(z){ SL_RIPEMD160_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void RIPEMD256(z){ SL_RIPEMD256_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void RIPEMD320(z){ SL_RIPEMD320_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void PANAMA(z){ SL_PANAMA_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    void TIGER(z){ SL_TIGER_CalculateStr( &digesthex[z][0], &tmpbuf[z][0] );}
    
    /*------------------------------------------------*/
    
    DWORD WINAPI STATUS(ThreadIns)
    {
    	register int t ,x;
    	long double stat=0;
    	long double potenz=0;
    	register int r=0;
    
    	/* Set thread priority auf HIGHEST*/
    	SetThreadPriority(HStat ,THREAD_PRIORITY_HIGHEST);
    
    	/* Potenz berechnung */
    
    	for(x=ThreadIns;x>0;x--) {
    		potenz += (long long)pow((long double)strlen(chartable),(long double)x);
    	}
    
    	while(1) {
    
    		/* STATUS Output */
    		printf("\n\nProcessing %%\n\n");
    		stat = (long double)((long double) count / potenz);
    		printf("\nSTATUS %.2f%% : ", (float)(stat*100));
    		for(t=1;(t<(int)(((int)(stat*100)+1)>>1));t++) {
    			printf("%c", 219);
    		}
    
    		_sleep(1000);
    		cls();	
    
    		}
    
    	return 0;
    
    }
    
    char memory_reduction(a_ptr ,b_ptr)
    {
    	char a ,b;
    
    	a = convchartohex(a_ptr);
    	b = convchartohex(b_ptr);
    
    	return b|a<<4;
    
    }
    
    char convchartohex(register char c)
    {
    
    	if(c >= 'a' && c <= 'f'){
    		return 10 + (c - 'a');
    	}
    	if(c >= '0' && c <= '9'){
    		return c - '0';
    	}
    	return 0;
    }
    

    lowbyte



  • lowbyte schrieb:

    Meine Frage ist nun, würde sich eine Runde auf zwei Threads verteilt lohnen, abgesehen von dem Synchronisierungs aufwand (Semaphor).?

    probier's doch einfach aus (aber nur auf 'nem multicore-chip).
    🙂



  • lowbyte schrieb:

    Meine Frage ist nun, würde sich eine Runde auf zwei Threads verteilt lohnen, abgesehen von dem Synchronisierungs aufwand (Semaphor).?

    lol. mach erstmal den code hübsch.
    dann sehen wir weiter.
    das aufteilen würde ich zum beispiel so machen, daß ich auf dem toplevel pro buchstaben einen thread starte. da gibts aber viele möglichkeiten, hängt vom restlichen code ab, der nicht so bleiben soll, wie er im moment ist.
    probier doch mal, die verschachtelten schleifen duch rekursion zu ersetzen.



  • volkard schrieb:

    das aufteilen würde ich zum beispiel so machen, daß ich auf dem toplevel pro buchstaben einen thread starte.
    ...
    probier doch mal, die verschachtelten schleifen duch rekursion zu ersetzen.

    jetzt veräppel ihn doch nicht.
    🙂



  • HI

    Ach ja sorry mit euch reden bringt ja nix. cu



  • Und ja so gut bin ich auch wider um zu verstehen das er nur schwachsinn meint.
    Pro Buchstaben ein Thread.. ja genau das werde ich machen 😃 ..
    Verstehe einfach nicht warum man nicht normal disqutieren kann.
    Ich Programmiere vieleicht 1-2 Jahre C... aber egal.



  • lowbyte schrieb:

    Ach ja sorry mit euch reden bringt ja nix.

    bleib locker. volkard ist machmal ein kleiner spassvogel. das hat er bestimmt nicht böse gemeint.
    🙂



  • lowbyte schrieb:

    Und ja so gut bin ich auch wider um zu verstehen das er nur schwachsinn meint.
    Pro Buchstaben ein Thread.. ja genau das werde ich machen 😃 ..
    Verstehe einfach nicht warum man nicht normal disqutieren kann.
    Ich Programmiere vieleicht 1-2 Jahre C... aber egal.

    ähm.
    für aaaaaaaa bis azzzzzzz ein thread, für baaaaaaa bis bzzzzzz noch einer und so weiter. sind die das jetzt zu viele oder zu wenige threads?



  • Hallo lowbyte!

    Ich habe dein Problem nachvollzogen und bin zu dem Ergebnis gekommen, dass

    du scheiße bist.



  • und die ganzen schleifen, da dachte ich eher an sowas wie

    char chartable[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ "};
    
    //dieser code ersetzt ungefähr 1000 zeilen
    void PN(char* out,char* pw,char* chartable,int plen,int left)
    {
    	int r;
    	for(r=0;r<plen;++r){
    		*pw=chartable[r];
    		*(pw+1)='\0';
    		if(left==0)
    			printf("%s\n",out);
    		else
    			PN(out,pw+1,chartable,plen,left-1);
    	}
    }
    
    int main()
    {
    	char pw[9];
    	PN(pw,pw,chartable,sizeof(chartable),8);
    

    wenn du dein programm erstmal vereinfacht hast, kannste dir so richtig gut ausdenken, wo du die spaltung in threads einbauen willst. zum beispiel

    if(left==0)
    			printf("%s\n",out);
    		else if(left==6)
    			threadPN(out,pw+1,chartable,plen,left-1);
    		else
    			PN(out,pw+1,chartable,plen,left-1);
    

    startet für blöcke zu buchstabenanzahl hoch 6 einen thread. statt gleich zu starten, kannste jobs in eine warteschlange stopfen und thread pooling machen. da ist vieles möglich, aber zuerst mach alles hübscher.



  • hi problemscheisser

    Wer bist du schon,um sagen zu können das ich scheisse bin.

    lowbyte



  • Ich bin dein Vater, lowbyte.



  • ja ja ja... ich weis schon wer du bist.. nicht zu spät kommen morgen !!!!

    lowbyte



  • hi

    Ich komme von der sprache java ..also bitte ein bischen verständniss ..

    lowbyte



  • hallo

    Da ich noch nicht so geschickt bin in C kommt halt manchmal sehr langer code hinaus..
    Ich möchte halt was lehren von euch, und nicht so minderwertige kommentare hören.
    Der einzige war wider mal Volkard, er konnte mir wenigstens eine Lösung zeigen.
    Wusste ja selber das der Code zu aufgeblät ist.Aber wusste einfach nicht wie ich dies bewerkstelligen konnte.Und so scheisse wie es da einer gesagt hat ist es auch nicht.Ist halt nur viel zu viel Code !Da es doch kürzer auch geht.Ich werde ihn daher umschreiben und dem Lösungsansatz von Volk. folgen..
    Ich hoffe ich kann wenigstens mit dir(VOLKARD) auf einem anständigen Level schreiben. Da ich wie gesagt etwas Lehrnen möchte.

    lowbyte



  • Hi

    Der Code wurde nun entsprechend ersetzt...

    lowbyte



  • Ich möchte halt was lehren von euch

    😕 😃



  • lowbyte schrieb:

    Meine Frage ist nun, würde sich eine Runde auf zwei Threads verteilt lohnen, abgesehen von dem Synchronisierungs aufwand (Semaphor).?

    ja, auf jeden fall.
    ich habe mit einem dualcore mit hyperthreading, was irgendwie vier parallele threads macht, ein wenig gemwessen. gemessen habe ich, wie schnell ein projekt durchcompiliert wird.
    da waren zwei prozesse einfach doppelt so schnell wie einer. der dritte hat noch ein wenig speed gebracht. und der vierte auch. der fünfte hat noch ein ganz klein bißchen gebracht und der sechste auch. wohl, um eingabedelays abzufangen. weitere threads bis 50 brachten keine direkte änderung, aber eine leichte tendenz abwärts.



  • Hi

    Problemmudda kannst du dich ncht mal beim namen nennen ?
    Vieleicht solltest du halt einfach erwachsen werden.

    Volkard danke für dein stat. werde mich mal dahintersetzen ,abends.

    thx
    lowbyte



  • Helo Volkard

    Das war dein Code.

    int main()
    {
    BFP(pw,pw,chartable,strlen(chartable),8);

    ...
    }

    int BFP(char* out,char* pw,char* chartable,int plen,int left)
    {
    int r;
    for(r=0;r<plen;++r){
    *pw=chartable[r];
    *(pw+1)='\0';
    if(left==0) {

    (*HASH[modflag])();
    count++;

    if( ! memcmp(&hash_buf[0] ,&digesthex[0] ,SIZEH) ) {
    _sleep(1000);
    TerminateThread(HStat,1);
    printf("\n\nCracked Hash :%s - Password :%s\n\n" ,&output_hash[0] , &out[0] );
    getchar();
    return 0;
    }

    } else {
    BFP(out,pw+1,chartable,plen,left-1);
    }
    }

    }

    meine Zeilen unterscheiden sich zu deinen nur in 2 Sachen. Ich übergebe der Funktion beim aufruf nur die String-länge ohne wie bei dir mit \0 Terminierung. Dadurch erreiche ich ja das ich nur auf die breite berechne. Und sommit in einer forschleife jede breite einzeln aufrufen muss, um alle kombinationen zu erreichen.
    Habe ein bisschen rumprobiert, und festgestellt das meine implement. um 30% schneller ist. Das liegt aber sicher daran das deine Idee
    mit einem einzigen aufruf ,nach 10 outputs ein bad char erzeugt..und sommit mehr Zeichen als nötig erzeugt.zbp. breite 2 wären 110 combinationen.Doch bei dir ergibts 121.?
    Doch ich bleibe bei meiner funktion. Eine Funktionsaufruf pro Breite .. da ich ja sowiso mit threads Arbeite will.
    Und so siehts aus:

    int main(){
    
       for(f=1;(f<=slen);f++) {
           BFP(pw,pw,chartable,strlen(chartable),f-1);
       }
    ..
    ..
    }
    
    int BFP(char* out,char* pw,char* chartable,int plen,int left)
    {
        int r;
    	int var=0;
        for(r=0;r<plen;r++){
            *pw=chartable[r];
            *(pw+1)='\0';
    		if(left==0) {
    
    			(*HASH[modflag])();
    			count++;
    
    			if( ! memcmp(&hash_buf[0] ,&digesthex[0] ,SIZEH) ) {
    				_sleep(1000);
    				TerminateThread(HStat,1);
    				printf("\n\nCracked Hash :%s - Password :%s\n\n" ,&output_hash[0] , &out[0] );
    				getchar();
    				return 0;
    			}
    
    			} else {
    		        BFP(out,pw+1,chartable,plen,left-1);
    			}
        }
    
    }
    

    Jetz werde ich mal eine Version mit Threads erarbeiten.. und dan mal Posten ..dan bist du gefragt Volkard 😉 feinschliff oder ergänzung.

    lowbyte


Anmelden zum Antworten