TDI & TDI_EVENT_RECEIVE & сниффер

Тема в разделе "WASM.NETWORKS", создана пользователем lilkiddd, 16 июл 2008.

  1. lilkiddd

    lilkiddd New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    7
    проблема такова - аттачусь к \\Device\\Tcp и не получаю входящих данных. судя по гуглу, надо перехватывать хэндлер TDI_EVENT_RECEIVE, либо регистрировать свой хэндлер (наверное, это более приемлемо).
    не знаю, с какой стороны подойти...

    зы.
    кусок dispatch, на который указывает интуиция... :) пардоньте, что на си.
    case TDI_SET_EVENT_HANDLER:
    if (((TDI_REQUEST_KERNEL_SET_EVENT*)&pIrpStack->Parameters)->EventType==TDI_EVENT_RECEIVE) {
    DbgPrint("TDI:dntknw:TDI_SET_EVENT_HANDLER) TDI_EVENT_RECEIVE\n");
    DbgPrint("----------------------------\n");
    };
    break;
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    lilkiddd
    Там нужно регистрировать свой обработчик callback'a ClientEventReceive.
    Смотри сорцы tdi_fw, ищи сабж на rsdn и читай MSDN, там все это описано.
     
  3. lilkiddd

    lilkiddd New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    7
    надумал перехватывать EventHandler, старый обработчик сохранять в односвязный список, в своем хэндлере вызывать чужой хэндлер по указателю из двусвязного списка.
    возник вопрос - хэндлеры вызываются в том же порядке, что и устанавливаются?
     
  4. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    lilkiddd
    На мой взгляд работать со списками не слишком удобно, потому что возникает необходимость сохранения еще кучи необходимой информации, типа контекста и др. Попробуй реализовать через хеширование, как в tdi_fw.
     
  5. Quark

    Quark New Member

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

    обязательно ли перехватывать обработчики IRP_MJ_INTERNAL_DEVICE_CONTROL, IRP_MJ_CLOSE, IRP_MJ_CREATE, IRP_MJ_READ, IRP_MJ_WRITE и прочие или же достаточно перехватить только IRP_MJ_DEVICE_CONTROL?

    вообще mswsock.dll при отправке и чтении пакетов вызывает ZwDeviceIoControlFile.. но ведь XP поддерживает ещё перенаправление ввода-вывода и можно создавать сокет и писать в него как в обычный файл...
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Quark
    Если речь идет о TDI-фильтре, то перехват IRP_MJ_INTERNAL_DEVICE_CONTROL обязателен, потому что он через себя протаскивает все самые интересные MN-функции - TDI_ASSOCIATE_ADDRESS, TDI_CONNECT, TDI_SET_EVENT_HANDLER, TDI_RECEIVE, TDI_SEND и т.д.
    Перехват IRP_MJ_CREATE нужен, если интересует создание "объекта локального адреса" и "объекта соединения".
    Остальное, на мой взгляд, не обязательно.
     
  7. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Вообще посмотрел я на этот TDI интерфейс... Я как-то писал протокольный NDIS снифер - так помойму на уровне NDIS ловить пакетики даже попроще. единственное - нужно собирать фреймы в пакеты и вытаскивать из них данные (с протоколом TCP не так-то просто).

    А в висте так вообще от TDI отказались - только в качестве совместимости оставили.

    Вот я и думаю как лучше поступить, на каком уровне ловить TCP трафик?
     
  8. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Уровень NDIS будет доступнее и надежнее, по-моему