libpcap 예제

좋아, 그래서 많은 정보 (그리고 아마도 우리가 필요로하는 것보다 더 많은 것)이지만 우리에게 출발점을 제공합니다. 그것을 기회를 줄 수 있습니다 … 내 네트워크에 나는 리눅스 상자와 비 전환 허브에 연결된 windoze 기계가 있습니다. 따라서 리눅스 컴퓨터에 무차별 모드로 이더넷 카드를 놓으면 Windows 기계로 가는 모든 트래픽을 볼 수 있어야합니다. pcap_compile에 직접 공급되는 경우 man 페이지의 예제가 작동하는지 확인합니다. 이제 페이로드가 메모리에 있는 위치를 파악할 수 있는 충분한 지식이 있습니다. 전달된 옵션이 없는 경우 IP 헤더와 TCP는 일반적으로 각각 약 20바이트입니다. 즉, 처음 54바이트는 헤더 레이어이고 나머지는 실제 데이터입니다. 헤더가 항상 각각 20바이트가 될 것이라고 추측하거나 가정해서는 안됩니다. 페이로드에 대한 오프셋을 계산하려면 IP 및 TCP 레이어모두에 대한 실제 헤더 길이를 얻어야 합니다.

이것이 이 코드 예제에서 수행하는 것입니다. 이 프로그램은 사용자로부터 문자열을 수락하며(tcpdump과 유사) 컴파일하고 필터로 설정합니다. tcpdump 예제의 예제와 유사한 예제를 사용하여 시도해 보겠습니다. pcap_loop()를 활용하는 방법에 대한 전체 프로그램 예제를 살펴보겠습니다. 패킷을 처리하는 콜백 함수 내부에서는 이전 예제에서와 마찬가지로 패킷 정보를 인쇄합니다. 이 프로그램은 패킷을 지속적으로 루프하고 처리하기 때문에 CTRL-C를 사용하여 프로그램을 종료하거나 kill 명령을 사용해야 합니다. pcap_findalldevs()는 pcap_open_live()로 열 수 있는 네트워크 장치 목록을 생성합니다. pcap_findalldevs()를 호출하는 프로세스에 의해 pcap_open_live()로 열 수 없는 네트워크 장치가 있을 수 있습니다. 목록에 있습니다.) alldevsp는 목록의 첫 번째 요소를 가리키도록 설정됩니다. 목록의 각 요소는 pcap_if_t 형식이며 다음 멤버가 있습니다. 페이로드가 항상 같은 위치에 있는 것은 아닙니다. 헤더는 패킷 유형과 존재하는 옵션에 따라 크기가 다릅니다.

이 예제에서는 TCP가 맨 위에 있는 IP 패킷에 대해 엄격하게 이야기하고 있습니다. 잘 시작하기에는 커버할 끔찍한 것이 많이 있습니다. 그래서 그냥 libpcap에 익숙해 수 있습니다. 이 자습서의 모든 예제는 이더넷에 앉아 있다고 가정합니다.