Вопрос по ndisapi Изменение размера пакета

Home Forums Discussions Support Portal Вопрос по ndisapi Изменение размера пакета

This topic contains 3 replies, has 2 voices, and was last updated by  Vadim Smirnov 8 years, 6 months ago.

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #5282

    Genuine
    Participant

    Библиотека 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 не работает если длина пакета превышает исходный размер.

    Заранее спасибо!

    #6795

    Vadim Smirnov
    Moderator

    Нет там никакой структурки, это случайное дополнение – мусорные байты. В сеть можно закинуть пакет любого размера не превышающего допустимый сетевым адаптером, в случае ethernet общий размер пакета не может превышать 1514 байт. Если Iris видит пакет значит в сеть он ушел, можно его перехватить в точке назначения для верности. Другое дело что стек принимающей системы мог забраковать пакет, увеличение размера TCP данных не совсем тривиальная задача, нужно учитывать меняющиеся SEQ/ACK поля.

    #6796

    Genuine
    Participant

    Размер подопытных пакетов – 700-800 байт, поэтому 1514 байт хватит с запасом

    Похоже, действительно, гдето памяти не хватает на “увеличенный” пакет.
    Если предположить, что пакеты кладутся в непрерывную память один за другим, то можно затереть часть следующего пакета….
    хм… кстати, Iris перехватывал неправильные пакеты в начале которых было совсем не то, что нужно.
    и эти “неправильные” пакеты следовали за “увеличенными”
    Спасибо за ответ, попробую, ещё, принять в точке назначения…

    #6797

    Vadim Smirnov
    Moderator

    Ккие-то проблемы в вашем коде, никаких наложений и затираний быть не может, память под пакеты идет фиксированными буферами, даже если пакет 14 байт, то все равно под него выделено 1514.

Viewing 4 posts - 1 through 4 (of 4 total)

You must be logged in to reply to this topic.