PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] MD5-Cracker



Bonkers
26.05.2010, 16:58
Hey,
Ich gebe es zu : Ich musste mit mir selbst ringen um den Code hier einzustellen, weil ich eigentlich keine Lust auf die Slaps der C-Gurus hatte ;)
Ich sollte vielleicht dazu sagen dass ich eine lange Zeit nichts mit C gemacht habe, und meine Fähigkeiten auch vorher immer nur Situationsbedingt genutzt wurden... Halt um mal schnell was "zusammenzupanschen".
Ich möchte die Leute mit mehr C-Erfahrung als Ich selbst dazu aufrufen den Code zu kommentieren und mir zu helfen, meine Formfehler zu finden (Das Tool funktioniert tadellos, aber ich bin mir sicher dass da einige Sachen vorkommen die einem Experten unschön aufstoßen werden ;) ).

Hier der Code:




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "md5.h"

void btf(int size, int pos, char curr[]);
int match(char* solution, char* testagainst);
void parse_arg( int argc, char *argv[] );

char* crackme;

int main( int argc, char *argv[] ) {
parse_arg(argc, argv);
printf("\nNow trying to crack %s\n\n", crackme);
int size;
for(size=1; size < 8; size++) {printf("-> Setting new Size to %i\n", size); btf(size,0,"");}
return 0;
}

void btf(int size, int pos, char curr[]) {
char* charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
int i;
if(pos < size){
for(i=0; i<strlen(charset);i++){
char test[strlen(curr) + 2];
strcpy(test, curr);
int len = strlen(test);
test[len] = charset[i];
test[len+1] = '\0';
btf(size, pos+1, test);
}} else {
if(match(crackme, curr) == 1) {
printf("Your Hash has been Cracked. md5( %s ) == %s\n", curr, crackme);
exit(0);
}
}
}

int match(char* solution, char* testagainst) {
char const* test = testagainst;
md5_state_t state;
md5_byte_t digg[16];
char hex_pres[33];
int coi;
md5_init(&state);
md5_append(&state, (const md5_byte_t *)test, strlen(test));
md5_finish(&state, digg);
for (coi = 0; coi < 16; ++coi) {
sprintf(hex_pres + coi * 2, "%02x", digg[coi]);
}
if(strcmp(solution,hex_pres) == 0) { return 1; } else { return 0; }
}

void parse_arg( int argc, char *argv[] ) {
printf("\t----------------------------\n");
printf("\t| Simple MD5-Cracker in C |\n");
printf("\t| |\n");
printf("\t| Written by Bonkers |\n");
printf("\t| |\n");
printf("\t| Stolen by [YourNameHere] |\n");
printf("\t| |\n");
printf("\t----------------------------\n");
if( argc != 2 || strlen(argv[1]) != 32) {
printf("Usage : ./BTF {MD5-HASH}\n\n");
exit(0);
} else { crackme = argv[1]; }
}




Und ein Beispiel-Output:



[user@archery Debug]$ ./BTF 7d578bb564c511ca301f558528bde644
----------------------------
| Simple MD5-Cracker in C |
| |
| Written by Bonkers |
| |
| Stolen by [YourNameHere] |
| |
----------------------------

Now trying to crack 7d578bb564c511ca301f558528bde644

-> Setting new Size to 1
-> Setting new Size to 2
-> Setting new Size to 3
-> Setting new Size to 4
Your Hash has been Cracked. md5( AAAB ) == 7d578bb564c511ca301f558528bde644



Die md5.h + md5.c finden sich hier: http://www.file-upload.net/download-2548054/md5.tar.gz.html

td0s
26.05.2010, 19:53
Hab es mal getestet, aus welchem Grund auch immer hat es nicht funktioniert?!? :D

Bonkers
26.05.2010, 19:55
Du musst auch die beiden Dateien aus dem Link am Ende herunterladen und mitcompilen damit es funktioniert.
Beim nächsten mal solltest du im Post schreiben wo das Problem liegt :)

td0s
26.05.2010, 19:57
Ich dachte das Problem hätte wir bereits in ICQ geklärt als du mir befohlen hattest das Teil zu testen ;)

EDIT://
Bitte mal einen anderen Hoster nehmen, ich bekomme immer einen MySQL-Error wenn ich versuche das gewünschte File herunterzuladen.

