Problem mit XOR Operator



  • Liest, schreibst Du die EXE-Datei binary-modus? :xmas1:



  • Manchmal hilft es, die Dateien mit fopen(name, "rb") zu öffnen, "rb" statt "r" als Anweisung an die Umgebung, dass man "binär" lesen möchte. Damit schaltet man die etwaigen Verallgemeinerungen ab, die die Umgebung mit Textdateien anstellen könnte. Daran könnt's liegen.



  • µngbd schrieb:

    Manchmal hilft es, die Dateien mit fopen(name, "rb") zu öffnen, "rb" statt "r" ..

    ^^das wirds sein, kann man z.b. leicht daran erkennen, dass die neue datei kleiner oder grösser ist als das original. *fg* ansonsten, OP: zeige er den quelltext.
    🙂



  • Also erstma danke für die Antworten.
    Ich lese und schreib Binär (wb,rb).
    Hier die crypt/decrypt Funktion:

    #define XOR 10
    
    int crypt(char *str) {
       char c;
       int i,x;
    
    	   for(x=0; x<strlen(str); x++) {
    	     i = (int)str[x];
                 i = i ^ XOR;
                 c = (char)i;
    	     str[x] = c;
    	   }
    
    }
    


  • Das ist merkwürdig kompliziert (Hälfte des Quadrats der String-Länge allein für die wiederholten strlen()'s). Die Typumwandlungen kannst du genausogut implizit ablaufen lassen:

    #define XOR 10
    
    int crypt(char *str)
    {
        for ( ; *str; str++)
            *str ^= XOR;
    }
    

    Ich lese und schreib Binär (wb,rb).

    Hmm. Gib uns mal ein möglichst kurzes lauffähiges Programm zusammen mit der Eingabe, die den Fehler heraufbeschwört. Damit hätten wir's viel leichter.



  • Achja, ich hab's nicht getestet. Sonst wär mir sicher aufgefallen, dass crypt() vom Typ void sein sollte, wenn kein return drinnen steht.
    🙂



  • strlen() muß raus. Eine EXE quillt über vor Nullen. Aber bei der ersten Null ist sie noch längst nicht "zu Ende".



  • strlen() muß raus. Eine EXE quillt über vor Nullen. Aber bei der ersten Null ist sie noch längst nicht "zu Ende".

    Das klingt vernünftig. Folglich ist auch meine Funktion nicht brauchbar.

    Geh doch einfach mit getc()/putc() alle Bytes in der Datei durch. Wenn du das Ding in einen Puffer lesen und dort auf einmal XORen willst, musst du dir vernünftigerweise noch irgendwo merken, wie lang die Datei ist.
    🙂



  • Ok also das strlen ist jetzt draußen Funktionier aber leider auch nicht.
    Ich benutze immoment die Funktionen fgets() und fputs() um aus/in der Datei zu lesen/schreiben.
    Sollte ich besser getc() und putc() benutzen oder was?



  • NeedHelpWithCode schrieb:

    Ok also das strlen ist jetzt draußen Funktionier aber leider auch nicht.

    zeig doch mal den ganzen code. das werden ja wohl keine 50 zeilen sein.
    🙂



  • Das kannst du machen wie du willst. Aber zeichenweise wäre das wahrscheinlich einfacher zu formulieren:

    void crypt(FILE *in, FILE *out)
    // in und out sollten frisch geöffnet sein
    {
        int c;
        while ((c = getc(in)) != EOF)
            putc(c ^ XOR, out);
    }
    // (ungetestet)
    

    🙂



  • #define XOR 10
    
    void crypt(char *str) {
       char c;
       int i,x;
    
           for(x=0; x<strlen(str); x++) {
             i = (int)str[x];
                 i = i ^ XOR;
                 c = (char)i;
             str[x] = c;
           }
    
    }
    
    int main(int argc, char *argv[]) {
        FILE *in,*out;
        char buffer[1024];
    
    	if(argc < 2) {
    		printf("Usage: %s File Output\n",argv[0]);
    		return EXIT_FAILURE;
    	}
    
    			in = fopen(argv[1],"rb");
    				if(in == NULL) {
    					 printf("Error : Cannot open %s",argv[1]);
    					 return EXIT_FAILURE;
    				}
                out = fopen(argv[2],"wb");
    				if(out == NULL) {
    					 printf("Error : Cannot open %s",argv[3]);
    					 return EXIT_FAILURE;
    				}
    
    				while(fgets(buffer,1024,in) != NULL) {
    				    crypt(buffer);
    					fputs(buffer,out);
    				}
    
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    


  • NeedHelpWithCode schrieb:

    while(fgets(buffer,1024,in) != NULL) {
    				    crypt(buffer);
    					fputs(buffer,out);
    				}
    

    ^^fgets/fputs kannste nicht nehmen, die sind für 0-terminierte strings. nimm stattdessen 'fread' und 'fwrite'. und das 'strlen' muss auch weg. du solltest der crypt-funktion die anzahl geben, wieviel eingelesen wurde (rückgabewert von fread).
    🙂



  • Oder du nimmst meine zeichenweise Variante von crypt(FILE*, FILE*). Ist einfacher als das Herumfrickeln mit der Dateigrösse:

    int main(int argc, char *argv[])
    {
        FILE *in, *out;
        // brauche keinen Puffer
    
        if (argc < 2)
        {
            printf("Usage: %s File Output\n",argv[0]);
            return EXIT_FAILURE;
        }
    
        in = fopen(argv[1],"rb");
        if (in == NULL)
        {
            printf("Error : Cannot open %s",argv[1]);
            return EXIT_FAILURE;
        }
    
        out = fopen(argv[2],"wb");
        if (out == NULL)
        {
            printf("Error : Cannot open %s",argv[3]);
            fclose(in);   // <-- nicht vergessen!
            return EXIT_FAILURE;
        }
    
        crypt(in, out);   // meine Version von crypt, siehe oben
    
        fclose(in); fclose(out); // <-- nicht vergessen!
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    (ungetestet)
    🙂



  • Also erstmal vielen Danke.
    Habe es mit fread() und fwrite() gemacht und siehe da es geht alles perfekt.
    😃

    size =	fread(buffer,sizeof(char),1024,in);
    				    crypt(buffer,size);
    					fwrite(buffer,sizeof(char),1024,out);
    

    Läuft alles perfekt.
    😉



  • NeedHelpWithCode schrieb:

    Läuft alles perfekt.

    kann garnicht sein. den rückgabewert von fread musste noch testen (<1024 dann biste am ende der datei) und bei 'fwrite' muss 'size' statt der 1024 hin. für 'sizeof(char)' nimm einfach '1'.
    🙂


Anmelden zum Antworten