2010-11-20 5 views
1

как часть моего проекта, я пытаюсь отправить IP-пакеты, содержащие HTTP-запросы в Google. Я использую библиотеку Winpcap и VC++. В настоящее время у меня есть TCP-пакеты для трехсторонней передачи, но я застрял в отправке фактического пакета HTTP-запроса после отправки пакета TCP ACK. Когда я захватываю пакеты с помощью wirehark, этот пакет помечен как «сегмент TCP повторно собранного PDU». Столбец протокола - «TCP», а не «HTTP». Что не так? Как отправить HTTP-пакеты таким образом?отправить HTTP-запрос с использованием raw-сокета и WinPcap

ответ

1

Почему вы используете WinPCap для отправки пакетов? Вместо этого вы должны использовать обычные сокеты. Лучше используйте библиотеку сокетов, которая реализует для вас протокол HTTP, такой как завиток или даже собственные API WinInet или WinHTTP от Microsoft.

2

Вы не обязательно делаете что-то неправильно.

По умолчанию Wireshark передает данные TCP обработчику протокола более высокого уровня - в этом случае, который пытается собрать все HTTP-запросы и ответы. Он придает вновь собранного сообщение в окончательного пакета в последовательности, и маркирует другие пакеты с «TCP сегмента повторно собраны PDU»:

alt text

Вы можете отключить эту перекомпоновки функцию, чтобы исследовать отдельные пакеты :

  • Edit -> Preferences -> Протоколы -> TCP
  • Снимите флажок "Разрешить subdissector собрать TCP потоки"
1

Я бы очень хотел, чтобы вы изучили основы протокола HTTP, прежде чем пытаться это сделать, если планируете продлить это. Беспорядок с выполнением сырых сокетов и метанием запросов; прочитайте некоторый исходный код.

Тем не менее, я бы не видел точки pcap. Вы должны иметь возможность использовать библиотеку Wininet, если вы не хотите кодировать фактический сокет: Wininet lib

Однако, если вы хотите кодировать сырые сокеты, я бы пошел и использовал winsocks. Разница между HTTP и TCP трудно понять некоторым; HTTP основан на TCP, поэтому они технически все одинаковы, TCP используется для буквально тысяч приложений. Большинство подключений на вашем компьютере - TCP.

Если вы пытаетесь перехватить соединение как атаку MITM с помощью программы pcap для отправки HTTP-запроса, я бы, вероятно, научился программированию в Pcap. Для этого есть множество обучающих программ, таких как this one.

PS: Посмотрите учебник winsocks, так как его начинающим понимать довольно сложно. Кроме того, winpcap не поддерживается во всех системах, и это может быть (в некоторых случаях) боль для установки. Было бы честно лучше использовать winsocks для этого. У Wininet гораздо больше поддержки, и я (не держите меня в этом) полагаю, что все сборки W2K + имеют wininet, поэтому для совместимости (что я действительно не думаю, что это проблема для вас) проблемы я бы использовал wininet или winsocks.

1

Возможно, вы не заканчиваете запрос \r\n дважды.

Если вы отправите строку GET/HTTP/1.0\r\n, вы не получите никаких пакетов.

Вы должны отправить эту строку: GET/HTTP/1.0\r\n\r\n.

Смежные вопросы