Logischer Fehler... *grmml*



  • Hallo...

    Also folgende Vorgabe für das zu codende Programm:
    "Gegeben ist ein Ordner mit n Dateien jedoch keine Unterordner. Diese Dateien sind alle Textdateien und können x Text enthalten. Das Ziel lautet, jede einzelne Datei auszulesen und darauf zu prüfen, ob diese Datei folgende strings enthält:
    + Passwort, passwort, PASSWORT
    + user, User, USER
    ...
    ...
    ...

    Wegen der Einfachkeit, kann hier auf Threads verzichtet werden, jede Datei kann der Reihe nach geöffnet werden, da sich in dem Ordner nie mehr als 100 Dateien befinden und dies in einer guten Zeit realisierbar ist."

    Ich habe mir Struktugramm usw gezeichnet und dann gecoded: Der Code:

    #include <iostream>
    #include <sys/types.h>
    #include <dirent.h>
    #include <fstream>
    
    using namespace std;
    
    DIR *dir;
    struct dirent *readdir(DIR *dir);
    struct dirent *dirzeiger;
    
    int main(int argc, char *argv[])
    {
    	string all;
    	string ne;
    	string lese;
    	int error;
    
    	if (argc < 2)
    	{
    		cout<<"Aufruf: hunter Ordner"<<endl<<"Beispiel: ./hunter /etc"<<endl<<endl;
    		return 0;
    	}
    	//Verzeichnis öffnen 
    	if((dir=opendir(argv[1])) != NULL)
    	{
    		cout<<endl<<endl;
    		//komplettes Verzeichnis Eintrag für Eintrag auslesen
    		while((dirzeiger=readdir(dir)) != NULL)
    		{
    
    			//all enthällt die Datei die im moment eingelesen wird und wird nun mit ifstream bearbeitet ;)
    			all = (*dirzeiger).d_name;
    
    			if (all != ".." && all != "." && all != "hunter.out")
    			{
    				ifstream in;
    				in.open(all.c_str(), ios::binary | ios::in);
    				while (!in.eof())
    				{
    					lese += in.get();
    				}
    				in.close();
    cout<<lese;
    				//hier hat lese den kompletten inhalt der datei!!!
    				if(strstr(lese.c_str(), "passwort") == 0 || strstr(lese.c_str(), "Passwort") == 0 || strstr(lese.c_str(), "PASSWORT") == 0 || strstr(lese.c_str(), "Pass") == 0 || strstr(lese.c_str(), "PASS") == 0 || strstr(lese.c_str(), "pass") == 0 || strstr(lese.c_str(), "pw") == 0 || strstr(lese.c_str(), "PW") == 0 || strstr(lese.c_str(), "pwd") == 0 || strstr(lese.c_str(), "PWD") == 0 || strstr(lese.c_str(), "admin") == 0 || strstr(lese.c_str(), "root") == 0 || strstr(lese.c_str(), "r00t") == 0 || strstr(lese.c_str(), "USER") == 0 || strstr(lese.c_str(), "user") == 0 || strstr(lese.c_str(), "User") == 0 || strstr(lese.c_str(), "usr") == 0 || strstr(lese.c_str(), "DB") == 0 || strstr(lese.c_str(), "db") == 0 || strstr(lese.c_str(), "ssh") == 0 || strstr(lese.c_str(), "SSH") == 0 || strstr(lese.c_str(), "login") == 0 || strstr(lese.c_str(), "Login") == 0 || strstr(lese.c_str(), "Kennwort") == 0 || strstr(lese.c_str(), "kennwort") == 0 || strstr(lese.c_str(), "telnet") == 0)
    				{
    					cout<<all<<": Nichts gefunden"<<endl;
    				}
    				else
    				{
    					cout<<all<<": Gefunden - Schreibe Output"<<endl;
    					//system("mkdir(\"/tmp/hunter\")");
    					ne = "/tmp/hunter/" + all;		
    
    					ofstream of;
    					of.open(ne.c_str(), ios::out);
    					of<<lese;
    					of.close();
    				}
    				lese = "";
    			}
    		}	
    	}
    }
    

    Das Programm tut nicht das was es soll +ggg+
    Hoffe jemand kann mir helfen, nach 3 Stunden intensiever Suche bin ich verzweifelt...



  • logicerror schrieb:

    Das Programm tut nicht das was es soll +ggg+

    Ich weis es, ich weis es: Du macht etwas falsch.

    Meine Meinung: Wer sich nciht wenigstens ansatzweise die Mühe macht den Fehler zu beschreiben hat auch keine Hilfe verdient. Und "tut nicht" ist keine Fehlerbeschreibung.

    Also WAS tut es nicht? Stürzt es ab, liefert es falsche Ergebnisse, fährt es den Rechner runter oder instaliert es selbstständig Linux?



  • hab mal kurz drüber geschaut...

    Gegeben ist: Dateiinhalt kann X Text groß sein...

    nun ist die frage ob "string" auch X Text aufnehmen kann...oder ist der inhalt begrenzt...

    nur ne vermutung:)



  • all = (*dirzeiger).d_name;

    Ich kenne mich mit dir usw. nicht aus, aber gibt .d_name nur den Namen der Datei oder den kompletten Pfad zurück? Falls es nur der Name der Datei ist und die Datei in einem anderen Ordner wie dein Programm liegt findet er sie ja nicht.

    @BorisDieKlinge: Weiszt du zufällig wieviel String aufnehmen kann? Doch quasi soviel bis der Heap voll ist, oder? Reicht das nicht?



  • hmm kann sein dachte es ist begrenzt... naja aber X ist doch unendlich, wer hat unendlich speicher?? *fg*



  • fehler schrieb:

    logicerror schrieb:

    Das Programm tut nicht das was es soll +ggg+

    Ich weis es, ich weis es: Du macht etwas falsch.

    Meine Meinung: Wer sich nciht wenigstens ansatzweise die Mühe macht den Fehler zu beschreiben hat auch keine Hilfe verdient. Und "tut nicht" ist keine Fehlerbeschreibung.

    Also WAS tut es nicht? Stürzt es ab, liefert es falsche Ergebnisse, fährt es den Rechner runter oder instaliert es selbstständig Linux?

    Tja wenn du keinen Code lesen kannst...

    Ja es stimmt, .d_name gibt nur den Namen der Datei zurück und nicht den kompletten Pfad, natürlich findet das Programm dann nur die Dateien im aktuellen Ordner aber dies ist nicht das Problem, denn ich führe das Programm auch nur in dem Ordner aus, in dem sich die Dateien befinden...

    Wenn ich es ausführe kommt immer: "Dateiname: Nichts gefunden", obwohl hier Dateien mit den zu suchenden strings im Verzeichnis sind!!! Außerdem wird auch nichts ins /tmp/hunter kopiert 😉 - was aber dann logisch ist, wenn der das Programm auch nichts findet^^



  • grmmluser schrieb:

    Tja wenn du keinen Code lesen kannst...

    Sag mal meinst Du wir sind fleischgewordene Compiler und Laufzeitumgebungen?

    Wenn ich es ausführe kommt immer: "Dateiname: Nichts gefunden", obwohl hier Dateien mit den zu suchenden strings im Verzeichnis sind!!! Außerdem wird auch nichts ins /tmp/hunter kopiert 😉 - was aber dann logisch ist, wenn der das Programm auch nichts findet^^

    Hast Du mal versucht mit einem Debugger die Schleife durchzusteppen?



  • strstr

    #include <string.h>

    char *strstr(const char *s1, const char *s2);

    Sucht einen String nach dem Vorkommen eines bestimmten Teilstrings ab.
    strstr sucht den über s1 angegebenen String nach dem ersten Vorkommen des Teilstrings s2 ab.

    Rückgabewert:
    strstr liefert einen Zeiger auf den Beginn von s2 in s1 zurück bzw. den Zeigerwert NULL, wenn s2 in s1 nicht vorkommt.

    Solltest du nicht noch einen Header einbinden?

    gruss Redo



  • Und anstelle von strstr() solltest du lieber string::find() verwenden 😉



  • bin den code mal komplett durchgegangen und habs auch etwas umgeschrieben. wenn man anstatt der relativen pfade die absoluten verwendet dann klappts! hier mal der code (klappt bei mir soweit):

    #include <iostream>
    #include <sys/types.h>
    #include <dirent.h>
    #include <fstream>
    
    //using namespace std;
    
    int main(int argc, char *argv[])
    {
        DIR *dir;
        struct dirent *dirzeiger;
    
        //lässt sich wie folgt leichter verwalten und wird übersichtlicher
        const char* look_for[]={"passwort", "Passwort", "PASSWORT", "Pass", "PASS", "pass", "pw", \
                                "PW", "pwd", "PWD", "admin", "root", "r00t", "USER", "user", "User",\
                                "usr", "DB", "db", "ssh", "SSH", "login", "Login", "Kennwort", "kennwort",\
                                "telnet", 0};
        const char** ptr;
    
        std::string path=argv[1]+std::string("\\");
        std::string file;
        std::string buf;
    
        if (argc < 2)
        {
                 return 1;
        }
    
        //Verzeichnis öffnen
        if((dir=opendir(argv[1])) != 0)
        {
            //komplettes Verzeichnis Eintrag für Eintrag auslesen
            while((dirzeiger=readdir(dir)) != 0)
            {
    
                //file enthällt die Datei die im moment eingelesen wird und wird nun mit ifstream bearbeitet ;)
                file = dirzeiger->d_name;
    
                if (file != ".." && file != "." && file != "hunter.out")
                {
                    bool found=false;
                    std::ifstream in;
                    in.open((path+file).c_str());
                    if(!in.is_open())
                        return 2;
                    //hier hat buf den kompletten inhalt der datei!!!
                    std::getline(in, buf, static_cast<char>(EOF));
                    in.close();
                    //std::cout<<buf<<std::endl;
                    ptr=look_for;
                    for( ; *ptr; ++ptr)
                    {
                         if(buf.find(*ptr)!=std::string::npos)
                         {
                              found=true;
                              std::cout<<file<<": Gefunden - Schreibe Output"<<std::endl;
                              //system("mkdir(\"/tmp/hunter\")");
                              std::ofstream of;
                              of.open((path+"hunter.out").c_str());
                              if(!of.is_open())
                                   return 3;
                              of<<buf;
                              of.close();
                         }
                    }
                    if(found==false)
                         std::cout<<file<<": Nichts gefunden"<<std::endl;                     
                }
            }   
        }
        return 0;
    }
    


  • Danke für das Code umschreiben 🙂

    Habe jetzt den Linux Rechner nicht griffbereit, werde es aber am Abend testen, "string.h" ist eigentlich inkludiert^^ k.A. wieso das beim obrigen Code nicht kopiert wurde bzw. ob ich da ne alte Version angehängt habe, was ich aber nicht denke!



  • Funktioniert leider nicht!

    Aufruf des Programmes durch:
    sudo ./hunter.out .
    (. = aktuelle Verzeichnis)

    /tmp/hunter existiert!!!



  • wozu denn <string.h> inkludieren (btw: hier gibts eh nur <cstring> was aber auch nix bringt)? hab bei meinem code wohl auch das #include <string> vergessen, der compiler hat sich aber auch nicht beschwert. und an grrrgrrr oder grgrmm: lass mal das mit dem "." weg und gibt den kompletten pfad an. wenns auch nicht klappt dann poste deinen code nochmal.



  • habe den absoluten pfad angegeben und es passiert einfach gar nichts!

    sry


Anmelden zum Antworten