Вопрос по TDI-фильтру

Тема в разделе "WASM.NT.KERNEL", создана пользователем AlexCasual, 1 авг 2011.

  1. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    В TDI-фильтре перехватываю TDI_CONNECT и вывожу IP-адрес хоста,куда происходит коннект,но адреса не соответсвуют действительным P-адресам тех сайтов,куда коннектиться клиент...

    Вот вывод в DbgView :

    00000020 10.44689846 A TDI connect....
    00000021 10.44690609 IP address:port is 149.139.0.0:80

    Но реальный адрес сайта 169.55.52.221...

    В чём может быть продлема,наверное,я что-то неправильно понимаю в IP-адресации?

    Буду благодарен за помощь)
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Есть подозрение, что ты неправильно работаешь с TDI-структурами адресов. Там, на самом деле, не всё так очевидно с первого взгляда. Показывай код Connect-обработчика своего.
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    AlexCasual
    1) IP-адрес не может содержать 0, т.ч. 149.139.0.0 - точно неверный
    2) А 169 - это по-моему Винда раздает, когда DHCP включен, но нет сервера.
     
  4. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Вот код :

    if(StackIrpPointer->MinorFunction == TDI_CONNECT)
    {

    TDI_connectRequest = (PTDI_REQUEST_KERNEL_CONNECT)(&StackIrpPointer->Parameters);
    TA_Address_data = ((PTRANSPORT_ADDRESS)\
    (TDI_connectRequest->RequestConnectionInformation- RemoteAddress ))->Address;
    TDI_data = (PTDI_ADDRESS_IP)(TA_Address_data->Address);

    Address = TDI_data->in_addr;
    Port = TDI_data->sin_port;

    data.address[0] = (( char *)& Address )[0];
    data.address[1] = (( char *)& Address )[1];
    data.address[2] = (( char *)& Address )[2];
    data.address[3] = (( char *)& Address )[3];

    data.port[0] = (( char *)& Port )[0];
    data.port[1] = (( char *)& Port )[1];

    Port = data.port[0] + data.port[1];

    DbgPrint (" TCP address is %d.%d.%d.%d:%d \r\n",data.address[0],data.address[1],data.address[2],data.address[3],Port);
    }
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    AlexCasual
    Поле TDI_connectRequest -> RequestConnectionInformation -> RemoteAddress следует использовать как указатель на структуру TA_IP_ADDRESS, ну а дальше понятно. И не забываем проверять такие поля как TAAddressCount и AddressType, - на всякий случай.
     
  6. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Вот полный код функции :

    NTSTATUS InternalTdiComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
    PTDI_REQUEST_KERNEL_CONNECT TDI_connectRequest;
    PTA_ADDRESS TA_Address_data;
    PTDI_ADDRESS_IP TDI_data;

    ULONG Address;
    ULONG Port;
    NETWORK_ADDRESS data;

    PIO_STACK_LOCATION StackIrpPointer = IoGetCurrentIrpStackLocation(Irp);

    if(!StackIrpPointer)
    {
    DbgPrint (" Fatal Error : IRP stack pointer is NULL ! \r\n");
    return STATUS_UNSUCCESSFUL;
    }

    if(StackIrpPointer->MinorFunction == TDI_CONNECT)
    {
    DbgPrint ("A TDI connect ( Function 3) via TCP was invoked !\r\n");

    TDI_connectRequest = (PTDI_REQUEST_KERNEL_CONNECT)(&StackIrpPointer->Parameters);
    TA_Address_data = ((PTRANSPORT_ADDRESS)(TDI_connectRequest->RequestConnectionInformation->RemoteAddress ))->Address;
    TDI_data = (PTDI_ADDRESS_IP)(TA_Address_data->Address);

    Address = TDI_data->in_addr;
    Port = TDI_data->sin_port;

    data.address[0] = (( char *)& Address )[0];
    data.address[1] = (( char *)& Address )[1];
    data.address[2] = (( char *)& Address )[2];
    data.address[3] = (( char *)& Address )[3];

    data.port[0] = (( char *)& Port )[0];
    data.port[1] = (( char *)& Port )[1];

    Port = data.port[0] + data.port[1];

    DbgPrint (" TCP address is %d.%d.%d.%d:%d \r\n",data.address[0],data.address[1],data.address[2],data.address[3],Port);
    }


    if( Irp->PendingReturned)
    {
    IoMarkIrpPending(Irp);
    }

    return Irp->IoStatus.Status;
    }

    Как и говорилось выше,не могу понять почему получается какой-то "хромой IP"....
     
  7. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Может быть это IP,которые раздаёт DHCP?
    Я не могу понять почему так...Определяю все структуры вроде правильно...
    Может есть у кого-нибудь сооброжения по этому поводу?
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Сделай вывод адреса в Pre-Connect, т.е. в функции диспетчеризации, и напиши, что получилось.
     
  9. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Адрес с функции диспетчеризации такой же как и в функции завершения....

    Pre-connect TCP address is 134.42.0.0:80
    Post-connect TCP address is 134.42.0.0:80
     
  10. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    AlexCasual
    А ntohl использовать не пробовал вместо ручного разбора адреса?
    Хотя, не, вру, он тож самое должен делать...
     
  11. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Откуда ты этот код взял? http://www.iseclab.org/papers/Writing_TDI_Drivers.pdf?
     
  12. maxxx777

    maxxx777 New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2011
    Сообщения:
    13
    AlexCasual
    Код верный. У меня нормально определяет удаленный адрес/порт.

    Единственно у вас в коде не хватает:

    ...

    TDI_data = (PTDI_ADDRESS_IP)(TA_Address_data->Address);

    IoSkipCurrentIrpStackLocation(Irp);
    ntstatus = IoCallDriver(DeviceExtension->TopOfDeviceStack, Irp);


    Address = TDI_data->in_addr;
    ...
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Перепиши код с учётом того, что я сказал в #5.
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Что это за ересь в функции завершения?
     
  15. maxxx777

    maxxx777 New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2011
    Сообщения:
    13
    Это не для функции завершения, а для функции перехвата IRP_MJ_INTERNAL_DEVICE_CONTROL.
     
  16. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    А с чего ты вообще взял, что у него нет этого кода? И почему предлагается вставить этот код в такое странное место? Мне кажется, тебе всё же стоит подумать ещё раз, прежде, чем писать дальше. Что касается проблемы автора, то я пока сам не очень понимаю, в чём дело. Теоретически, со структурами он работает правильно, хоть и не совсем удобно (удобнее как я указал в #5). Единственное, смущает отсутствие вообще каких бы то ни было проверок, например, кол-во адресов и их типы, - может у него там вообще IPv6, тогда по-другому надо делать. Стоит добавить проверки и чуть переписать работу со структурами, и не забывать писать в отладочный вывод все эти моменты, а потом видно будет. Такие дела.
     
  17. maxxx777

    maxxx777 New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2011
    Сообщения:
    13
    Почему странное место?
     
  18. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    maxxx777
    Вы просто с x64 друг друга не поняли.
    x64 абсолютно прав, аффтар топика определил функцию завершения - InternalTdiComplete и в ней пытается определить адрес удаленного хоста. Делает вроде все правильно, но скорее что-то путает со структурами.
    Сам код функции, как я понимаю, скопипасщен вот отсюда http://www.iseclab.org/papers/Writing_TDI_Drivers.pdf.
    Ты же путаешь функцию завершения InternalTdiComplete с dispath-обработчиком IRP_MJ_INTERNAL_DEVICE_CONTROL, в котором, как вариант, можно определить
    IoSkipCurrentIrpStackLocation(Irp);
    ntstatus = IoCallDriver(DeviceExtension->TopOfDeviceStack, Irp);
    Однако, как уже сказал x64, в функции завершения InternalTdiComplete этому коду совершенно не место.
     
  19. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Посмотри внимательно на свой код в #12 и подумай.
     
  20. maxxx777

    maxxx777 New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2011
    Сообщения:
    13
    x64

    Я копирую &StackIrpPointer->Parameters->RequestConnectionInformation->RemoteAddress->Address->Address
    в TDI_data:
    Отправляю IRP дальше:
    Работаю со структурой TDI_data, в которую скопировал адрес/порт:
    Объясните, в чем ошибка.