NDIS

Тема в разделе "WASM.NETWORKS", создана пользователем new_s, 26 янв 2006.

  1. new_s

    new_s New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    16
    Адрес:
    Беларусь
    Что бы перехватить весь трафик нужно написать драйвер поверх NDIS.

    Какие функции нужно перехватывать?

    И действительно ли хватит драйвера только поверх NDIS или нужно ещё поверх TDI?
     
  2. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    вообще то к примеру последний аутпост вешается поверх tcpip.sys, то есть является клиентом tdi и этого достаточно) Думай сам, реши, может лучше фильтровать что то конкретное ?
     
  3. valinor

    valinor New Member

    Публикаций:
    0
    Регистрация:
    7 май 2005
    Сообщения:
    27
    Пробовал организовать сквозной перехват NDIS

    как сказано в статье

    http://www.rootkit.com/newsread.php?newsid=219



    (нахождение списка структур NDIS_OPEN_BLOCK в памяти и перехват обработчиков PostNt31ReceiveHandler и

    SendHandler)

    Естественно, дело пошло не без багов.

    Почему-то то, что располагалось в памяти по адресу

    NDIS_OPEN_BLOCK не совпадало с определением этой структуры из сорцов винды и ReactOS :dntknw:)

    В результате мне (пользуясь SoftICE) удалось перехватить только SendHandler.

    Сорри что нет конкретики, приду сегодня домой, все запощу ж)



    Может кто-нибудь пробовал копать по этой теме?

    Дело в том, что если грамотно хукнуть TDI и NDIS, можно организовать прозрачный обход любых фаеров.
     
  4. valinor

    valinor New Member

    Публикаций:
    0
    Регистрация:
    7 май 2005
    Сообщения:
    27
    Вобщем ситуация следующая ж)

    Сначала мы вызываем NdisRegisterProtocol и передаем ему пустой протокол


    Код (Text):
    1.  
    2.     NdisZeroMemory(&BogusProtocol,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
    3.     BogusProtocol.MajorNdisVersion = 0x04;
    4.     BogusProtocol.MinorNdisVersion = 0x0;
    5.    
    6.     NdisInitUnicodeString(&ProtocolName,L"BogusProtocol");
    7.     BogusProtocol.Name = ProtocolName;
    8.     BogusProtocol.ReceiveHandler = DummyNDISProtocolReceive;
    9.     KdPrint(("ReceiveHandler=%08x\n", BogusProtocol.ReceiveHandler));
    10.     BogusProtocol.BindAdapterHandler = DummyProtocolBindAdapter;
    11.     BogusProtocol.UnbindAdapterHandler = DummyProtocolUnbindAdapter;
    12.    
    13.     NdisRegisterProtocol(&Status,&hBogusProtocol,&BogusProtocol,
    14.         sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
    15.  


    Этот вызов возвращает хендл (hBogusProtocol) который не что иное как указатель на структуру, которая связана с аналогичными структурами остальных протоколов (2связный список).



    hprot = RegisterBogusNDISProtocol();

    ProtocolPtr = (UINT*)hprot;



    затем мы можем пробежаться по этому списку, переходя к следующему элементу следующим образом:

    ProtocolPtr = (UINT*)((PUCHAR)ProtocolPtr + sizeof(REFERENCE) + 8);

    ProtocolPtr = (UINT*)(*ProtocolPtr);



    Затем покопавшись в дампах я пришел к следующим выводам:

    - первый DWORD в этих структурах - указатель на структуру, похожую на NDIS_OPEN_BLOCK

    - в этой структуре по смещению 5C расположен указатель на SendHandler для данного протокола. Перехват этого вызова во всех протоколах дает контроль над исходящим трафиком.

    Но найти указатель на PostNt31ReceiveHandler к сожалению не удалось =(

    Ресерч проводился на Windows XP SP2.



    Возникает вопрос: как найти указатели на PostNt31ReceiveHandler ?
     
  5. Noah

    Noah New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2006
    Сообщения:
    5
    Адрес:
    Russia
    valinor

    Очень прошу, напиши мне в icq 5877107.

    Нам есть о чем поговорить.

    Я месяц копаю структуры NDIS-a, уже написан рабочий код, рубящий Outpost на NDIS'е. Нужна помощь в TDI.
     
  6. Noah

    Noah New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2006
    Сообщения:
    5
    Адрес:
    Russia
    Кстати, в ndis.h XPDDK PostNt31ReceiveHandler'а уже нет. Вернее он есть, но по всей видимости называется просто ReceiveHandler.

    ((NDIS_OPEN_BLOCK)BindingHandle)->CommonOpenBlock->ReceiveHandler - вот собственно и он.