From d13912cc897d35b4d9dad4d3e094a48aae17a2f3 Mon Sep 17 00:00:00 2001 From: aneesh <achattaraj@student.unimelb.edu.au> Date: Fri, 24 May 2019 19:52:16 +1000 Subject: [PATCH] yoooo --- crack.c | 823 ++++++++++++++++++++++++++++++------------------------ crack.exe | Bin 142270 -> 141776 bytes 2 files changed, 459 insertions(+), 364 deletions(-) diff --git a/crack.c b/crack.c index ce93287..c8b1e2b 100644 --- a/crack.c +++ b/crack.c @@ -7,440 +7,535 @@ #include "sha256.h" #include "sha256.c" #include <stdbool.h> -int exist[30]; + int exist[30]; BYTE old[6]; -int count=0; +int count = 0; +void makeguess(char * word_list, int hashes[][32],int a); -void printRandomString(int hashes[30][32]) -{ bool cracked = true; -SHA256_CTX ctx; - +void printRandomString(int hashes[30][32]) { + bool cracked = true; + SHA256_CTX ctx; - BYTE buffer[SHA256_BLOCK_SIZE]; - - for (int i = 0; i < 100000000000000000; ++i) { - if (count=30) - { - break; - } + BYTE buffer[SHA256_BLOCK_SIZE]; + + for (int i = 0; i < 100000000000000000; ++i) { + if (count == 30) { + break; + } BYTE res[6]; - for (int j = 0; j < 6; j++) - res[j] = (rand()% 26)+97;; - res[6]='\0'; - sha256_init(&ctx); - sha256_update(&ctx, res, sizeof(res)); - sha256_final(&ctx, buffer); - - for(int k=10; k<30; k++){ - - cracked = true; - for(int a=0; a<32; a++){ - if( buffer[a] != hashes[k][a] ){ - - cracked=false; - break; - } - } - if( cracked==true && exist[k+1]!=1 ){ - ctx.data[6] = '\0'; - exist[k+1]=1; - ++count; - printf("%s %d\n", ctx.data, k+1); - } - } + for (int j = 0; j < 6; j++) + res[j] = (rand() % 26) + 97;; + res[6] = '\0'; + sha256_init( & ctx); + sha256_update( & ctx, res, sizeof(res)); + sha256_final( & ctx, buffer); + + for (int k = 10; k < 30; k++) { + cracked = true; + for (int a = 0; a < 32; a++) { + if (buffer[a] != hashes[k][a]) { - } + cracked = false; + break; + } + } + if (cracked == true && exist[k + 1] != 1) { + ctx.data[6] = '\0'; + exist[k + 1] = 1; + ++count; + printf("%s %d\n", ctx.data, k + 1); + } + } + + } } -void variations(char *word_list_file, int hashes[30][32]) -{ +void variations(char * word_list_file, int hashes[30][32]) { SHA256_CTX ctx; - BYTE buffer[SHA256_BLOCK_SIZE]; - BYTE password[6]; - bool cracked = true; - - FILE *word_list; - word_list=fopen(word_list_file, "rb"); + BYTE buffer[SHA256_BLOCK_SIZE]; + BYTE password[6]; + bool cracked = true; - while ( fgets(password, 7, word_list) != '\0'){ - if (count==30) - { - break; - } + FILE * word_list; + word_list = fopen(word_list_file, "rb"); - for (int c = 0; c < 6; ++c) - { BYTE password1[6]; - for (int i = 0; i < 6; ++i) - { - if (i==c) - { - - if (password[c]>=65 && password[c]<90) - { - password1[c]=password[c]+32; - } - else if (password[c]>=97 && password[c]<123) - { - password1[c]=password[c]-32; - } - else{ - password1[c]=password[c]; - } + while (fgets(password, 7, word_list) != '\0') { + if (count == 30) { + break; + } + + for (int c = 0; c < 6; ++c) { + BYTE password1[6]; + for (int i = 0; i < 6; ++i) { + if (i == c) { + + if (password[c] >= 65 && password[c] < 90) { + password1[c] = password[c] + 32; + } else if (password[c] >= 97 && password[c] < 123) { + password1[c] = password[c] - 32; + } else { + password1[c] = password[c]; } - else{ - password1[i]=password[i]; - } + } else { + password1[i] = password[i]; + } + } + password1[6] = '\0'; + + sha256_init( & ctx); + sha256_update( & ctx, password1, sizeof(password1)); + sha256_final( & ctx, buffer); + + for (int j = 10; j < 30; j++) { + + cracked = true; + for (int i = 0; i < 32; i++) { + if (buffer[i] != hashes[j][i]) { + + cracked = false; + break; } - password1[6]='\0'; - - - sha256_init(&ctx); - sha256_update(&ctx, password1, sizeof(password1)); - sha256_final(&ctx, buffer); - - for(int j=10; j<30; j++){ - - cracked = true; - for(int i=0; i<32; i++){ - if( buffer[i] != hashes[j][i] ){ - - cracked=false; - break; - } - } - if( cracked==true && exist[j+1]!=1){ - ctx.data[6] = '\0'; - exist[j+1]=1; - count++; - printf("%s %d\n", ctx.data, j+1); - } } - + if (cracked == true && exist[j + 1] != 1) { + ctx.data[6] = '\0'; + exist[j + 1] = 1; + count++; + printf("%s %d\n", ctx.data, j + 1); + } } - - } + } - + } + fclose(word_list); } -void printRandomString1(int k) -{ - - for (int i = 0; i < k-1; ++i) { +void printRandomString1(int k) { + + for (int i = 0; i < k - 1; ++i) { BYTE res[6]; - for (int j = 0; j < 6; j++) - res[j] = (rand()% 59)+65;; - res[6]='\0'; - printf("%s\n",res ); -} + for (int j = 0; j < 6; j++) + res[j] = (rand() % 59) + 65;; + res[6] = '\0'; + printf("%s\n", res); + } } - -void bruteforce(int hashes[30][32]){ - SHA256_CTX ctx; - BYTE buffer[SHA256_BLOCK_SIZE]; - BYTE password[4]; - bool cracked = true; - - - for(int c1=32; c1<127; c1++){ - password[0] = c1; - if( count == 10 ) break; - for(int c2=32; c2<127; c2++){ - password[1] = c2; - if( count == 10 ) break; - for(int c3=32; c3<127; c3++){ - password[2] = c3; - if( count == 10 ) break; - for(int c4=32; c4<127; c4++){ - if( count == 10 ) break; - password[3] = c4; - password[4] = '\0'; - - - sha256_init(&ctx); - sha256_update(&ctx, password, sizeof(password)); - sha256_final(&ctx, buffer); - - for(int i=1; i<11; i++){ - cracked = true; - for(int j=0; j<32; j++){ - if( buffer[j] != hashes[i][j] ){ - cracked = false; - break; - } - } - if(cracked==true){ - count++; - ctx.data[4] = '\0'; - printf("%s %d\n", ctx.data, i); - } - } - } - } +void bruteforce(int hashes[30][32]) { + SHA256_CTX ctx; + BYTE buffer[SHA256_BLOCK_SIZE]; + BYTE password[4]; + bool cracked = true; + + for (int c1 = 32; c1 < 127; c1++) { + password[0] = c1; + if (count == 10) break; + for (int c2 = 32; c2 < 127; c2++) { + password[1] = c2; + if (count == 10) break; + for (int c3 = 32; c3 < 127; c3++) { + password[2] = c3; + if (count == 10) break; + for (int c4 = 32; c4 < 127; c4++) { + if (count == 10) break; + password[3] = c4; + password[4] = '\0'; + + sha256_init( & ctx); + sha256_update( & ctx, password, sizeof(password)); + sha256_final( & ctx, buffer); + + for (int i = 1; i < 11; i++) { + cracked = true; + for (int j = 0; j < 32; j++) { + if (buffer[j] != hashes[i][j]) { + cracked = false; + break; + } + } + if (cracked == true) { + count++; + ctx.data[4] = '\0'; + printf("%s %d\n", ctx.data, i); + } + } } + } } + } } // C program to print all permutations with duplicates allowed /* Function to swap values at two pointers */ -void swap(char *x, char *y) -{ - char temp; - temp = *x; - *x = *y; - *y = temp; -} +void swap(char * x, char * y) { + char temp; + temp = * x; + * x = * y; + * y = temp; +} /* Function to print permutations of string This function takes three parameters: 1. String 2. Starting index of the string 3. Ending index of the string. */ -void permute(char *a, int l, int r,int hashes[30][32],int status) -{ SHA256_CTX ctx; - BYTE buffer[SHA256_BLOCK_SIZE]; - bool cracked = true; - int count1 = 0; - char word[30]; - -int i; -if (l == r) - { if(status!=2){ - BYTE n[6]; - for (int k = 0; k < 6; ++k) - { - n[k]=a[k]; +void permute(char * a, int l, int r, int hashes[30][32], int status) { + SHA256_CTX ctx; + BYTE buffer[SHA256_BLOCK_SIZE]; + bool cracked = true; + int count1 = 0; + char word[30]; + + int i; + if (l == r) { + if (status != 2) { + BYTE n[6]; + for (int k = 0; k < 6; ++k) { + n[k] = a[k]; - } - n[6]='\0'; - sha256_init(&ctx); - sha256_update(&ctx, n, sizeof(n)); - sha256_final(&ctx, buffer); + } + n[6] = '\0'; + sha256_init( & ctx); + sha256_update( & ctx, n, sizeof(n)); + sha256_final( & ctx, buffer); - for(int j=10; j<30; j++){ - - cracked = true; - for(int i=0; i<32; i++){ - if( buffer[i] != hashes[j][i] ){ - - cracked=false; - break; - } - } - if( cracked==true && exist[j+1]!=1){ - ctx.data[6] = '\0'; - exist[j+1]=1; - printf("%s %d\n", ctx.data, j+1); - } + for (int j = 10; j < 30; j++) { + + cracked = true; + for (int i = 0; i < 32; i++) { + if (buffer[i] != hashes[j][i]) { + + cracked = false; + break; + } + } + if (cracked == true && exist[j + 1] != 1) { + ctx.data[6] = '\0'; + exist[j + 1] = 1; + printf("%s %d\n", ctx.data, j + 1); } - }else{BYTE n[6]; - int count1=0; - for (int k = 0; k < 6; ++k) - { - n[k]=a[k]; - if (old[k]==n[k]) - { - ++count1; } + } else { + BYTE n[6]; + int count1 = 0; + for (int k = 0; k < 6; ++k) { + n[k] = a[k]; + if (old[k] == n[k]) { + ++count1; + } - } + } - n[6]='\0'; - if(count1<6) - { - printf("%s\n",n ); - for (int k = 0; k < 7; ++k) - { - old[k]=n[k]; + n[6] = '\0'; + if (count1 < 6) { + printf("%s\n", n); + for (int k = 0; k < 7; ++k) { + old[k] = n[k]; + + } + } } + } else { + for (i = l; i <= r; i++) { + swap((a + l), (a + i)); + permute(a, l + 1, r, hashes, status); + swap((a + l), (a + i)); //backtrack } - - }} -else -{ - for (i = l; i <= r; i++) - { - swap((a+l), (a+i)); - permute(a, l+1, r,hashes,status); - swap((a+l), (a+i)); //backtrack - } -} -} + } +} /* Driver program to test above functions */ -void permutations1(char *word_list_file, int hashes[30][32],int status) -{ - SHA256_CTX ctx; - BYTE buffer[SHA256_BLOCK_SIZE]; - BYTE password[12]; - bool cracked = true; - - char word[30]; +void permutations1(char * word_list_file, int hashes[30][32], int status) { + SHA256_CTX ctx; + BYTE buffer[SHA256_BLOCK_SIZE]; + BYTE password[12]; + bool cracked = true; + char word[30]; - FILE *word_list; - word_list=fopen(word_list_file, "rb"); + FILE * word_list; + word_list = fopen(word_list_file, "rb"); - + while (fgets(password, 7, word_list) != '\0') { - while ( fgets(password, 7, word_list) != '\0'){ - - for (int i = 6; i < 12; ++i) - { - if (password[i-6]>=65 && password[i-6]<90) - { - password[i]=password[i-6]+32; - } - else - { - password[i]=password[i-6]-32; - } - - } + for (int i = 6; i < 12; ++i) { + if (password[i - 6] >= 65 && password[i - 6] < 90) { + password[i] = password[i - 6] + 32; + } else { + password[i] = password[i - 6] - 32; + } - password[12]='\0'; - - permute(password,0,11,hashes,status); + } -} + password[12] = '\0'; + + permute(password, 0, 11, hashes, status); + + } + fclose(word_list); } -void crack6(char *word_list_file, int hashes[30][32]) -{ - SHA256_CTX ctx; - BYTE buffer[SHA256_BLOCK_SIZE]; - BYTE password[6]; - bool cracked = true; - - char word[30]; +void crack6(char * word_list_file, int hashes[30][32]) { + SHA256_CTX ctx; + BYTE buffer[SHA256_BLOCK_SIZE]; + BYTE password[6]; + bool cracked = true; + char word[30]; - FILE *word_list; - word_list=fopen(word_list_file, "rb"); + FILE * word_list; + word_list = fopen(word_list_file, "rb"); - while ( fgets(password, 7, word_list) != '\0'){ - - password[6]='\0'; - sha256_init(&ctx); - sha256_update(&ctx, password, sizeof(password)); - sha256_final(&ctx, buffer); - for(int j=10; j<30; j++){ - - cracked = true; - for(int i=0; i<32; i++){ - if( buffer[i] != hashes[j][i] ){ - - cracked=false; - break; - } - } - if( cracked==true && exist[j+1]!=1 ){ - ctx.data[6] = '\0'; - exist[j+1]=1; - ++count; - printf("%s %d\n", ctx.data, j+1); - } - } - } + while (fgets(password, 7, word_list) != '\0') { + + password[6] = '\0'; + sha256_init( & ctx); + sha256_update( & ctx, password, sizeof(password)); + sha256_final( & ctx, buffer); + for (int j = 10; j < 30; j++) { + + cracked = true; + for (int i = 0; i < 32; i++) { + if (buffer[i] != hashes[j][i]) { + + cracked = false; + break; + } + } + if (cracked == true && exist[j + 1] != 1) { + ctx.data[6] = '\0'; + exist[j + 1] = 1; + ++count; + printf("%s %d\n", ctx.data, j + 1); + } + } + } + fclose(word_list); } +int main(int argc, char * argv[]) { + int status = argc; + int hashes[30][32]; - int main(int argc, char *argv[]){ - int status=argc; - int hashes[30][32]; - - if(argc==1) - { + if (argc == 1) { unsigned char buff[320]; int hashes[30][32]; - FILE *file_4, *file_6; - int i,a=0,b=0; - file_4=fopen("pwd4sha256", "rb"); - - fread(buff,sizeof(buff),1,file_4); - - - for(i = 0; i<320; i++){ - if(i%32==0){ - a++; - b=0; - } - hashes[a][b]=buff[i]; - b++; - } - - bruteforce(hashes); - unsigned char buff6[640]; - file_6=fopen("pwd6sha256","rb"); - fread(buff6, sizeof(buff6),1, file_6); - for(i=0,a=9; i<640;++i) - { - if(i%32 == 0){ - a++; - b=0; - printf("\n"); - } - hashes[a][b]=buff6[i]; - - - b++; - } - crack6("100k_passwords.txt",hashes); - variations("common_passwords1.txt",hashes); - printRandomString(hashes); - - - - - + FILE * file_4, * file_6; + int i, a = 0, b = 0; + file_4 = fopen("pwd4sha256", "rb"); + + fread(buff, sizeof(buff), 1, file_4); + + for (i = 0; i < 320; i++) { + if (i % 32 == 0) { + a++; + b = 0; + } + hashes[a][b] = buff[i]; + b++; + } + + bruteforce(hashes); + unsigned char buff6[640]; + file_6 = fopen("pwd6sha256", "rb"); + fread(buff6, sizeof(buff6), 1, file_6); + for (i = 0, a = 9; i < 640; ++i) { + if (i % 32 == 0) { + a++; + b = 0; + + } + hashes[a][b] = buff6[i]; + + b++; + } + crack6("100k_passwords.txt", hashes); + variations("common_passwords1.txt", hashes); + printRandomString(hashes); fclose(file_4); fclose(file_6); -} -if (argc==2) -{ - int k= atoi(argv[1]); - printf("%d\n",k ); - printRandomString1(k); + } + if (argc == 2) { + int k = atoi(argv[1]); + printf("%d\n", k); + printRandomString1(k); + + } + if (argc == 3) { + FILE * password_file; + password_file = fopen(argv[1], "rb"); + char word[10000]; + + int i, a = 0, b = 0; + fseek(password_file, 0L, SEEK_END); + int sz = ftell(password_file); + + rewind(password_file); + int hashes[sz / 32][32]; + unsigned char buff[sz]; + fread(buff, sizeof(buff), 1, password_file); + for (i = 0; i < sz; i++) { + if (i % 32 == 0) { + a++; + b = 0; + } -} -if (argc==3) -{ - FILE *password_file,*word_list_file; - password_file=fopen(argv[1],"rb"); - word_list_file=fopen(argv[2],"rb"); - int i,a=0,b=0; - fseek(password_file, 0L, SEEK_END); - int sz = ftell(password_file); - - rewind(password_file); - int hashes[sz/32][32]; - unsigned char buff[sz]; - fread(buff,sizeof(buff),1,password_file); - for(i = 0; i<sz; i++){ - if(i%32==0){ - a++; - b=0; - printf("\n"); - } - - hashes[a][b]=buff[i]; - - b++; - } - crack6(argv[2],hashes); - variations("common_passwords1.txt",hashes); - + hashes[a][b] = buff[i]; + + b++; + } + + makeguess(argv[2], hashes, a); + } + return 0; } - return 0; +void makeguess(char * word_list, int hashes[][32], int a) { + SHA256_CTX ctx; + BYTE buffer[SHA256_BLOCK_SIZE]; + BYTE word[10000]; + FILE * fp; + int j=0; + char c; + fp = fopen(word_list, "rb"); + int len=0; + bool cracked=true; + int exist[a]; + + while((c = fgetc(fp)) != EOF) + { + if(c == '\n') + { + + word[len]='\0'; + + sha256_init( & ctx); + sha256_update( & ctx, word, len); + sha256_final( & ctx, buffer); + + for (int j = 0; j < a; j++) { + + cracked = true; + for (int i = 0; i < 32; i++) { + if (buffer[i] != hashes[j][i]) { + + cracked = false; + break; + } + } + if (cracked == true && exist[j + 1] != 1) { + ctx.data[6] = '\0'; + exist[j+1]=1; + ++count; + printf("%s %d\n", ctx.data,j+1); + } + } + for (int k = 0; k < len; ++k) { + BYTE password1[len-1]; + for (int l = 0; l < len; ++l) { + if (k == l) { + + + if (word[k] >= 65 && word[k] < 90) { + password1[k] = word[k] + 32; + } else if (word[k] >= 97 && word[k] < 123) { + password1[k] = word[k] - 32; + } else { + password1[k] = word[k]; + } + } else { + password1[l] = word[l]; + } + } + password1[len] = '\0'; + + + sha256_init( & ctx); + sha256_update( & ctx, password1, len); + sha256_final( & ctx, buffer); + + for (int j = 0; j < a; j++) { + + cracked = true; + for (int i = 0; i < 32; i++) { + if (buffer[i] != hashes[j][i]) { + + cracked = false; + break; + } + } + if (cracked == true && exist[j + 1] != 1) { + ctx.data[6] = '\0'; + exist[j + 1] = 1; + count++; + printf("%s %d\n", ctx.data, j + 1); + } + } + + } + for (int k = 0; k < len; ++k) { + BYTE password1[len-1]; + for (int l = 0; l < len; ++l) { + if (k == l) { + + + if (word[k] >= 65 && word[k] < 90) { + password1[k] = word[k] + 32; + } else if (word[k] >= 97 && word[k] < 123) { + password1[k] = word[k] - 32; + } else { + password1[k] = word[k]; + } + } else { + password1[l] = word[l]; + } + } + password1[len] = '\0'; + password1[0] = password1[0] - 32; + + + sha256_init( & ctx); + sha256_update( & ctx, password1, len); + sha256_final( & ctx, buffer); + + for (int j = 0; j < a; j++) { + + cracked = true; + for (int i = 0; i < 32; i++) { + if (buffer[i] != hashes[j][i]) { + + cracked = false; + break; + } + } + if (cracked == true && exist[j + 1] != 1) { + ctx.data[6] = '\0'; + exist[j + 1] = 1; + count++; + printf("%s %d\n", ctx.data, j + 1); + } + } + + } + len=0; + + } + else + { + word[len]=c; + ++len; + } + } + + + + } \ No newline at end of file diff --git a/crack.exe b/crack.exe index 6c5299eeb54ca9f5415cf4816ee1aef7e63e2a54..a3817294e441f955c9f0db15c9c3d71958c828ac 100644 GIT binary patch delta 11117 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 HNkSR`!QTM5 delta 11545 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 -- GitLab