WinDivert: изменение запроса GET в tcp пакете

Я пытаюсь изменить простой запрос GET с pydivert (WinDivert для python)

Кажется, я столкнулся с проблемой длины пакета.
когда я переписываю URL, чтобы он имел такое же количество букв или меньше, это работает:
то есть. GET /?a=asdf => GET /?a=z

Но когда я добавляю больше писем к запросу, браузер зацикливается и заканчивается, ничего не показывая

Ниже приведен пример кода, который я использую

filter_ = "true and tcp.PayloadLength > 0" 
with Handle(filter=filter_) as handle:

 while True:

        packet = handle.receive()

        if packet.payload[0:3]=="GET":
            packet.payload=packet.payload.replace("GET /?a=asdf","GET /?a=gfdsazzz")
        handle.send(packet)

а также

<?php
  echo $_GET['a'];
?>

Установлен ли где-то максимальный размер пакета. Если да, то как его увеличить?

Если это будет для вас подсказкой, то, если я распечатаю все пакеты в консоли, я ясно вижу, что сервер ответил на запрос, потому что в файле package.payload указано gfdsazzz

1 ответ

Решение

Непосредственная проблема заключается в том, что вы не обновили заголовки TCP/IP, чтобы отразить новую длину пакета.

Однако есть и другие более серьезные проблемы:

  1. Как вы упомянули, новый пакет может превышать максимальный размер пакета (MTU)
  2. Номера TCP Seq/Ack необходимо изменить, и они больше не будут синхронизированы между обоими концами соединения.
  3. РЕДАКТИРОВАТЬ: Другая проблема заключается в том, что URL-адрес может быть разделен между несколькими пакетами, особенно для длинных URL-адресов.

Вторая и третья проблемы не могут быть легко устранены.

Если вы хотите изменить потоки TCP с помощью WinDivert, гораздо лучшим решением будет использование WinDivert для перенаправления трафика на локальный прокси-сервер и прокси-сервер для редактирования потока. Для примера программы, которая использует эту идею, см. TorWall.

Другие вопросы по тегам