В 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-адресации? Буду благодарен за помощь)
Есть подозрение, что ты неправильно работаешь с TDI-структурами адресов. Там, на самом деле, не всё так очевидно с первого взгляда. Показывай код Connect-обработчика своего.
AlexCasual 1) IP-адрес не может содержать 0, т.ч. 149.139.0.0 - точно неверный 2) А 169 - это по-моему Винда раздает, когда DHCP включен, но нет сервера.
Вот код : 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); }
AlexCasual Поле TDI_connectRequest -> RequestConnectionInformation -> RemoteAddress следует использовать как указатель на структуру TA_IP_ADDRESS, ну а дальше понятно. И не забываем проверять такие поля как TAAddressCount и AddressType, - на всякий случай.
Вот полный код функции : 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"....
Может быть это IP,которые раздаёт DHCP? Я не могу понять почему так...Определяю все структуры вроде правильно... Может есть у кого-нибудь сооброжения по этому поводу?
Адрес с функции диспетчеризации такой же как и в функции завершения.... Pre-connect TCP address is 134.42.0.0:80 Post-connect TCP address is 134.42.0.0:80
AlexCasual А ntohl использовать не пробовал вместо ручного разбора адреса? Хотя, не, вру, он тож самое должен делать...
AlexCasual Код верный. У меня нормально определяет удаленный адрес/порт. Единственно у вас в коде не хватает: ... TDI_data = (PTDI_ADDRESS_IP)(TA_Address_data->Address); IoSkipCurrentIrpStackLocation(Irp); ntstatus = IoCallDriver(DeviceExtension->TopOfDeviceStack, Irp); Address = TDI_data->in_addr; ...
А с чего ты вообще взял, что у него нет этого кода? И почему предлагается вставить этот код в такое странное место? Мне кажется, тебе всё же стоит подумать ещё раз, прежде, чем писать дальше. Что касается проблемы автора, то я пока сам не очень понимаю, в чём дело. Теоретически, со структурами он работает правильно, хоть и не совсем удобно (удобнее как я указал в #5). Единственное, смущает отсутствие вообще каких бы то ни было проверок, например, кол-во адресов и их типы, - может у него там вообще IPv6, тогда по-другому надо делать. Стоит добавить проверки и чуть переписать работу со структурами, и не забывать писать в отладочный вывод все эти моменты, а потом видно будет. Такие дела.
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 этому коду совершенно не место.
x64 Я копирую &StackIrpPointer->Parameters->RequestConnectionInformation->RemoteAddress->Address->Address в TDI_data: Отправляю IRP дальше: Работаю со структурой TDI_data, в которую скопировал адрес/порт: Объясните, в чем ошибка.