在Linux下利用C语言来实现一个Sniffer的方法简介

嵌入式系统 时间:2012-05-16来源:网络

 if (n42) {

  perror(recvfrom():);

  printf(Incomplete packet (errno is %d)n,

  errno);

  close(sock);

  exit(0);

  }

  ethhead = buffer;

  printf(Source MAC address:

  %02x:%02x:%02x:%02x:%02x:%02xn,

  ethhead[0],ethhead[1],ethhead[2],

  ethhead[3],ethhead[4],ethhead[5]);

  printf(Destination MAC address:

  %02x:%02x:%02x:%02x:%02x:%02xn,

  ethhead[6],ethhead[7],ethhead[8],

  ethhead[9],ethhead[10],ethhead[11]);

  iphead = buffer+14; /* Skip Ethernet header */

  if (*iphead==0x45) { /* Double check for IPv4

  * and no options present */

  printf(Source host %d.%d.%d.%dn,

  iphead[12],iphead[13],

  iphead[14],iphead[15]);

  printf(Dest host %d.%d.%d.%dn,

  iphead[16],iphead[17],

  iphead[18],iphead[19]);

  printf(Source,Dest ports %d,%dn,

  (iphead[20]8)+iphead[21],

  (iphead[22]8)+iphead[23]);

  printf(Layer-4 protocol %dn,iphead[9]);

  }

  }

  }

  PF_PACKET协议簇可以让一个应用程序把数据包变成似乎从网络层接收的样子,但是没有办法抓到那些不是发向自己主机的包。正如我们前面看到的,网卡丢弃所有不含有主机MAC地址的数据包,这是因为网卡处于非混杂模式,即每个网卡只处理源地址是它自己的帧!

  只有三个例外:如果一个帧的目的MAC地址是一个受限的广播地址(255.255.255.255)那么它将被所有的网卡接收:如果一个帧的目的地址是组播地址,那么它将被那些打开组播接收功能的网卡所接收;网卡如被设置成混杂模式,那么它将接收所有流经它的数据包最后一种情况当然是我们最感兴趣的了,把网卡设置成混杂模式,我们只需要发出一个特殊的ioctl()调用在那个网卡上打开一个socket,因为这是一个具有危险性的操作,所以这个调用只有具有root权限的用户才可完成,假设那个“sock”包含一个已经打开的socket。

1 2

关键词: Sniffer 方法 简介 一个 实现 利用 语言 Linux

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版