@ed_milson
Я

Как изменить длину TCP/IP пакета?

Всем привет. Помогите пожалуйста. Я ловлю пакет TCP, изменяю данные в нем( они идут как раз после заголовка TCP) и отправляю далее. Когда просто ловлю и отправляю работает. Когда заменяю какую-то букву в тексте( данные после заголовка TCP), считатаю checksum TCP и записываю в заголовок новую checksum TCP , отправляет.

Но когда изменяю длину, а именно дописываю несколько слов к данным и заменяю последнее слово и пишу в поток(стек сетевой) пакет со старой длиной( checksum тоже по старой длине посчитан) то отправляет, а когда пишу в поток(стек сетевой ) количество байт больше чем пакет который я получил то ни checksum не считает ни отправляет без неё.

Я подозреваю что надо еще в первых 40 байтах пакета там где заголовки изменить что-то. (После 40 байт из 41 уже идут данные). Я прочитал https://en.wikipedia.org/wiki/IPv4 там есть таблица IPv4 Header Format и там в некоторых заголовках хранится длина. Но в програме WireShark длина хранится и в IP и в TCP заголовках(так показывает крайней мере (фото 2)).
  • Вопрос задан
  • 1545 просмотров
Решения вопроса 1
@ed_milson Автор вопроса
Я
Получилось изменть длинну пакета, в самом TCP не нужно менять, а в IP заголовке нужно изменить длинну. Но так как это пакет из сокета, то на лету изменяется зсув ACK и программа которая отправила ожидает ACK который она отправила, а не который изменила другая программа.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
15432
@15432
Системный программист ^_^
В Wireshark когда вы выделяете поле в описании пакета, автоматически выделяется то самое значение в пакете, откуда Wireshark и взял цифру. Их и нужно поменять.

Модифицировать заголовки на IP уровне непросто будет. Если есть возможность, проще влезть посередине канала на уровне TCP и просто перенаправлять данные туда-обратно. Как прокси.
Ответ написан
Комментировать
Отправитель и получатель ведут счетчики SEQ и ACK. Если Вы изменяете длину пакета, Вы нарушаете логику этих счетчиков. То есть с того момента, как Вы увеличили или уменьшили длину пакета во всех последующих в рамках этого сеанса Вам нужно изменять на эту же величину SEQ в прямом направлении и ACK в обратном. А лучше встать как советует 15432 по технологии tcp-port-mapper, если Вам принципиально иметь возможность изменять длину.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы