[pcap 라이브러리] 5. 필터 적용하여 패킷 캡쳐하기(소스 포함)
필터 적용하여 패킷 캡쳐하기
필터를 적용하려면 먼저 컴파일후에 설정해야 한다. 필터는 tcpdump의 필터식을 사용한다.
필터 컴파일하기
int pcap_compile(pcap_t *handle, struct bpf_program *fcode, const char *fstr, int opt,
bpf_u_int32 mask);
필터 설정하기
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
//pc_filter.c #include "core_ehp.h"
void catch_handler(u_char *args,cp_pkthdr *handle,cu_char *packet); void decode_eth(cu_char *base); int decode_ip(cu_char *base); int decode_tcp(cu_char *base); void decode_data(cu_char *packet,u_int len); void view_ether_addr(const char *pre,cu_char *base);
int main(int argc,char **argv){ cu_char *packet; char errbuf[PCAP_ERRBUF_SIZE]; char *device; pcap_t *pcap_handle;
device = pcap_lookupdev(errbuf); if(device == 0){ printf("fail lookupdev...%s\n",errbuf); } printf("find device: %s sniffing\n",device);
pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf); if(pcap_handle == 0){ printf("fail pcap_open_live...%s\n",errbuf); }
struct bpf_program fcode; char filter[1000]=""; int i = 0; for(i=1;i<argc;++i){ sprintf(filter+strlen(filter)," %s",argv[i]); }
if(pcap_compile(pcap_handle,&fcode,filter, 0,0)<0){ printf("fail compile. check sytax\n"); return 3; }//if
if(pcap_setfilter(pcap_handle, &fcode)<0){ printf("\nfail setfilter.\n"); return 4; }
pcap_loop(pcap_handle,3,catch_handler,0);
pcap_close(pcap_handle); return 0; } ...중략... |
테스트 방법
$ ./pc_filter tcp && port 80
하고 웹 서핑
1. libpcap 패키지 전체 업데이트 및 설치, 테스트 코드
2. 자신의 Network IP와 Mask값 확인하기 소스
3. 패킷 스니핑 소스(pcap_lookupdev, pcap_open_live, pcap_next, pcap_close)