C++ string in Ftp-Funktion "verschleiern"



  • Ehm entweder hab ich grade einen totalen Blackout oder wir reden aneinander vorbei. Ich glaube es ist hilfreich wenn ich erwähne was mein Programm macht. Mein Programm im ganzen liest dinge aus einem anderen Programm aus speichert diese in einer Text-Datei und schickt diese zu meinem Server. Aber ich möchte nicht das die Personen die mein Programm verwenden auch meine Account-Daten bekommen. Sondern es soll die Daten nur kurz hochladen. Gibt es denn eine Funktion die genau das tut aber nicht meine Daten freigibt?

    entschuldigung falls ich gerade einen Blackout habe 😃



  • Problem: Dein Programm muss sich beim Server anmelden, um etwas hochzuladen.



  • moin354 schrieb:

    Ehm entweder hab ich grade einen totalen Blackout oder wir reden aneinander vorbei. Ich glaube es ist hilfreich wenn ich erwähne was mein Programm macht. Mein Programm im ganzen liest dinge aus einem anderen Programm aus speichert diese in einer Text-Datei und schickt diese zu meinem Server. Aber ich möchte nicht das die Personen die mein Programm verwenden auch meine Account-Daten bekommen. Sondern es soll die Daten nur kurz hochladen. Gibt es denn eine Funktion die genau das tut aber nicht meine Daten freigibt?

    entschuldigung falls ich gerade einen Blackout habe 😃

    Sofern FTP das unterstützt musst du einen neuen Benutzer anlegen, der nur in diesem speziellen Verzeichnis Rechte hat. Falls das noch immer zu viel ist, dann ist FTP einfach die falsche Wahl.

    In dem Fall musst du z.B. ein PHP Script schreiben, was die Daten entgegennimmt. Oder du nimmst eine HTTP Bibliothek, die Daten über HTTP hochlädt...

    Oder du schreibst einfach noch ein Programm, welches als Server fungiert und einfach nur die Daten annimmt.

    Das ist halt alles etwas komplizierter.



  • Ja, ich weiss ist es denn möglich das ganze so zu verschlüsseln das es "fast" unknackbar ist?



  • Mal ein bischen stümperhaft umgesetzt:

    #include <iostream>
    #include <array>
    
    #define GCC_NOINLINE __attribute__((noinline))
    
    char KEY = 107;
    
    template<char...>
    struct CountChars;
    
    template<char Cur>
    struct CountChars<Cur>
    {
        static std::size_t const count = 1;
    };
    
    template<char Cur, char... Rest>
    struct CountChars<Cur, Rest...>
    {
        static std::size_t const count = 1 + CountChars<Rest...>::count;
    };
    
    template<char... Chars>
    constexpr std::array<char, CountChars<Chars...>::count> encrypt()
    {
        return { { static_cast<char>((Chars ^ KEY))... } };
    }
    
    template<bool withNull, std::size_t N>
    GCC_NOINLINE std::array<char, N + withNull> decrypt(
        std::array<char, N> const& encrypted)
    {
        std::array<char, N + withNull> decrypted;
        for(std::size_t i = 0; i < N; ++i)
            decrypted[i] = encrypted[i] ^ KEY;
        if(withNull)
            decrypted[N] = 0;
        return decrypted;
    }
    
    int main()
    {
        auto str = encrypt<'H','e','l','l','o',',',' ','W','o','r','l','d','!'>();
        std::cout << decrypt<true>(str).data() << '\n';
    }
    

    Strings im Compilat:

    /lib64/ld-linux-x86-64.so.2
    libstdc++.so.6
    __gmon_start__
    _Jv_RegisterClasses
    _ITM_deregisterTMCloneTable
    _ITM_registerTMCloneTable
    _ZNSt8ios_base4InitD1Ev
    _ZSt4cout
    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c
    _ZNSt8ios_base4InitC1Ev
    libm.so.6
    libgcc_s.so.1
    libc.so.6
    __cxa_atexit
    __libc_start_main
    GLIBC_2.2.5
    GLIBCXX_3.4
    H#L$
    D$ H
    L(H H#T
    l$ L
    t$(L
    |0H;30H ;*3"

    Noinline ist bei Optimierungen Pflicht, sonst inlined der Compiler den decrypt Aufruf und berechnet das Literal ganz/teilweise zur Compilezeit.

    Die Sache ist nicht perfekt, aber gegen stümperhafte Reverse Engineering "Attacken" durchaus brauchbar.



  • ...



  • Ok vielleicht sollte ich das Thema erst noch lassen denn das Beispiel ist für mich noch zu kompliziert aber trotzdem ein dickes danke an alle die helfen wollten. Aber da wir gerade eh beim Thema Server sind kennt jemand ein gutes Deutsches WinSock Buch?



  • moin354 schrieb:

    Ja, ich weiss ist es denn möglich das ganze so zu verschlüsseln das es "fast" unknackbar ist?

    Nein, denn es ist klar, dass dein Passwort entschlüsselt sein muss, sobald der Aufruf von InternetConnect erfolgt und genau da kann man ansetzen - und das schafft auch jedes Skriptkiddy.

    Der Ansatz ist völliger Unfug und durch nichts zu retten. Auch wenn es schon erwähnt wurde, merke dir: alles was dein Programm kann, kann auch der User. Wenn er das nicht können soll, darf es auch dein Programm nicht können. So einfach ist das.



  • moin354 schrieb:

    Ok vielleicht sollte ich das Thema erst noch lassen denn das Beispiel ist für mich noch zu kompliziert aber trotzdem ein dickes danke an alle die helfen wollten. Aber da wir gerade eh beim Thema Server sind kennt jemand ein gutes Deutsches WinSock Buch?

    Ist Dir mein Code auch zu kompliziert?



  • ehm so halb blick ich durch aber eine Erklärung wäre nett :D. Ahh Jetzt hab ichs verstanden 😃 tut mir leid hab gerade sehr langsam geschaltet ^^. Eine Frage noch ratet ihr mir dazu den Code von Volkard zu benutzen?



  • Einen Riesenaufwand für die Obfuscation im Programm zu betreiben ist fragwürdig; für Sicherheit musst du dir ohnehin etwas anderes überlegen.

    Nexus schrieb:

    Wenn du nur das Basis-FTP-Protokoll benutzt, wird das Passwort im Klartext übermittelt, das ist also sowieso nicht sicher.

    volkard schrieb:

    Außerdem kann man leicht mit einem Netzwerksniffer wie wireshark die FTP-Pakete rausfiltern und anschauen.



  • Gibt es denn eine sichere Möglichkeit mir die Daten zu übermitteln? muss auch nicht über einen Server sein. Achja wie ist das gemeint mit "Nimmt er einen Debugger, kann er den Aufruf von InternetConnect finden und sich die Parameter zur Laufzeit anschauen." ?



  • Sobald die Daten sich auf einer Maschine befinden, über die du keine Kontrolle hast, hast du rein prinzipiell auch keine Kontrolle über die Daten. Der einzige Weg, sicher zu verhindern, dass jemand an deine Daten kommt, ist, die Daten nicht aus der Hand zu geben. Was du hier versuchst, ist bekannt als "security through obscurity" und kann rein prinzipiell niemals echte Sicherheit garantieren.



  • Und wie machen es dann die Online Spiele?



  • ...



  • moin354 schrieb:

    Und wie machen es dann die Online Spiele?

    Bei Online Spielen muss sich jeder Benutzer doch mit einem eigenen Account anmelden!?



  • ehm ich wollte damit jemanden zitieren 😃



  • @ Swordfish ehm ich wollte damit jemanden zitieren :D. Aber die connecten doch auch zu dem Server? Entschuldigung für den doppel Post 😮



  • moin354 schrieb:

    @ Swordfish ehm ich wollte damit jemanden zitieren :D. Aber die connecten doch auch zu dem Server? Entschuldigung für den doppel Post 😮

    Ja, und auf dem Server läuft ein Serverprogramm, das sich um alles kümmert, was der User nicht wissen darf.



  • könnte ich nicht rein theoretisch auch so ein Programm verwenden? Wenn ja bitte ein Beispiel.


Anmelden zum Antworten