[C/C++] Problem und Fragen zur XOR Encrytption

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von IronSnake, 31. August 2008 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 31. August 2008
    Problem und Fragen zur XOR Encrytption

    Hallo,
    ich versuche mich jetzt seit einigen Stunden bissel mit der XOR En/Decryption auseinander zu setzen. Als Beispielprogramm habe ich mir ne Source zu einem "Firefox Password Decryptor" genommen. Allerdings kann ich da einige Programmroutinen nachvollziehen.

    Also dies ist der Code für die Entschlüsselungsroutine:
    Code:
    char *Xor_(char *pInput)
    {
     int Length = lstrlenA(pInput);
     for (int i = 0; i < Length; i++)
     pInput[i] ^= 0x0fa1c0;
     return pInput;
    }
    Klingt eigendlich ganz verständlich. Der Inhalt der Variable "pInput" wird mit dem "key" 0x0fa1c0 entschlüsselt. Im Hauptprgramm sieht dsa ganze dann so aus...

    Code:
     lstrcatA(ProfilePath, /*"\\Mozilla\\Firefox\\profiles.ini"*/Xor_("\x9C\x9C\x8D\xAF\xBA\xA9\xAC\xAC\xA1\x9C\x9C\x86\xA9\xB2\xA5\xA6\xAF\xB8\x9C\x9C\xB0\xB2\xAF\xA6\xA9\xAC\xA5\xB3\xEE\xA9\xAE\xA9"));
    Demnach wird also die Funktion mit dem Inhalt "\x9c\x9c\......."an XOR weitergegeben und entschlüsselt. Entschlüsselt solll das ganze dann also so aussehen: ""\\Mozilla\\Firefox\\profiles.ini"".


    Um das ganze mal zu testen habe ich mir eine kleine Anwendung geschrieben:

    Code:
    #include <windows.h>
    #include <iostream.h>
    
    
    char *Xor_(char *pInput)
    {
     int Length = lstrlenA(pInput);
     for (int i = 0; i < Length; i++)
     pInput[i] ^= 0x0fa1c0;
     return pInput;
    }
    
    int main()
    {
     cout << Xor_("\x9C\x9C\x8D\xAF\xBA\xA9\xAC\xAC\xA1\x9C\x9C\x86\xA9\xB2\xA5\xA6\xAF\xB8\x9C\x9C\xB0\xB2\xAF\xA6\xA9\xAC\xA5\xB3\xEE\xA9\xAE\xA9");
     return 0;
    }
    Normal sollte mir das Tool ja nun den Entschlüsselten Pfad anzeigen. Stattdessen allerdings kommt es zu einer Windows Fehlermeldung. "Entschluesselung.exe hat ein Problem festgestellt und muss beendet werden"

    Dann hab ich mir noch gedacht nun mal den Pfad selber zu verschlüsselnt. Also habe ich die Hexadezimalzahlen wieder durch den Path ersetzt. Also:

    Code:
    cout << Xor_("\\Mozilla\\Firefox\\profiles.ini");
    Ergebniss war wieder die selbe Fehlermeldung -.-


    Jetzt bleiben halt einige Fragen offen:

    1. Worin liegt der Fehler ? (Lösungsmöglichkeiten ?)
    2. Wie wird der Path gecryptet das er später so schö als Hexa Zahlen angezeigt wird ? \0x91\0x....

    Bin echt ür jede Hilfe dankbar!

    //EDIT:
    Habe das ganze mal im Debugger laufen lassen und er zeigt folgenden Fehler:

    Unbehandelte Ausnahme bei 0x00411423 in verschlüsselung.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00415800.

    Dabei zeigt der Debugger noch auf: pInput ^= 0x0fa1c0;
     
  2. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    Code:
    char *Xor_(char *pInput)
    {
     int Length = lstrlenA(pInput);
     for (int i = 0; i < Length; i++)
     pInput[COLOR="Red"][i][/COLOR] ^= 0x0fa1c0;
     return pInput;
    }
    
    int main()
    {
     cout << Xor_([COLOR="Red"]"\x9C\x9C\x8D\xAF\xBA\xA9\xAC\xAC\xA1\x9C\x9C\x86\xA9\xB2\xA5\xA6\xAF\xB8\x9C\x9C\xB0\xB2\xAF\xA6\xA9\xAC\xA5\xB3\xEE\xA9\xAE\xA9"[/COLOR]);
     return 0;
    }
    pInput erwartet ein Array (erkennbar an ), du übergibst aber einen String. Deswegen kommts dann zu der Fehlermeldung, wenn dem Array die Werte zugewiesen werden sollen. Mehr kann ich etz auch net helfen, bin zu müde
     
  3. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    ein string ist in C/C++ ein char* und genau das erwartet die funktion auch

    glaube eher, der fehler liegt an dem lstrlenA. Vllt. berechnet das was falsch und deshalb schreibst du zuviel. Bei mir gehts so:

    Code:
     char bla[] = "\\Mozilla\\Firefox\\profiles.ini";
     char *result = Xor_(bla, strlen(bla));
    
     cout << result << endl;
    
     char *out = Xor_(result, strlen(result));
     cout << out << endl;
    aja noch was: wenn du in C++ programmierst, wieso nimmst du dann nicht gleich std::string? da tust du dich viiel leichter mit dem ganzen string-zeug.
     
  4. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    Ok danke nochmal für die Hilfe... das Problem hat sich gelöst indem ich den String erst einmal in eine Variable gepackt habe.

    Allerdings habe ich noch ein klitze kleines Problem.

    1. Wenn ich also versuche den String"\x9C\x9C\x8D\xAF\xBA\xA9\xAC\xAC\xA1\x9C\x9C\x86\xA9\xB2\xA5\xA6\xAF\xB8\x9C\x9C\xB0\xB2\xAF\xA6\xA9\xAC\xA5\xB3\xEE\xA9\xAE\xA9" mit diesem Programm zu decrypten:

    Code:
    #include <windows.h>
    #include <iostream.h>
    
    
    char *Xor_(char *pInput)
    {
     int Length = lstrlenA(pInput);
     for (int i = 0; i < Length; i++)
     pInput[i] ^= 0x0fa1c0;
     return pInput;
    }
    
    int main()
    {
     char path[] = "\x9C\x9C\x8D\xAF\xBA\xA9\xAC\xAC\xA1\x9C\x9C\x86\xA9\xB2\xA5\xA6\xAF\xB8\x9C\x9C\xB0\xB2\xAF\xA6\xA9\xAC\xA5\xB3\xEE\xA9\xAE\xA9";
     cout << Xor_(path);
     return 0;
    }
    Dann kommt als Ergebnis wie erhofft: "\\Mozilla\\Firefox\\profiles.ini" heraus. Nun möchte ich allerdings "\\Mozilla\\Firefox\\profiles.ini" wieder in den oben genannten String verschlüsseln. Also habe ich die Funktion halt nochmal auf dem String "\\Mozilla\\Firefox\\profiles.ini" ausgeführt. Ist doch halt so bekannt das die XOR Verknüpfung doppelt ausgeführt wieder das Anfangsergebnis ausgibt.

    Code:
    #include <windows.h>
    #include <iostream.h>
    
    
    char *Xor_(char *pInput)
    {
     int Length = lstrlenA(pInput);
     for (int i = 0; i < Length; i++)
     pInput[i] ^= 0x0fa1c0;
     return pInput;
    }
    
    int main()
    {
     char path[] = "\\Mozilla\\Firefox\\profiles.ini";
     cout << Xor_(path);
     return 0;
    }
    Doch als Ergebnis bekomme ich dummerweise "£ì»║®¼¼í£å®▓Ѫ»©£░▓»ª®¼Ñ│¯". Liegt es evtl an der Zeichenkodierung ? Wie kann ich diese ändern in Visual Studio 9 ? Einer ne Idee ?
     
  5. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    ne is ganz einfach
    die ausgabe stimmt schon, das sind halt wirklich die bytes, die bei der xor-verschlüsselung rauskommen ^^

    aber man kann das auch in hex-codes umwandeln, hatte irgendwo mal nen snippet dafür
     
  6. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    Hallo du Held


    Den String den du am Anfang erstellst ("\x9C\x9C\x8D..."), besteht nicht aus Charactern, dies sind die Bytes.
    Das was bei dir als "Fehler" rauskommt, sind die Character, nicht die Bytes.


    Nimm bitte einfach mal 0x9c, und schau, welcher Character dann rauskommt. Ich könnte wetten, dass dies genau das erste Zeichen deiner "falschen" Ausgabe entspricht.

    - - -
    Tanya

    p.s. Held ist nicht böse gemeint
     
  7. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    Die Funktion erwartet aber ein char-Array und keinen festen String, das sieht man daran:

    Code:
    [COLOR="Red"]pInput[i][/COLOR] ^= 0x0fa1c0;
     
  8. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    probier folgendes:

    Code:
     char *test1 = "Hallo, das ist ein test";
     char test2[] = "Hallo, das ist ein test";
    
     cout << *(test1 + 2) << endl;
     cout << test1[2] << endl;
    
     cout << *(test2 + 2) << endl;
     cout << test2[2] << endl;
    na, fällt dir was auf?

    dem compiler is das egal, und der funktion auch
    der char-zeiger, der übergeben wird, zeigt auf das erste element vom array, also pinput[0]. und da man die länge angibt, kann man auch bis zur länge 'vorrücken'. das liegt daran, dass das array hintereinander im speicher is. wenn also das erste element (das wo der zeiger drauf zeigt) auf 0x0012FF8 ist, dann zeigt (ptr + 1) auf 0x0012FF9
     
  9. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    Es geht mir darum, dass es einen Unterschied macht, ob ich einer Funktion einen festen String übergebe:

    Code:
    Funktion("Das ist ein String");
    oder ein char-Array:

    Code:
    char *test = "Das ist ein String";
    Funktion(test);
    
    wenn die Funktion mit dem Parameter später als Array arbeitet


    // Edit

    Kleines Beispiel:

    Code:
    void foo(char* foobar)
    {
     foobar[0] = 'b';
     foobar[1] = 'b';
    }
    Das geht:

    Code:
    char test[] = "aa"; 
    foo(test);
    cout << test[0] << test[1]; // gibt bb aus
    Das nicht:

    Code:
    foo("aa"); // Programm hat einen Fehler festgestellt blabla
     
  10. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    achso, ja das is natürlich klar ^^

    das zweite beispiel kann gar nich funktionieren, da "aa" ein stringliteral ist, also konstant (const char *) und das kann man eben nich verändern ^^

    in dem sinne hast schon recht, war wohl nur etwas undeutlich ausgedrückt ^^ mit dem "festen string" meintest du wohl das const char* ^^
     
  11. 31. August 2008
    AW: Problem und Fragen zur XOR Encrytption

    So danke, das Problem hat sich nun gelöst. Die Funktion XOR hat halt erwartet, dass eine Variable übergeben wird. Ansonsten musste man noch etwas im Linker nachtragen.

    Joa und das mit der Verschlüsselung stimmte auch... habe es gelöst indem ich die Zeichen in in Hexadezimalformat umgewandelt habe.

    Jetzt kommt gleich der vollständige Quelltext^^ ich komm da drauf echt net klar xD
    Habt alle ne BW

    *closed
     
  12. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.