Hm... jetzt gehts vorher kam immer das:

http://img580.imageshack.us/img580/7024/bildschirmfotoe.png

Cristhecrusader
26.05.2010, 20:02
kannst die header auch hier reinstellen?

Interceptor
26.05.2010, 20:07
Hey,

Hab auf die Schnelle folgendes gefunden:


void btf(int size, int pos, char curr[]) {
char* charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
int i;
if(pos < size){
for(i=0; i<strlen(charset);i++) //Evtl. strlen(charset) durch 35 ersetzen
{
char test[strlen(curr) + 2];
strcpy(test, curr);
int len = strlen(test);
test[len] = charset[i];
test[len+1] = '\0';
btf(size, pos+1, test);
}} else {
if(match(crackme, curr) == 1) {
printf("Your Hash has been Cracked. md5( %s ) == %s\n", curr, crackme);
exit(0);
}
}
}

Hoffe das stimmt auch. Sollte ich mehr finden editiere ich rein.

PS: Meinst du auch Code Formatierung?

MfG Interceptor

Bonkers
26.05.2010, 20:23
//Evtl. strlen(charset) durch 35 ersetzen

Aber dann kann man das Charset ja nicht mehr so easy anpassen?


Meinst du auch Code Formatierung?

Ne das hat eh Eclipse gebaut ;)


kannst die header auch hier reinstellen?

Siehe den Link am Ende. Die anderen Header solltest du haben.

Interceptor
26.05.2010, 20:44
Naja man muss sich halt die Mühe machen und die Zeichen des Charsets abzählen.
Ansonsten steht dem nichts im Wege.
Ist aber wie gesagt nur eine kleine Schönheitskorrektur, kannst auch strlen() lassen.

Schön formatiert hätte ich das Ganze hier herumliegen, habe mir vorher die Arbeit gemacht, wenn du willst uppe ich mal.

MfG Interceptor

Bonkers
29.05.2010, 09:38
Jo, poste das ganze doch einfach mal in einen Code-Spoiler, muss ja kein 1-Click-Hoster sein ;)

Interceptor
03.06.2010, 18:54
Hier, bitte


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "md5.h"

void btf(int size, int pos, char curr[]);
int match(char* solution, char* testagainst);
void parse_arg( int argc, char *argv[] );

char* crackme;

int main( int argc, char *argv[] )
{
int size;

parse_arg(argc, argv);
printf("\nNow trying to crack %s\n\n", crackme);

for(size=1; size < 8; size++)
{
printf("-> Setting new Size to %i\n", size);
btf(size,0,"");

}

return 0;
}

void btf(int size, int pos, char curr[])
{
char* charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
int i;

if(pos < size)
{
for(i=0; i<35 ;i++)
{
char test[strlen(curr) + 2];
int len;

strcpy(test, curr);
len = strlen(test);

test[len] = charset[i];
test[len+1] = '\0';
btf(size, pos+1, test);
}
}

else
{
if(match(crackme, curr) == 1)
{
printf("Your Hash has been Cracked. md5( %s ) == %s\n", curr, crackme);
exit(0);
}
}
}

int match(char* solution, char* testagainst)
{
char const* test = testagainst;
char hex_pres[33];
int coi;
md5_state_t state;
md5_byte_t digg[16];

md5_init(&state);
md5_append(&state, (const md5_byte_t *)test, strlen(test));
md5_finish(&state, digg);

for (coi = 0; coi < 16; ++coi)
{
sprintf(hex_pres + coi * 2, "%02x", digg[coi]);
}

if(strcmp(solution,hex_pres) == 0)
{
return 1;
}

else
{
return 0;
}
}

void parse_arg( int argc, char *argv[] )
{
printf("\t----------------------------\n");
printf("\t| Simple MD5-Cracker in C |\n");
printf("\t| |\n");
printf("\t| Written by Bonkers |\n");
printf("\t| |\n");
printf("\t| Stolen by [YourNameHere] |\n");
printf("\t| |\n");
printf("\t----------------------------\n");

if( argc != 2 || strlen(argv[1]) != 32)
{
printf("Usage : ./BTF {MD5-HASH}\n\n");
exit(0);
}

else
{
crackme = argv[1];
}
}

MfG Interceptor