Что бы перехватить весь трафик нужно написать драйвер поверх NDIS. Какие функции нужно перехватывать? И действительно ли хватит драйвера только поверх NDIS или нужно ещё поверх TDI?
вообще то к примеру последний аутпост вешается поверх tcpip.sys, то есть является клиентом tdi и этого достаточно) Думай сам, реши, может лучше фильтровать что то конкретное ?
Пробовал организовать сквозной перехват NDIS как сказано в статье http://www.rootkit.com/newsread.php?newsid=219 (нахождение списка структур NDIS_OPEN_BLOCK в памяти и перехват обработчиков PostNt31ReceiveHandler и SendHandler) Естественно, дело пошло не без багов. Почему-то то, что располагалось в памяти по адресу NDIS_OPEN_BLOCK не совпадало с определением этой структуры из сорцов винды и ReactOS ) В результате мне (пользуясь SoftICE) удалось перехватить только SendHandler. Сорри что нет конкретики, приду сегодня домой, все запощу ж) Может кто-нибудь пробовал копать по этой теме? Дело в том, что если грамотно хукнуть TDI и NDIS, можно организовать прозрачный обход любых фаеров.
Вобщем ситуация следующая ж) Сначала мы вызываем NdisRegisterProtocol и передаем ему пустой протокол Код (Text): NdisZeroMemory(&BogusProtocol,sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); BogusProtocol.MajorNdisVersion = 0x04; BogusProtocol.MinorNdisVersion = 0x0; NdisInitUnicodeString(&ProtocolName,L"BogusProtocol"); BogusProtocol.Name = ProtocolName; BogusProtocol.ReceiveHandler = DummyNDISProtocolReceive; KdPrint(("ReceiveHandler=%08x\n", BogusProtocol.ReceiveHandler)); BogusProtocol.BindAdapterHandler = DummyProtocolBindAdapter; BogusProtocol.UnbindAdapterHandler = DummyProtocolUnbindAdapter; NdisRegisterProtocol(&Status,&hBogusProtocol,&BogusProtocol, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); Этот вызов возвращает хендл (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 ?
valinor Очень прошу, напиши мне в icq 5877107. Нам есть о чем поговорить. Я месяц копаю структуры NDIS-a, уже написан рабочий код, рубящий Outpost на NDIS'е. Нужна помощь в TDI.
Кстати, в ndis.h XPDDK PostNt31ReceiveHandler'а уже нет. Вернее он есть, но по всей видимости называется просто ReceiveHandler. ((NDIS_OPEN_BLOCK)BindingHandle)->CommonOpenBlock->ReceiveHandler - вот собственно и он.