Сплайсинг сокетов

Тема в разделе "WASM.NETWORKS", создана пользователем saxon, 24 июн 2009.

  1. saxon

    saxon New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    23
    привет. необходимо реализовать сплайсинг сокетов.
    работаю через detours.
    по ходу дела я немного анализирую пакеты и блокирую/редактирую некоторые из них.
    модуль работает для браузеров. нужно ИЕ и ФФ.
    ИЕ работает через recv/send. перехватил их нормально. с буфером нормально отработал.
    также нужно поступить и с WSARecv/WSASend. в документации написано, что WSARecv является надстройкой над стандартным recv. и сенд аналогично.
    по ходу дела получилось так, что с помощью перехвата send перехватились пакеты из WSASend, а с WSARecv/recv так не вышло (ничего не приходит).
    можно ли обрабатывать все пакеты, перехватывая лишь recv/send?
    если нет, то как работать с буффером WSARecv? он хранит массив буферов. сколько их, как их писать.
    может, есть у кого опыт в этом деле. поделитесь соображениями, плз. как в такой ситуации поступали?

    заранее всем спасибо
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ты еще 8 тем создай. Обычно, когда вопрос задают меньше 6 раз, на него не отвечают
     
  3. saxon

    saxon New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    23
    сорри. не в ту ветку изначально запостил
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    saxon
    Для таких дел стоит клацнуть "сообщить модератору" и попросить перенести в другой форум. Не надо плодить тыщу копий
     
  5. avgust

    avgust New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2007
    Сообщения:
    6
    Ооооо! Меня тоже этот вопрос интересует.
    Надеюсь кто-то подскажет... =)
     
  6. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    >то как работать с буффером WSARecv?
    а что, там с буферами что-то не так?
     
  7. saxon

    saxon New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    23
    их там много. есть ли у них ограничение по объему?
    или можно просто сначала все буферы соединять в один, обрабатывать, а потом опят разделять на несколько буферов?
    и почему не получается обрабатывать запрос по WSA через обычные сокеты? ведь это надстройка? или нет?
     
  8. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    int WSARecv(
    __in SOCKET s,
    __in_out LPWSABUF lpBuffers,
    __in DWORD dwBufferCount,
    __out LPDWORD lpNumberOfBytesRecvd,
    __in_out LPDWORD lpFlags,
    __in LPWSAOVERLAPPED lpOverlapped,
    __in LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );

    нету не каких ограничений, просто можно указывать несколько буферов, можно это рассматривать как dwBufferCount раз вызовов к recv/send.

    for(DWORD i = 0; i < dwBufferCount; i++)
    {
    lpBuffers; //Содержимое текущего буфера.
    lpNumberOfBytesRecvd; //Размер текущего буфера.
    }

    >или можно просто сначала все буферы соединять в один, обрабатывать, а потом опят разделять на несколько буферов?
    не в коем случаи.

    >и почему не получается обрабатывать запрос по WSA через обычные сокеты? ведь это надстройка? или нет?
    вероятно recv,send, WSA* это насдтройки над внутреней функцией. кажется в исходниках win2k3 был код ws2_32.dll
     
  9. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    извеняюсь, не в win2k3 в win2k
     
  10. saxon

    saxon New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    23
    >нету не каких ограничений, просто можно указывать несколько буферов, можно это рассматривать как dwBufferCount раз вызовов к recv/send.
    Мне необходимо перед выдачей контента юзеру сначала загрузить все, проанализировать, изменить и вернуть ему.
    в случае с recv я при первом пакете вызываю до отказа recv, анализирую, отдаю.
    как тогда анализировать несколько буферов? почему их нельзя соединить, а в конце порезать по размерам буферов?
    в МСДН по этому поводу ничего не нашел.
     
  11. saxon

    saxon New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2009
    Сообщения:
    23
    в ИЕ6 как-то интересно все сделано. на отправку там send, на получение WSARecv. зачем они такое сделали..
    но, не в этом дело.
    я хотел бы сохранять в файл просто содердимое буфера из WSARecv.
    в коде пишу просто сохранение в файл и возвращаю сразу результат выполнения оригинальной функции.
    но, ИЕ выдает ошибку (невозморжно загрузить...).если работу с дескрипторами (файлом) убрать, то все ок.
    почему так происходит и как с этим бороться? в теории, когда у ИЕ таймаут, он сразу начинает проверять сеть - отсылает по УДП байтик. здесь такое делает, но, это не помогает.
    подскажите, что еще нужно перехватить, чтобы можно было залогировать пакеты?
     
  12. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    >как тогда анализировать несколько буферов? почему их нельзя соединить, а в конце порезать по размерам буферов?
    я все расписал, как это сделать. "можно это рассматривать как dwBufferCount раз вызовов к recv/send."

    при чем тут ие вообще? смотри ошибку в коде какая нить функция не парвильно вызывается или еше че, лучше код показать
     
  13. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    > но, ИЕ выдает ошибку (невозморжно загрузить...).если работу с дескрипторами (файлом) убрать, то все ок.
    попробуй после вызова сохранить код ошибки GetLastError, а когда сделаешь все свои дела, перед возвратом, установи обратно эту ошибку
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Вчера/позавчера был подобный топик, наверно его удалили. Вобщем можно сграбить не привлекая механизм исключений. Перехват статический. Механизм следующий:
    o Загружаем mswsock.dll
    o Трассируем(ldasm) функцию(экспортируется) WSPStartup(), находим код:
    Код (Text):
    1.     mov esi,offset _SockProcTable
    2.     rep movsd
    и извлекаем ссылку на таблицу _SockProcTable:
    Код (Text):
    1. $       _WSPAccept@24
    2. $+4     _WSPAddressToString@24
    3. $+8     _WSPAsyncSelect@20
    4. $+C     _WSPBind@16
    5. $+10        _WSPCancelBlockingCall@4
    6. $+14        _WSPCleanup@4
    7. $+18        _WSPCloseSocket@8
    8. $+1C        _WSPConnect@32
    9. $+20        _WSPDuplicateSocket@16
    10. $+24        _WSPEnumNetworkEvents@16
    11. $+28        _WSPEventSelect@16
    12. $+2C        _WSPGetOverlappedResult@24
    13. $+30        _WSPGetPeerName@16
    14. $+34        _WSPGetSockName@16
    15. $+38        _WSPGetSockOpt@24
    16. $+3C        _WSPGetQOSByName@16
    17. $+40        _WSPIoctl@44
    18. $+44        _WSPJoinLeaf@36
    19. $+48        _WSPListen@12
    20. $+4C        _WSPRecv@36
    21. $+50        _WSPRecvDisconnect@12
    22. $+54        _WSPRecvFrom@44
    23. $+58        _WSPSelect@24
    24. $+5C        _WSPSend@36
    25. $+60        _WSPSendDisconnect@12
    26. $+64        _WSPSendTo@44
    27. $+68        _WSPSetSockOpt@24
    28. $+6C        _WSPShutdown@12
    29. $+70        _WSPSocket@28
    30. $+74        _WSPStringToAddress@24
    Это целевые стабы, по сути являются заглушками для высокоуровневых функций. Для целевой WSASend() стаб это _WSPSend().
    o Выполняем обмен значения для необходимого индекса в массиве, тоесть по адресу [_SockProcTable + 23*4] загружаем ссылку на хэндлер _WSPSend(), предварительно сохранив текущий. Эта манипуляция абсолютно безопасна, таблица в секции данных.
    o Таблица будет передана далее из WSPStartup() и все запросы пройдут через её стабы. Хэндлер может выполнить низкоуровневую обработку(текущий уровень апи), трассировать до NtDeviceIoControlFile, либо выполнить бактрейс с захватом адреса возврата, вернуть управление и обработать высокоуровневый вызов(в стековых фреймах параметры).
    -
    Так только на XP, как в остальных версиях не знаю, также не юзал это.
     
  15. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    везде так, можно юзать
     
  16. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    thnx...очень интересная инфа...
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ohne
    Тогда нужны индексы, залейте с семёрки модуль плиз посмотреть.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не большой код вышел http://indy-vx.narod.ru/Bin/Wsp.zip
     
  19. juggler

    juggler New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2009
    Сообщения:
    18
    на получение там тот же recv, но не из ws2_32.dll, а из wsock32.dll
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    juggler
    Разниц нет, это обёртка вокруг калбэков. В win2k сурцах кстате всё есть полностью, так что это опенсурс. Единственный нюанс это енум описателей с их захватом проблемный. Тоесть код что выше он статический, юзается есчо до инициализации, тогда копия таблицы калбэков будет разослана. Проблема в захвате уже инициализированных описателей(хотя не проблема, нужно найти sm_context_table, она юзается WahReferenceContextByHandle(), енумить описатели и модифицировать таблицы).