네트워크 및 보안/pcap 라이브러리

[pcap 라이브러리] 7. 캡쳐한 패킷 파일로 덤프하기 소스 코드(pcap_dump_open, pcap_dump)

언제나휴일 2016. 4. 29. 21:57
반응형


캡쳐한 패킷 파일로 덤프하기


덤퍼 열기

pcap_dumper_t *pcap_dump_open(pcap_t *pcap_handle,const char *dfname);


캡쳐한 패킷 파일로 덤프

pcap_dump(u_char *args,const struct pcap_pkthdr *header,const u_char *packet);


core_ehp.h


pc_dump.c



//pc_dump.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); return 1;}

  printf("find device: %s sniffing\n",device);

 

  bpf_u_int32 net_ip;               

  bpf_u_int32 mask;               

  struct in_addr net_addr, mask_addr;               

 

  if(pcap_lookupnet(device, &net_ip, &mask, errbuf) < 0) {

    printf("%s\n",errbuf);

    return 2;               

  }//if   

 

  pcap_handle = pcap_open_live(device, 4096, 2, 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=2;i<argc;++i){

    sprintf(filter+strlen(filter)," %s",argv[i]);

  }//for

 

  if(pcap_compile(pcap_handle,&fcode,filter, 0,net_ip)<0){

    printf("fail compile. check sytax\n");

    return 3;  

  }//if

 

  if(pcap_setfilter(pcap_handle, &fcode)<0){

    printf("\nfail setfilter.\n");

    return 4;

  }//if

 

  pcap_dumper_t *df;

  df = pcap_dump_open(pcap_handle,argv[1]);

  if(df == 0){ printf("fail dump_open\n"); return 5;}

 

  pcap_loop(pcap_handle,3,catch_handler,(u_char *)df);

 

  pcap_close(pcap_handle);

  return 0;

}

void catch_handler(u_char *args, cp_pkthdr *header,cu_char *packet){

  printf("##### recved %d bytes #####\n",header->len); 

  pcap_dump(args,header,packet);

...중략...


1. libpcap 패키지 전체 업데이트 및 설치, 테스트 코드

2. 자신의 Network IP와 Mask값 확인하기 소스

3. 패킷 스니핑 소스(pcap_lookupdev, pcap_open_live, pcap_next, pcap_close)

4. libpcap으로 패킷 해석하기 뼈대 만들기

5. 필터 적용하여 패킷 캡쳐하기(소스 포함)

6. 자신의 Network에 필터를 적용하여 패킷 캡쳐 소스 코드


반응형