2017-12-28 7 views
-2

ich ein Programm geschrieben haben, die durch die Suche Linux-System Passwörter wiederherzustellen zur Anpassung Hashes, die vorhanden sind in zwei TextdateienMatching Text von 2 Dateien

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#define MAXCHAR 1000 
//Declaring Functions to match word in file 
int matchfile(char *shadowfilename, char*hashtablefilename); 
//shadowfilename for shadow.txt hashtablefilename for hash table 
void UsageInfo(char *shadowfile, char * hashtablefile); 
//Display usage info on arguements for program 
void UsageInfo(char *shadowfile, char * hashtablefile) { 
printf("Usage: %s %s <shadowfile> <hashtable>\n", shadowfile,hashtablefile); 

} 

//main function. 
int main(int argc, char *argv[]) { 
    int result, errcode; 
    //Display format for user to enter arguements and 
    //End program if user does not enter exactly 3 arguements 
    if(argc < 3 || argc > 3) { 
     UsageInfo(argv[1],argv[2]); 
     exit(1); 
    } 


    system("cls"); 
//Pass command line arguements into searchstringinfile 
    result = matchfile(argv[1], argv[2]); 

//Display error message 
    if(result == -1) { 
     perror("Error"); 
     printf("Error number = %d\n", errcode); 
     exit(1); 
    } 
    return(0); 
} 
//Declaring Functions to match word in file 
//int matchfile(char *shadowfilename, char *hashtablefilename); 
//shadowfilename for shadow.txt hashtablefilename for hash table 

int matchfile(char *shadowfilename, char *hashtablefilename){ 

    FILE *shadowfile; 
    FILE *hashtable; 
    char strshadow[MAXCHAR]; 
    char strhash[MAXCHAR]; 


    shadowfile = fopen(shadowfilename, "r"); 
    if (shadowfile == NULL){ 
     printf("Could not open file %s",shadowfilename); 
     return 1; 
    } 


    hashtable = fopen(hashtablefilename, "r"); 
    if (hashtable == NULL){ 
     printf("Could not open file %s",hashtablefilename); 
     return 1; 
    } 

    //Getting text from the 2 files 
    while (fgets(strshadow, MAXCHAR, shadowfile) != NULL &&fgets(strhash,MAXCHAR, 
    hashtable) != NULL){ 
    printf("%s", strshadow); 
    printf("%s", strhash); 
    int linenumber = 1; 
    int search_result = 0; 
      //Matching words line-by-line 

    if((strstr(strshadow,strhash)) != NULL) { 
     //Display line in which matched word is found 
     printf("A match found on line: %d\n", linenumber); 
     printf("\n%s\n", strhash); 
     search_result++; 
    } 
    linenumber++; 
} 


fclose(shadowfile); 
return 0; 

} 

jedoch ausgelegt ist, ich bin nicht in der Lage, die beiden Hash übereinstimmen Werte in den zwei Dateien aufgrund der Zeichen vor ihnen.

hashtable.txt. Diese Datei enthält das fehlende Passwort im Klartext und entsprechende Hashwerte. Das Format ist wie folgt: (Passwort) :(hash)

banana:$1$$Tnq7a6/C1wwyKyt0V/.BP/:17482:0:99999:7::: 

shadow.txt. Diese Datei enthält den Benutzernamen des Kontos im Klartext und entsprechende Hashwerte. Das Format ist wie folgt: (Benutzer) :(hash)

pyc1:$1$$Tnq7a6/C1wwyKyt0V/.BP/:17482:0:99999:7::: 

Wie oben zu sehen ist, werden die Worte ‚Banane‘ und ‚pYc1‘ verhindern, dass das Programm vom Erfassen der beiden Hashes von detektiert wird. Kann mir jemand die Veränderungen sagen, die ich machen muss, um das zu überwinden? Danke. Edit: Geklärte Format von shadow.txt und hashtable.txt

+2

So wissen Sie, dass die ersten Buchstaben die Identitätsprüfung fehlschlagen lassen. Was hält dich davon ab, nur vom ersten ":" zu vergleichen? – Yunnosch

+0

Hallo! Es ist schön dich wiederzusehen ! Können Sie mir sagen, was ich tun kann, um dies zu vermeiden? – catmix

+2

Lösung ist einfach: erfahren Sie mehr C. Was getan werden muss, ist sehr einfach. –

Antwort

0

Die einfachste Art und Weise Zeichen in Zeichenfolge zu überspringen, bis eine bestimmte Bedingung erfüllt ist, ist:

char someString[MAXCHAR]; 

for (char* ptr = someString; *ptr != '\0'; ptr++) { 
    if (conditionIsMet(ptr)) { 
     doSomething(); 
     break; 
    } 
} 

In Ihrem Fall conditionIsMet(ptr) sein sollte *ptr zu ':' Vergleich und in diesem Fall ist der Passwort-Hash unter (ptr + 1) (Zeichenfolge beginnend mit dem nächsten Zeichen). Ich denke, dass Sie den Rest des Codes selbst schreiben können.