Ergebnis 1 bis 10 von 10
  1. #1
    Anfänger
    Registriert seit
    12.11.2011
    Beiträge
    19

    Standard [C++] Remote Konsole

    Hey,

    ich bin momentan dabei, ein Programm zu schreiben, dass zu einem bestimmten Zeitpunkt einen Port öffnet und das nach Senden eines Passworts eine Konsole "bereitstellt".

    Folgendes Problem:

    Das obengenannte Programm läuft auf einem Server, ich connecte auf den Port. Jetzt möchte ich Befehle direkt an die Konsole schicken.
    Nur wie mache ich das genau? Soll ich erst mit CreateProcess() die cmd öfffnen? Und wie leite ich die Eingaben dann an die Konsole weiter und wie schicke ich die "Antwort" der Konsole an den Clienten zurück?

    Wäre schick wenn mir jmd. ein paar Denkanstöße geben könnte. :-)

  2. #2
    black cat Avatar von Barbers
    Registriert seit
    12.10.2007
    Beiträge
    296

    Standard

    ist es ne windows oder ne linux installation aufm dem server?
    wobei in beiden fällen helfen könnte die cmd.exe oder die jeweilige bash zu starten als prozess

  3. #3
    Anfänger
    Registriert seit
    12.11.2011
    Beiträge
    19

    Standard

    Erstmal nur für Windows, später kann man das immer noch auf Linux umschreiben.
    Ja das starten ist ja kein Problem, aber meine Server-Anwendung nimmt dann die Befehle des Clienten entgegen und muss diese Befehle irgendwie an die Konsole weiterleiten und die Ausgabe der Konsole an den Clienten zurückschicken.

    Ich hab leider keine Ahnung wie das geht, eventuell über Pipes, aber da hab ich nicht wirklich Ahnung von.

  4. #4
    Chloë Grace Moretz Avatar von ocz
    Registriert seit
    29.05.2010
    Beiträge
    384

    Standard

    pipes, siehe msdn

  5. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    Arktus (14.12.2011)

  6. #5
    Stanley Jobson Avatar von Bonkers
    Registriert seit
    01.02.2010
    Beiträge
    735

    Standard

    Hab das gerade gefunden und leicht modifiziert.
    Grundlegend funktioniert das, ist aber noch buggy.

    Code:
    #include <windows.h>
    #include <stdio.h>
    
    #define MAX_BUFFER_SIZE 512
    
    int EmulateCommandPrompt(LPSTR cmdline)
    {
        STARTUPINFO sti = { 0 };
        SECURITY_ATTRIBUTES sats = { 0 };
        PROCESS_INFORMATION pi = { 0 };
        HANDLE pipin_w, pipin_r, pipout_w, pipout_r;
        BYTE buffer[MAX_BUFFER_SIZE];
        DWORD writ, excode, read, available;
        int ret = 0;
    
        pipin_w = pipin_r = pipout_w = pipout_r = NULL;
    
        for(;;)
        {
            //set SECURITY_ATTRIBUTES struct fields
            sats.nLength = sizeof(sats);
            sats.bInheritHandle = TRUE;
            sats.lpSecurityDescriptor = NULL;
    
            //create child's stdout pipes
            if(!CreatePipe(&pipout_r, &pipout_w, &sats, 0)) break;
            //and its stdin pipes
            if(!CreatePipe(&pipin_r, &pipin_w, &sats, 0)) break;
            printf("Created pipes\n");
    
            //now set STARTUPINFO struct fields (from the child's point of view)
            sti.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
            sti.wShowWindow = SW_HIDE;
            sti.hStdInput = pipin_r;
            sti.hStdOutput = pipout_w;
            sti.hStdError = pipout_w;
    
            //create the process...
            if(!CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE,
                0, NULL, NULL, &sti, &pi)) break;
            printf("Created process (%s)\n", cmdline);
    
            //now have a continuous loop to get and recieve info
            for(;;)
            {
                //make sure process is still running
                GetExitCodeProcess(pi.hProcess, &excode);
                if(excode != STILL_ACTIVE) break;
                //printf("Process still running\n");
    
                //give it time to set up/react
                Sleep(50);
    
                //now check to see if process has anything to say
                if(!PeekNamedPipe(pipout_r, buffer,
                    sizeof(buffer), &read, &available, NULL)) ret = 10;
                //printf("Peeked\n");
    
                //is there anything to be read in the pipe?
                if(read)
                {
                    do
                    {
                        ZeroMemory(buffer, sizeof(buffer));
                        //read it and print to stdout
                        if(!ReadFile(pipout_r, buffer, sizeof(buffer), &read, NULL) || !read) ret = 7;
                        buffer[read] = 0;
                        fprintf(stdout, "%s", buffer);
                        if(ret) break;
                    }
                    while(read >= sizeof(buffer));
                }
    
                //make sure we didn't run into any errors
                if(!ret)
                {
                    //get info and write it to pipe
                    ZeroMemory(buffer, sizeof(buffer));
                    fgets(buffer, sizeof(buffer), stdin);
                    if(!strnicmp(buffer, "exit", 4)) ret = 12;
                    if(!WriteFile(pipin_w, buffer, strlen(buffer), &writ, NULL)) ret = 8;
                }
                if(ret) break;
            }
    
            break;
        }
    
        //clean up any unfinished business
        if(pipin_w != NULL) CloseHandle(pipin_w);
        if(pipin_r != NULL) CloseHandle(pipin_r);
        if(pipout_w != NULL) CloseHandle(pipout_w);
        if(pipout_r != NULL) CloseHandle(pipout_r);
        if(pi.hProcess != NULL) CloseHandle(pi.hProcess);
        if(pi.hThread != NULL) CloseHandle(pi.hThread);
    
        return ret;
    }
    
    int main(int argc, char *argv[])
    {
        EmulateCommandPrompt(NULL);
    
        return 0;
    }

    Blackberry: der eine typ ist danach gestorben
    Bonkers: Echt?
    Blackberry: jep

  7. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    Arktus (14.12.2011)

  8. #6
    Chloë Grace Moretz Avatar von ocz
    Registriert seit
    29.05.2010
    Beiträge
    384

    Standard

    Das mit dem Boundary Checking lernen wir aber nochmal, ja?

  9. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    Cristhecrusader (14.12.2011)

  10. #7
    Stanley Jobson Avatar von Bonkers
    Registriert seit
    01.02.2010
    Beiträge
    735

    Standard

    Wie gesagt, hab das gefunden und nur zwei kleine Änderungen gemacht.
    Es funktioniert so weit, das reichte mir gerade.

    Blackberry: der eine typ ist danach gestorben
    Bonkers: Echt?
    Blackberry: jep

  11. #8
    Transpinguin Avatar von IRET
    Registriert seit
    02.09.2008
    Beiträge
    1.295

    Standard

    Ich glaub du willst was lernen (wenn nicht, dann musst du).
    Hier für Linux und Windows ein Tutorial: www.andreadrian.de/remsh/index.html

  12. #9
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Kleiner Tipp nebenbei: kein vernünftiger Mensch spawnt auf Windows eine Shell. Da hast du schon ein von dir geschriebenes Programm mit potentiell allen Möglichkeiten auf dem Server laufen und schießt dir absichtlich ins Bein, damit du den Server auf Krücken übernehmen kannst.

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  13. #10
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard

    Zitat Zitat von blackberry Beitrag anzeigen
    kein vernünftiger Mensch spawnt auf Windows eine Shell.
    Das hab ich früher permanent gemacht. Sowas braucht man z.B. in der FXP Scene wenn man Server übernehmen möchte.

    Das bringt dich auf die Spur für Windows ohne Pipe:
    STARTF_USESTDHANDLES + CreateProcess

    MSDN lesen und mit diesen Stichwörtern findest du viele Reverse/Connect Shell Beispiele.
    Geändert von G36KV (14.12.2011 um 21:05 Uhr)

Ähnliche Themen

  1. Konsole löschen
    Von Barny im Forum Java
    Antworten: 7
    Letzter Beitrag: 12.12.2011, 18:25
  2. Brauche Hilfe bei Remote Keyboard und Remote Maus
    Von HackZintheDarK im Forum .NET Sprachen - Techniken
    Antworten: 12
    Letzter Beitrag: 03.12.2010, 22:38
  3. [S][c#]Ebook Konsole.
    Von KellerKind im Forum .NET Tutorials
    Antworten: 3
    Letzter Beitrag: 11.09.2010, 14:41
  4. Von Konsole zum Fenster
    Von DoS im Forum C, C++
    Antworten: 6
    Letzter Beitrag: 28.05.2009, 17:46
  5. Konsole verstecken
    Von RikuXan im Forum C, C++
    Antworten: 8
    Letzter Beitrag: 22.12.2008, 20:43

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •