В какое направление я должен войти (библиотеки, документы)?
ОБНОВЛЕНИЕ
Кто-то может проиллюстрировать, как использовать winpcap, чтобы сделать задание?
ОБНОВЛЕНИЕ 2
Как я проверяю, является ли пакетом HTTP один?
Если под «угоном» вы имели в виду обнюхивать пакеты, то для этого с WinPcap вам следует сделать следующее:
Найдите устройство, которое вы хотите использовать - См. Руководство по WinPcap .
Открытие устройства с помощью pcap_open
// Открытие устройства
char errorBuffer [PCAP_ERRBUF_SIZE];
pcap_t * pcapDescriptor = pcap_open (source, // имя устройства { {1}} snapshotLength, // часть пакета для захвата
// 65536 гарантирует, что весь пакет будет захвачен на всех уровнях ссылок
, // 0 без флагов, 1 для беспорядочного
readTimeout, // таймаут чтения
NULL, // аутентификация на удаленном компьютере
errorBuffer); // буфер ошибок
Используйте функцию, которая считывает пакеты из дескриптора, например pcap_loop
int result = pcap_loop (pcapDescriptor, count, functionPointer, NULL);
Это будет повторяться до тех пор, пока что-то не произойдет или цикл не будет прерван с помощью вызова специального метода. Он будет вызывать функцию указателя для каждого пакета.
В указанной функции реализовать что-то, что анализирует пакеты, это должно выглядеть как pcap_handler
:
typedef void (* pcap_handler) (u_char *, const struct pcap_pkthdr *,
const u_char *);
Теперь все, что вам осталось, это проанализировать пакеты, их буфер находится в const u_char *
, а их длина находится в pcap_pkthdr
структура каплен
поле.
Предполагая, что у вас есть HTTP GET через TCP через IPv4 через пакеты Ethernet, вы можете:
Остальная часть пакета должна быть текстом HTTP. Текст между первым и вторым пробелами должен быть URI. Если он слишком длинный, вам может потребоваться некоторая реконструкция TCP, но большинство URI достаточно малы, чтобы поместиться в один пакет.
ОБНОВЛЕНИЕ : В коде это будет выглядеть так (я написал это, не тестируя):
int tcp_len, url_length;
uchar * url, * end_url, * final_url, * tcp_payload;
... / * код в http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html * /
/ * удалить позицию заголовка TCP * /
ip_len = (ih-> ver_ihl & 0xf) * 4;
{{1 }} / * убираем позицию полезной нагрузки tcp * /
tcp_len = (((uchar *) ih) [ip_len + 12] >> 4) * 4;
tcpPayload = (uchar * ) ih + ip_len + tcp_len;
/ * начало url - пропустить "GET" * /
url = tcpPayload + 4;
/ * длина url - поиск пробела * /
end_url = strchr ((char *) url, '');
url_length = end_url - url;
/ * копируем URL-адрес в строку c с завершающим нулем * /
final_url = (uchar *) malloc (url_length + 1);
strncpy ((char *) final_url, (char *) url, url_length);
final_url [url_length] = '\ 0';
Вы также можете фильтровать только HTTP-трафик, создав и установив BPF. См. Руководство по WinPcap . Вам, вероятно, следует использовать фильтр "tcp and dst port 80"
, который будет выдавать вам только запрос, который ваш компьютер отправляет на сервер.
Если вы не против использования C #, вы можете попробовать использовать Pcap.Net , который сделает все это за вас намного проще, включая анализ частей пакета Ethernet, IPv4 и TCP. .
Вы можете посмотреть в исходном коде tcpdump
, чтобы увидеть, как это работает. tcpdump
- это утилита командной строки Linux, которая отслеживает и распечатывает сетевую активность. Однако вам нужен root-доступ к машине, чтобы использовать его.
Это может показаться излишним, но веб-прокси / кэш-сервер Squid делает именно это. Несколько лет назад моя компания использовала его, и мне пришлось настроить код локально, чтобы выдавать специальные предупреждения при доступе к определенным URL-адресам, чтобы я знал, что он может делать то, что вы хотите. Вам просто нужно найти нужный код и вытащить его для своего проекта. Я использовал версию 2.X и теперь вижу, что они до 3.X, но подозреваю, что этот аспект кода не сильно изменился внутри.
Вы не сказали, являются ли окна «требованием» или «предпочтением», но согласно сайту: http://www.squid-cache.org/ они может сделать и то, и другое.