Home › Forums › Discussions › Support › Вопрос по ndisapi Изменение размера пакета
- This topic has 3 replies, 2 voices, and was last updated 15 years, 7 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.