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

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

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
      Keymaster

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

        #6796
        Genuine
        Participant

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

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

          #6797
          Vadim Smirnov
          Keymaster

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

          Viewing 4 posts - 1 through 4 (of 4 total)
          • You must be logged in to reply to this topic.