2010-11-29 5 views
2

Я использую pcap для захвата TCP-пакетов, для которых я хотел бы проанализировать полезную нагрузку. Моя стратегия заключается в следующем:Как разобрать полезную нагрузку TCP-пакета

  1. Получить заголовок локальных сетей и проверить, если он имеет тип ETHERTYPE_IP (IP пакетов)
  2. Проверьте, если пакет IP имеет протокол IPPROTO_TCP (TCP пакетов)
  3. Проверка на размер полезной нагрузки > 0 (size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header)).

  4. синтаксического анализа полезной нагрузки (захватить хоста URL)

я не начал разбор полезной нагрузки еще потому, что я получаю расхождения. Ниже приведена распечатка полезной нагрузки из 10 захваченных пакетов TCP, используя фильтр "host = www.google.com".

номер пакета: 3: TCP Packet: Порт источника: 80 Dest Port: 58723 Нет данных в пакете

номер пакета: 4: TCP Packet: Порт источника: 58723 Dest Port: 80 нет данных в пакете

номер пакета: 5: TCP Packet: Порт источника: 58723 Dest Port: 80 Payload: GET/HTTP/1.1 Ведущий: www.goo gle.com User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-us) AppleWebKit/533.19.4 (KHTML, например, Gecko) Версия/5.0.3 Safari/533.19. Принять: application/xml, application/xhtml + xml, text/html; q = 0.9, text/plain; q = 0,8, image/png, /; q = 0,5 Принимаем-Язык: en-us Принимаем-кодировать: gzip, deflate Cookie: THICNT = 25; SID = DQAAAKIAAAB2ktMrEftADifGm05WkZmlHQsiy1Z2v- соединения: держать-жив

номер пакета: 6: TCP Packet: Порт источника: 80 Dest Port: 58723 Нет данных в пакете

номер пакета: 7: TCP Packet : Порт источника: 80 Dest Port: 58723 Полезная нагрузка: \ 272 ن u \ 243 \ 255 \ 375 \ 375} \ 336H \ 221 \ 227 \ 206 \ 312 ~ \ 322 \ 317N \ 236 \ 255A \ 343 # \ 226 \ 370 ֤ \ 245 [\ 327` \ 306 ը nE \ 263 \ 204 \ 313 \ 356 \ 3268) p \ 344 \ 301_Y \ 255 \ 267 \ 240 \ 222x \ 36 444441 номер 4620935846510408888 пакет: 8: TCP Packet: Порт источника: 58723 Dest Port: 80 Нет данных в пакете

номер пакета: 9: TCP Packet: Порт источника: 80 Dest Port: 58723 Полезная нагрузка: HTTP/1.1 200 OK Дата: Пн, 29 Ноя 2010 10:11:36 GMT Истекает: -1 Cache-Control: private, max-age = 0 Content-Type: text/html; charset = UTF-8 Контент-кодирование: gzip Сервер: gws Контент-длина: 8806 X-XSS-Protection: 1; mode = block \ 213

Почему существует несоответствие в полезной нагрузке и в портах? В идеале я хотел бы только анализировать пакеты, такие как пакет 5. Как игнорировать пакеты вроде 7 и 9?

+0

Неясно, какую часть пакета вы хотите фильтровать. Я осмеливаюсь, что это источник или порт назначения. – sashang

+0

Я хотел бы захватить URL-адрес хоста. Я обнаружил, что, отфильтровывая пакеты с портом назначения 80, мне удается «отсеять» нежелательные, но что происходит, когда кто-то обращается к URL-адресу на нестандартном порту? – David

+0

Например, ssh и ssl шифруют данные. Эти пакеты будут похожи на те, которые вы не хотите. FWIW может быть такой объем трафика. Используйте регулярное выражение (regex.h) для выбора пакетов - regcomp, regexec и т. Д. Ищите пакеты с блоками читаемых символов. –

ответ

6

Только путем анализа содержимого. Ничто в заголовке IP или TCP не может помечать пакеты HTTP Request. Даже «первый пакет данных в соединении» не будет работать, потому что существуют постоянные соединения.

Кроме того, чтобы быть уверенным в том, что вы поймаете все URI, вам необходимо собрать TCP-поток и проанализировать HTTP-запрос: URI можно разделить на два или более пакета.

2

Как и заголовок IP, заголовок TCP также является переменной длиной. Вы не принимаете это во внимание. Вместо того, чтобы слепо вычитать sizeof(struct tcp_header)) из общего размера пакета, вам нужно найти заголовок TCP в IP-данных, а затем использовать его поле длины (которое необходимо умножить на 4, как и поле длины заголовка IP), чтобы знать, где фактическая полезная нагрузка данных.

2

Расчета Вашего размера неправильно - вы не можете сделать вычитание в сети-хост-заказе, вы должны преобразовать каждое поле для размещения байт порядка первый:

size = ntohs(ip_header->total_length) - ntohs(ip->header_length) * 4 - sizeof(struct tcp_header)) 

Однако, как Remy Lebeau точек вам действительно нужно изучить поле offset в заголовке TCP, чтобы узнать, где начинается полезная нагрузка.

Разница между пакетом 5 и 7 пакета является то, что бывший собирается от клиента, на сервер, а последний ответ от сервера к клиенту. Вот почему порты переключаются - также будут переключаться адреса источника и получателя.

Если вы хотите посмотреть только пакеты, поступающие от клиента, проверьте, что исходный адрес равен адресу клиента.

+0

спасибо, я изменил это в своем коде. – David