- This topic has 3 replies, 2 voices, and was last updated 16 years, 6 months ago by Vadim Smirnov. 
- 
		AuthorPosts
- 
		
			
				
April 19, 2009 at 4:37 pm #5282Библиотека ndisapi позволяет перехватывать пакеты TCP 
 Используя Api->ReadPacket(&Request) мы вычитываем пакеты
 Далее пакет модифицируется и отправляется дальше вызовом Api->SendPacketToAdapter(&Request)
 Здесь всё работает, если размер пакета не изменяется или меньше исходногоВопрос заключается в том, что необходимо дополнить пакет, увеличить его длину 
 И здесь возникают непонятные проблеммы.
 Устанавливаем Request.EthPacket.Buffer->m_Length и IPv4.total_length отправляем
 в снифере Iris видим, что пакет модифицировался, стал больше и контрольные суммы правильные
 но в сеть, похоже, что не отправляется.Стал разбираться в чем дело 
 По определению
 struct _INTERMEDIATE_BUFFER
 {
 LIST_ENTRY m_qLink;
 ULONG m_dwDeviceFlags;
 ULONG m_Length;
 ULONG m_Flags; // NDIS_PACKET flags
 UCHAR m_IBuffer [MAX_ETHER_FRAME];
 } INTERMEDIATE_BUFFER, *PINTERMEDIATE_BUFFER;сохранил в файл буфер Request.EthPacket.Buffer->m_IBuffer длиной MAX_ETHER_FRAME 
 И обнаружил, что в конце m_IBuffer 43 байта содержат какието данные
 похожие на поля неизвестной структуры. В том числе строка “DEVICENDISWANIP”Это не может быть случайным, потомучто Request.EthPacket.Buffer зануляется перед чтением пакета 
 А после чтения там появляется эта структурка постоянноТеперь сформулирую вопрос. Как можно интерпретировать эти “дополнительные” данные 
 И как увеличить размер пакета (не более MAX_ETHER_FRAME, естественно)
 Простое присвоение Request.EthPacket.Buffer->m_Length и IPv4.total_length не работает если длина пакета превышает исходный размер.Заранее спасибо! April 20, 2009 at 2:14 pm #6795Нет там никакой структурки, это случайное дополнение – мусорные байты. В сеть можно закинуть пакет любого размера не превышающего допустимый сетевым адаптером, в случае ethernet общий размер пакета не может превышать 1514 байт. Если Iris видит пакет значит в сеть он ушел, можно его перехватить в точке назначения для верности. Другое дело что стек принимающей системы мог забраковать пакет, увеличение размера TCP данных не совсем тривиальная задача, нужно учитывать меняющиеся SEQ/ACK поля. April 21, 2009 at 3:57 pm #6796Размер подопытных пакетов – 700-800 байт, поэтому 1514 байт хватит с запасом Похоже, действительно, гдето памяти не хватает на “увеличенный” пакет. 
 Если предположить, что пакеты кладутся в непрерывную память один за другим, то можно затереть часть следующего пакета….
 хм… кстати, Iris перехватывал неправильные пакеты в начале которых было совсем не то, что нужно.
 и эти “неправильные” пакеты следовали за “увеличенными”
 Спасибо за ответ, попробую, ещё, принять в точке назначения…April 22, 2009 at 7:15 pm #6797Ккие-то проблемы в вашем коде, никаких наложений и затираний быть не может, память под пакеты идет фиксированными буферами, даже если пакет 14 байт, то все равно под него выделено 1514. 
- 
		AuthorPosts
- You must be logged in to reply to this topic.
