![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Guest_shedon |
|
|||
|
Unregistered |
Есть небольшой код который ловит IP пакеты и читает их заголовки:
Как прочитать сам пакет ? И узнать порт по которому он шел ? (Используется winsock2) |
|||
|
||||
| DarkDS |
|
|||
|
Unregistered |
У тебя есть длинна и смещение... вот и считываешь по этим данным пакет после заголовка...
Почитай доки по протоколам на досуге... |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
ответ как всегда прост.
другими словами прочитай заголовок, определи длину, и прочитай еще в буффер пакет длиной которую определил -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| DarkDS |
|
|||
|
Unregistered |
Кстати... Флаги и смешения (iph_offset) там не просто так:
Поле Флаги указывает на факт фрагментации пакета, а также на наличие или отсутствие последующих пакетов при фрагментации. Поле Смещение фрагмента используется для указания в байтах смещения поля данных этого пакета от начала общего поля данных исходного пакета, подвергнутого фрагментации. Используется при сборке/разборке фрагментов пакетов при передачах их между сетями с различными величинами максимальной длины пакета. Получить порт можно разшифровав тело пакета: Надеюсь ты знаешь технологию передачи пакетов? но на всякий случай скажу, что в пакете протокола IP будет лежать еще один пакет - протокола ТCP, а в нем лежт пакет высокого уровня... кстати тип последнего пакета указывается полем протокол (iph_protocol)... Так вот порт указывается как раз в пакете ТСП или выше, зависит от ситуации... |
|||
|
||||
| DarkDS |
|
|||
|
Unregistered |
Сорри Запамятовал... в пакете ИП может лежать либо ТСП, ЛИБО UDP протоколы... Порт чаще всего пишется в них...
Вот такая вот загагулина! В общем почитай книжки по протоколам... помогает |
|||
|
||||
| Guest_Shedon |
|
|||
|
Unregistered |
А можно както конкретно определить где лежит порт, зная протокол ?
|
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Что значит "конкретно" - заголовок TCP является стандартным и у него на определенном месте стоит номер порта. Точное местоположение я не вспомню - надо смотреть документацию. Те же RFC. |
|||
|
||||
| Guest_Shedon |
|
|||
|
Unregistered |
У меня почемуто неправильновычисляется размер заголовка, почти всегда кажет "69". Возможно с "iph_verlen", надо провести какието преобразования ?
|
|||
|
||||
| DarkDS |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 748 Регистрация: 6.5.2003 Где: Таллинн, Эстония Репутация: нет Всего: 16 |
Все поясняется очень просто - старшие пол байта (4 бита) есть длинна заголовка... Младшие 4 - это версия протокола...
То есть чтобы получить истинную длинну протокола тебе нужно взять старшие 4 бита... самый просто способ - сдвиг в право на 4 бита Это сообщение отредактировал(а) DarkDS - 7.5.2003, 11:19 |
|||
|
||||
| Guest_Shedon |
|
|||
|
Unregistered |
Он всегда показывает 4 байта
|
|||
|
||||
| DarkDS |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 748 Регистрация: 6.5.2003 Где: Таллинн, Эстония Репутация: нет Всего: 16 |
Какие 4 байта UCHAR iph_verlen; если мне еще не изменяет память (а она мне врядли изменяет) UCHAR - это беззнакомый чар размер - 1 байт. Из этого байта 4 бита - версия, 4 бита - длинаа. Вот к примру чило 69. если брать по битам то это 01000101 соответсвенно разобьются на 0100 и 0101. Старшие биты (7-4) = 0100 есть длинна загововка... младшие(3-0) 0101 - версия... |
|||
|
||||
| DarkDS |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 748 Регистрация: 6.5.2003 Где: Таллинн, Эстония Репутация: нет Всего: 16 |
Или ты имеешь ввиду что всегда приходит 0100?
ЗЫ. Забыл сказать - длина заголовка измеряется в 4-х байтных словах Это сообщение отредактировал(а) DarkDS - 7.5.2003, 15:56 |
|||
|
||||
| Guest_Shedon |
|
|||
|
Unregistered |
Всё понётно я просто не вту сторону смещал, и получается 5, тоесть 20 байт.
|
|||
|
||||
| DarkDS |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 748 Регистрация: 6.5.2003 Где: Таллинн, Эстония Репутация: нет Всего: 16 |
ЗЫ... Кстати... Длинна пакета исчесляется с учетом заголовка.
Смещение используется только тогда, когда происходит фрагментация пакета. Смешение указывает на позицию данных, относительно начала (данных). Так же смещение всегда (кроме последнего пакета) должно быть кратно 8... Правда чаще всего смещение не используется, так как протокол ТСП при отсылке пакетов посылает их нужного размера... О iph_xsum объяснения нужны? |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
а как указать сокет, что бы перехватывало все пакеты
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |