C++ string in Ftp-Funktion "verschleiern"



  • Hallo danke für die schnelle Antwort.
    Doch ich möchte das Programm verteilen, aber ich wusste nicht das die leute dann automatisch zugriff auf den Server haben 😮. Gibt es denn eine Funktion die eine Datei auf den Server hochlädt aber die Leute nicht direkt zugriff auf den Server haben?



  • Hä? Du gibst ihnen doch Zugriff durch dein Programm, wozu soll das denn sonst gut sein?

    moin354 schrieb:

    Gibt es denn eine Funktion die eine Datei auf den Server hochlädt aber die Leute nicht direkt zugriff auf den Server haben?

    Daten hochladen können = Zugriff auf den Server haben. 😕



  • Ja ich gebe dem Programm kurzzeitig Zugriff um eine Datei hochzuladen aber danach ja auch nicht mehr oder irre ich mich da?



  • Keine Ahnung, du musst doch wissen wie der FTP-Account konfiguriert ist.



  • Was hat das mit meinem Ftp Account zutun?

    die Funktionen

    InternetCloseHandle(hConnection);
    InternetCloseHandle(hOpen);
    

    beenden doch die Verbindung oder nicht?



  • Hä? Niemanden interessiert was dein Programm macht. Die Daten kann, wie oben geschrieben, jeder einfach auslesen. Sieh einfach zu, dass der FTP-Account genau das kann, was auch das Programm können soll, Problem gelöst.



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



  • void upload(){
            char[] password="nfjoQX";//in der exe steht nur "nfjoQX"
            for(char* p=password;*p!='\0';++p)// wird im ram zu "meinPW" gemacht
              --*p;
            …
    	hConnection = InternetConnect(hOpen,"meine Server ID", INTERNET_DEFAULT_FTP_PORT,
    		"mein Username",password,INTERNET_SERVICE_FTP,0,0);
    

    Aber das schützt wirklich nur gegen einen, der die die auf der Platte liegende exe mit wordpad oder einem hex-editor anschaut.
    Nimmt er einen Debugger, kann er den Aufruf von InternetConnect finden und sich die Parameter zur Laufzeit anschauen.
    Außerdem kann man leicht mit einem Netzwerksniffer wie wireshark die FTP-Pakete rausfiltern und anschauen.
    Das hilft also nur gegen Leute, die recht frisch angefangen haben.



  • 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." ?


Anmelden zum Antworten