学习sniffer-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3977348
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类:

2007-08-21 11:21:07

参考了很多网上的资料写了一个小的测试code:

<测试环境>
redhat 9.0 kernel 2.4.20-8

<编译方法>
$gcc -wall -o sniffer sniffer.c
产生sniffer可执行文件就可以测试了.


         

#include <stdio.h>
#include <unistd.h>

#include <signal.h>
#include <string.h>
#include <errno.h>

#include <sys/socket.h>
#include <linux/if_ether.h>
#include <linux/in.h>

#include <sys/ioctl.h>
#include <linux/sockios.h>
#include <net/if.h>

#define    snif_buffer_size    2048

#define    _xff(t)            ((t)&0xff)
#define    snif_addr_mac(p)     \
    _xff((p)[0]),_xff((p)[1]),_xff((p)[2]),_xff((p)[3]),_xff((p)[4]),_xff((p)[5])
#define    snif_addr_ip(p)        _xff((p)[0]),_xff((p)[1]),_xff((p)[2]),_xff((p)[3])

static int isc;
static void exit_while(int signo)
{
  isc = 0;
}

int main(int argc, char **argv)
{
  int        sd, rlen;
  char        buf[snif_buffer_size];
  char        *p;
  struct ifreq    ethreq;

  /* ctrl c */
  signal(sigint, exit_while);

  if ((sd = socket(pf_packet, sock_raw, htons(eth_p_ip))) < 0)
  {
    fprintf(stderr, "socket create error: %s\n", strerror(errno));
    goto err_ret;
  }

  strncpy(ethreq.ifr_name, "eth0", ifnamsiz);
  ioctl(sd, siocgifflags, &ethreq);
  ethreq.ifr_flags |= iff_promisc;
  ioctl(sd, siocsifflags, &ethreq);

  isc = 1;
  while (isc)
  {
    rlen = recvfrom(sd, buf, snif_buffer_size, 0, null, null);
    if (rlen < 42)
    {
      fprintf(stderr, "recv incomplete header information. \n");
      continue;
    }

    p = buf;

    /* dest mac addr [6] | src mac addr [6] | type [2]
     * | ip data packet
     */

    printf("mac: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x ==> %.2x:%.2x:%.2x:%.2x:%.2x:%.2x "
    , snif_addr_mac(&p[6]), snif_addr_mac(p));

    /* other ip data [12] | src ip addr [4] | dest ip addr [4]
     * | tcp/udp data packet
     */

    p = (6 6 2 12);
    printf("ip %d.%d.%d.%d ==> %d.%d.%d.%d \n"
    , snif_addr_ip(p), snif_addr_ip(&p[4]));
  }

  close(sd);

  return (0);

err_ret:
  return (-1);
}



以root运行, 看到奇怪的东西:
mac: 00:00:00:00:00:00 ==> 00:00:00:00:00:00 ip 127.0.0.1 ==> 127.0.0.1
很多mac 0地址, 不知为何?

原来在学校学习的tcp/ip什么的还以为没什么用处, 现在感觉学的太少, 还得补噢!

google到, 以下为解释, 广播?
    前两天同事抓到了包括mac地址全0的包,在讨论和请教牛人后,大概得出的结论是这种mac地址在共享网络下面是有效的。据说 long long ago时这种mac地址和主机地址部分全0的ip地址一样,是用于广播的(rain提供)。不过现在这种mac好像已经不再作为特殊地址保留(scz测 试),而部分系统如bsd系列还保留主机地址全0的ip地址的广播效果。
     scz的详细测试结果如下:

    以下为引用:

         1) linux

         linux下ifconfig修改mac地址前必须先down掉相应接口,改了mac之后再
         up。但是linux下将mac设置成全零后(此时无错误提示),相应接口up失败:

         ifconfig eth0 hw ether 00:00:00:00:00:00

         linux虽然自身无法设置全零mac,但可与全零mac的系统正常通信。


         2) x86/solaris

         x86/solaris 9不必down/unplumb接口,可直接修改mac地址:

         ifconfig dnet0 ether 00:00:00:00:00:00

         全零mac地址可与同一hub上的windows系统通信。


         3) windows 98/nt/2000/xp/2003

         windows xp通过gui界面设置全零mac时无错误提示,但真实通信时仍然使用原mac,
         "ipconfig -all"查看得到的mac地址也是原mac。

         windows 98/2000/xp都可与全零mac的系统正常通信,nt/2003未测试,应该也是可以
         的。

         xp下mac地址在注册表中的相应位置:

         hkey_local_machinesystemcurrentcontrolsetcontrolclass{4d36e972-e325-11ce-bfc1-08002be10318}

         netcfginstanceid    reg_sz  {可变串}
         networkaddress      reg_sz  000000111111


         4) x86/freebsd

         freebsd下ifconfig修改mac地址前不必down掉相应接口,可直接修改,并且全零mac
         地址与同一hub上的windows系统通信无误:

         ifconfig lnc0 ether lladdr 00:00:00:00:00:00

         各种系统是否接受全零mac地址是实现相关的,并不统一。注意,上述系统不但在同
         一子网,而且在同一hub上。一般交换机不接受全零mac地址,导致arp解析失败,无
         法获取目标mac,ip通信自然也就失败。

==============================
应该不是上面说的那样, 应该是: 环回接口

大多数的产品都支持环回接口(loopback interface),以允许运行在同一台主机上的客户程序和服务器程序通过tcp/ip进行通信。a类网络号127就是为环回接口预留的。根据惯例,大多数系统把ip地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的ip数据报不能在任何网络上出现。
    我们想象,一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当ip数据报离开网络层时把它返回给自己。


阅读(1918) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图