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, чтобы отразить новую длину пакета.
Однако есть и другие более серьезные проблемы:
- Как вы упомянули, новый пакет может превышать максимальный размер пакета (MTU)
- Номера TCP Seq/Ack необходимо изменить, и они больше не будут синхронизированы между обоими концами соединения.
- РЕДАКТИРОВАТЬ: Другая проблема заключается в том, что URL-адрес может быть разделен между несколькими пакетами, особенно для длинных URL-адресов.
Вторая и третья проблемы не могут быть легко устранены.
Если вы хотите изменить потоки TCP с помощью WinDivert, гораздо лучшим решением будет использование WinDivert для перенаправления трафика на локальный прокси-сервер и прокси-сервер для редактирования потока. Для примера программы, которая использует эту идею, см. TorWall.