Raw socket патч для tcpip.sys

Тема в разделе "WASM.NT.KERNEL", создана пользователем slesh, 14 мар 2010.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Как всем известно, MS в своих патчах хорошо испортила работу с сырыми сокетами из юзермода. А именно полный запрет посылки самостоятельно сконструированных TCP пакетов.

    Собственно говоря идея:
    в tcpip.sys (вроде там) идет блокировка сырых пакетов с флагом iph->ip_p = IPPROTO_TCP;
    С другими флагами всё норм проходит. И вот идея: пропатчить из своего драйвера код, который как раз фильтрует это. Достаточно тока этого, потому как данные будут отсылаться с реального IP.

    Хотелось бы узнать по подробнее, кому нибудь удавалось такое делать? и какими методами?
    Наиболее интересует под WinXP/Win2k3. Можно конечно и под w7 )
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Иди уж на NDIS-уровень сразу, таких заморочек точно не будет )
     
  3. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    В том-то и дело, что драйвер должен сделать так, чтобы прикладные программы смогли выполнять отправку сырых TCP пакетов, через стандартные команды.
    Както не очень хочется создавать прослойку для непосредственной передачи данных через ndis, тем более придется еще разбирать таблицу маршрутизации, чтобы знать на какой интерфейс посылать пакеты.
     
  4. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    тут в принципе можно по сигнатурам найти места.
    Вот небольшие рассуждения. Загнал в IDA файлик tcpip.sys
    прогнал всё через HEX Ray. из всего кода наиболее подходящим показался этот:
    Код (Text):
    1. KfReleaseSpinLock(v8, BYTE3(NewIrql));
    2. // тут выходит что v4 - начало IP пакета.
    3. // 9 - это офсет на протокол,
    4. // 6 как раз и есть IPPROTO_TCP
    5.         if ( *(_BYTE *)(v4 + 9) != 6 )
    6.           sub_455F6(
    7.             *(_DWORD *)(v4 + 16), // адрес получателя
    8.             *(_DWORD *)(v4 + 12), // адрес отправителя
    9.             *(_BYTE *)(v4 + 9), // протокол
    10.             v4 + (unsigned __int16)v9,
    11.             (unsigned __int16)a2);
    то есть по идее далее код выполняется если протокол не равен IPPROTO_TCP
    Пройдясь по коду дальше будет чтото типа перебора протоколов и получения адреса какойто функции взависимости от протокола. Такое ощущение что какие дополнительные обработчики.

    Пока что нужно будет попробовать пропатчить это место в файле. Хотя я сомневаюсь что это даст чтото путное