본문 바로가기

C++/Pcap

(5)
pcap_dispatch 와 기타 함수 들 [1. 함수 원형] [2. 함수 설명] pcap_dispatch() cnt 만큼 명시한 패킷만큼 만 callback 함수를 통해 처리 한 후 종료 한다. 여기서 cnt 는 최소가 아닌 최대 개수를 의미하는데, pcap_open_live() 로 pcap descriptor 오픈 시 버퍼 만큼의 패킷을 받은 경우 1개의 패킷만 처리될 수 있기 때문이다. -1 을 명시한 경우는 해당 버퍼로 받을 수 있는 모든 패킷을 의미한다. user 로 명시 된 포인터는 콜백함수로 그대로 전달 되므로, 이를 함수 간 통신 매개체로 사용 할 수 있어 보인다. return 값에 대한 의미는 보통 읽은 개수의 패킷이나 아래와 같은 예외 상황이 있다. 0: 패킷이 필터링 되거나, read timeout 등으로 인해 패킷을 읽지 못..
pcap_open_live 함수 [1. 원형] pcap_t* pcap_open_live(const char* device, int snaplen, int promisc, int to_ms, char *ebuf) void pcap_close(pcap_t *p) pcap_t* pcap_loop(pcap_t* p, int cnt, pcap_handler callback, u_char* user) void(* pcap_handler)(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data) [2. 설명] pcap_open_live() 네트워크 상 패킷을 캡쳐하기 위한 descriptor 를 개방할 때 사용 됨. device: 패킷을 캡쳐할 네트워크 디바이스 이름 리..
pcap_lookupnet 함수 [1. 원형] int pcap_lookupnet(const char * device, bpf_u_int32 * netp, bpf_u_int32 * maskp, char * errbuf) [2. 설명] 선택한 device 의 해당하는 interface 의 subnet 과 netmask 를 반환한다. 실패 시 -1 을 반환하고, errbuf 를 통해 에러 메세지를 반환한다. [3. 예제] [4. 의문?] 윈도우의 경우 subnet 과 netmaks 출력이 이상한데, 주로 0.0.0.0 으로 출력 됨. pcap_if_t 구조체 내부에는 pcap_addr 이라는 구조체가 존재하는데, pcap_addr 은 연결 리스트 형태임. 리눅스의 경우 pcap_addr 연결 리스트의 길이가 1 이라서 상관 없지만 윈도우의 ..
pcap_findalldevs 함수 [1. 원형] int pcap_findalldevs(pcap_if_t ** alldevsp, char* errbuf) [2. 설명] pcap_open_live() 함수로 개방 될 수 있는 네트워크 디바이스 목록을 생성 함 권한이 없는 경우 모든 장치를 확인 할 수 없을 수 있다. 실패 시 -1 을 반환하고, errbuf 에 적절한 에러 메시지가 설정되며, 성공 시 0 을 반환함. [3. winpcap] int pcap_findalldevs_ex(char* source, pcap_rmtauth* auth, pcap_if_t ** alldevs, char* errbuf) 기존 pcap_findalldevs() 가 로컬 머신에 있는 네트워크 장치에 대해서만 확인 할 수 있었다면, pcap_findalldevs..
pcap 개발 환경 설정 [1. Windows] https://www.winpcap.org/install/ => windows api 를 이용하여 자체 구현한(?) 네트워크 디바이스 드라이버를 통해 패킷을 확인하는듯 함. installer 실행 https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip 압축 해제 후 include 및 library 경로를 개발 툴에 import [2. Linux(Ubuntu)] $ sudo install libpcap-dev => raw socket 을 통해 패킷을 확인 할 수 있음. include 경로는 보통 /usr/include lib 경로는 보통 /usr/x86_64-linux-gnu 에서 찾을 수 있음 [3. 개발 환경] C 또는 C++ 프로젝트의 ..