перенаправление соединения

Тема в разделе "WASM.WIN32", создана пользователем Euler, 2 ноя 2011.

  1. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Здравствуйте, задача следующая- есть процесс, в котором установлено tcp соединение. А нужно "передать" это соединение другому процессу, который должен служить промежуточным звеном(по сути прокси-сервером). Возможно ли это сделать не залезая в ядро?
     
  2. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    Перехват send\recv\.. ?
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    LSP
     
  4. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Да, но этого мало. Нужно перехватить ещё и connect, в котором установить соединение с моим процессом, а он уже выполнит соединение, которое запрашивал целевой. Вопрос- можно ли что-то сделать, если connect уже выполнен?
    Нужно иметь возможность подсовывать собственные пакеты. Насколько я понимаю LSP это не подвластно.
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    O'rly?
     
  6. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    Euler connect -это понятно, я имею в виду весь набор. (аля перхватов в spy-eye)
     
  7. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    А можно чуть конкретнее? А то совсем не понятно что вы имеете ввиду.
    Отсюда следует, что возможности LSP ограничиваются обработкой вызовов API.
     
  8. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    Euler почитайте что делают банковские трояны для инжектов (перхват.. того же winsock'a)
     
  9. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    А не у кого не завалялся диск от книги "Network programming for Microsoft Windows"(Программирование в сетях Microsoft Windows)? Хотелось бы посмотреть на реализацию LSP на том диске.
     
  10. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    Euler
    с LSP потеряете времени немало на "разборки" - перехватите connect(), send(), recv() = перенаправляем все на проксик локальный или передаём инфу в другой поцесс....
     
  11. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Это уже реализовано, сейчас мне бы хотелось именно познакомится с этой технологией. В принципе пример есть на сайте microsoft, но там он довольно объёмный, хотелось бы что-нибудь поменьше.
     
  12. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Я вообще правильно понимаю принцип работы SPI?
    В системе есть БД поставщиков услуг. В этой БД хранятся записи трёх типов- "базовые", "многоуровневые" и "цепочки". Когда приложение создаёт сокет, оно просматривает эту БД и выбирает первую попавшуюся запись базового поставщика или цепочку.
    Т.е. для перехвата трафика нужно создать многоуровневый поставщик услуг и прописать его во все цепочки(а базовые протоколы "превратить" в цепочки). При этом ничто не мешает приложению создать новую цепочку, в которой не будет нежелательных поставщиков. Всё верно?
     
  13. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    ZEN Anonymous proxy server.
    Скачал откуда-то не помню. Думаю принцип в нем увидеть можно.
     
  14. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Он есть на этом сайте в соответствующем разделе :). SPI там не фигурирует.
     
  15. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    IOCTL_AFD_CONNECT + IOCTL_AFD_SEND + IOCTL_AFD_BIND + IOCTL_AFD_RECV
     
  16. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну тогда уж не забудь и структуры выложить для всех этих запросов. А также не забудь упомянуть, что этого недостаточно, ибо там, как минимум, ещё создание сокетных объектов, ну и корректное завершение соединения тоже не помешало бы. И, разумеется, было бы просто непростительно не сказать о том, что слать эти запросы надобно к \Device\Afd и \Device\Afd\EndPoint с помощью сервиса NtDeviceIoControlFile().
     
  17. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    x64
    Я дал направление человеку куда копать. Найти можно тут же на форуме.
    Единственно решение с ЛСП было бы лучше, но видимо оно нужно ему для другого.
     
  18. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    x64(с)
    "Формат входных и выходных структур для управляющих запросов AFD меняется от версии к версии системы, так что написание собственных нативных сокетов на IOCTL-запросах представляется нетривиальной задачей, требующей анализа исходного кода операционной системы, а также реверсинга некоторых её частей (например, драйвера afd.sys)"

    .)
     
  19. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    а так вот:
    Код (Text):
    1. typedef struct _AFD_WSABUF
    2. {
    3.     UINT  len;
    4.     PCHAR buf;
    5. } AFD_WSABUF, *PAFD_WSABUF;
    6.  
    7. typedef struct _TDI_ADDRESS_IP {
    8.     USHORT sin_port;
    9.     ULONG  in_addr;
    10.     UCHAR  sin_zero[8];
    11. } TDI_ADDRESS_IP, *PTDI_ADDRESS_IP;
    12.  
    13. typedef struct _TA_ADDRESS_IP {
    14.     LONG  TAAddressCount;
    15.     struct  _AddrIp
    16.     {
    17.         USHORT          AddressLength;
    18.         USHORT          AddressType;
    19.         TDI_ADDRESS_IP  Address[1];
    20.     } Address [1];
    21. } TA_IP_ADDRESS, *PTA_IP_ADDRESS;
    22.  
    23. typedef struct _TA_ADDRESS {
    24.     USHORT  AddressLength;
    25.     USHORT  AddressType;
    26.     UCHAR   Address[1];
    27. } TA_ADDRESS, *PTA_ADDRESS;
    28.  
    29. typedef struct _TRANSPORT_ADDRESS {
    30.     LONG  TAAddressCount;
    31.     TA_ADDRESS  Address[1];
    32. } TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS;
    33.  
    34. typedef struct  _AFD_SEND_INFO
    35. {
    36.     PAFD_WSABUF             BufferArray;
    37.     ULONG               BufferCount;
    38.     ULONG               AfdFlags;
    39.     ULONG               TdiFlags;
    40. } AFD_SEND_INFO , *PAFD_SEND_INFO ;
    41.  
    42. typedef struct  _AFD_CONNECT_INFO
    43. {
    44.     BOOLEAN             UseSAN;
    45.     ULONG               Root;
    46.     ULONG               Unknown;
    47.     //#if 1 /* bruening: based on win7 observation: i#376 */
    48.     //  SOCKADDR                            Address;
    49.     //#else
    50.         TRANSPORT_ADDRESS                   Address;
    51.     //#endif
    52. } AFD_CONNECT_INFO , *PAFD_CONNECT_INFO ;
    53.  
    54. typedef struct _AFD_BIND_DATA
    55. {
    56.     ULONG                               ShareType;
    57.     #if 1 /* bruening: based on win7 observation: i#376 */
    58.         SOCKADDR                            Address;
    59.     #else
    60.         TRANSPORT_ADDRESS                   Address;
    61.     #endif
    62. } AFD_BIND_DATA, *PAFD_BIND_DATA;
    63. ................................
    64. void PrintAddress( PTA_ADDRESS address )
    65. {  
    66.     char buffer[256];
    67.     if(address->AddressType == TDI_ADDRESS_TYPE_IP)
    68.     {
    69.         TDI_ADDRESS_IP* ip_address = (TDI_ADDRESS_IP*)address->Address;
    70.         char *p;
    71.         p = (char *)&ip_address->in_addr;
    72.         in_addr ia;
    73.         memcpy(&ia,&ip_address->in_addr,sizeof(in_addr));
    74.         sprintf(buffer,"%d.%d.%d.%d:%u", (UCHAR)p[0], (UCHAR)p[1], (UCHAR)p[2], (UCHAR)p[3], ntohs(ip_address->sin_port));
    75.         DPRINT2("Address = %s -- %s\n", buffer,inet_ntoa(ia));
    76.     }
    77. }
    78.  
    79.  
    80. ....................
    81. case IOCTL_AFD_CONNECT:
    82.                 OutputDebugStringA("IOCTL_AFD_CONNECT");
    83.                 PAFD_CONNECT_INFO pAFDCI;
    84.                 pAFDCI = (PAFD_CONNECT_INFO)InputBuffer;
    85.                 TA_ADDRESS ta;
    86.                 ta = pAFDCI->Address.Address[0];
    87.                 PrintAddress(&ta);
    кому надо тот разберется, это выдержка из проекта моего одного (черновик естественно)
     
  20. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    ASMatic
    Ну да, всё правильно, но я подумал, что у RET уже есть эти данные. Я угадал.