linux网络嗅探器

来源:互联网 发布:淘宝旗舰店多少钱 编辑:程序博客网 时间:2024/06/05 05:57
 
这是前段时间学习libpcap写的一个小软件。

 

正题:

记得当初研究过抓包这一块,不过也好长时间没碰了,忘记了!

于是,google了一份libpcap的的源码研究了下。

#include <pcap.h>   #include <time.h>   #include <stdlib.h>   #include <stdio.h>     void getPacket(u_char * arg, const struct pcap_pkthdr * pkthdr, const u_char * packet)  {  int * id = (int *)arg;      printf("id: %d\n", ++(*id));  printf("Packet length: %d\n", pkthdr->len);  printf("Number of bytes: %d\n", pkthdr->caplen);  printf("Recieved time: %s", ctime((const time_t *)&pkthdr->ts.tv_sec));       int i;  for(i=0; i<pkthdr->len; ++i){  printf(" %02x", packet[i]);  if( (i + 1) % 16 == 0 ){  printf("\n");  }  }      printf("\n\n");  }    int main()  {  char errBuf[PCAP_ERRBUF_SIZE], * devStr;      devStr = pcap_lookupdev(errBuf);  //第一步,选择网卡    if(devStr){  printf("success: device: %s\n", devStr);  } else  {  printf("error: %s\n", errBuf);  exit(1);  }      pcap_t * device = pcap_open_live(devStr, 65535, 1, 0, errBuf);//如果你电脑是多网卡,你不想选默认网卡抓包,可以修改live函数的第一个参数;//当然,这么做。。那前面的第一步就直接省了。。      //打开网络接口,调用网卡,抓取最大数据包头65535,打开网卡混杂模式(0为关,!0为开)    //等待时间为0,出错信息存到errbuf中。。if(!device){  printf("error: pcap_open_live(): %s\n", errBuf);  exit(1);  }      struct bpf_program filter;  //构建过滤包,compile函数的第二个参数pcap_compile(device, &filter, "dst port 80", 1, 0);  //设置过滤包规则,第三个参数表示,只抓80端口的包pcap_setfilter(device, &filter);  //使用过滤      int id = 0;  pcap_loop(device, -1, getPacket, (u_char*)&id);      //获取数据包,使用回调函数指针getPacket    pcap_close(device);    return 0;  }  

 

 ===========================================================

 介绍下自己写的程序:

主要实现的功能是使用者能定制抓包规则,以及查看解析后的各个头部的信息。

 

协议解析这块,主要看/usr/include/下的头文件来写。

遇到一些原理问题,我也问了参加惠普网络培训时候的CCIE讲师了。

估计还是会有点小毛病!

 

源码大概1200行左右,太麻烦了,就不放出来了。。上些图片吧!

 

有图有真相:

 

 

 

 

 

 

原创粉丝点击