zoukankan      html  css  js  c++  java
  • NS3网络仿真(11): ARP

    快乐虾

    http://blog.csdn.net/lights_joy/

    欢迎转载,但请保留作者信息


    ARPAddress ResolutionProtocol,地址解析协议)协议的基本功能就是通过目标设备的IP地址。查询目标设备的MAC地址,以保证通信的进行。本节借助NS3学习一下此协议。


    1.1    ARP帧的格式


    一个ARP帧的格式例如以下:


    从网上抓一个ARP帧看看。


    这是一个从192.168.24.1发送出来的arp请求帧:


    非常easy和上面的ARP帧格式相应上,只是奇怪的是以太网目的地址并非期望的广播地址??


    再看看192.168.24.129的回复:


    1.2    NS3生成ARP请求包


    接下来尝试用NS3生成ARP请求包:


    		Ptr<Packet> pkt = ns3::Create<Packet>();
    
    		// 加入ARP头
    		ArpHeader ah;
    		ah.SetRequest(
    			ns3::Mac48Address((const char*)src_mac), 
    			(const char*)src_ip, 
    			ns3::Mac48Address((const char*)dest_mac),
    			(const char*)dest_ip);
    		pkt->AddHeader(ah);
    
    		// 加入以太网头
    		EthernetHeader eh;
    		eh.SetDestination("ff:ff:ff:ff:ff:ff");
    		eh.SetSource((const char*)sa);
    		eh.SetLengthType(ns3::ArpL3Protocol::PROT_NUMBER);
    		pkt->AddHeader(eh);
    
    		int len;
    		len = pkt->CopyData(buffer, 2048);
    		pktheader.caplen = len;
    		pktheader.len = len;
    		pktheader.ts.tv_sec = (m_nInterval * i) / 1000;
    		pktheader.ts.tv_usec = ((m_nInterval * i) % 1000) * 1000;
    
    		len = pcap_sendqueue_queue(m_pSendQueue, &pktheader, buffer);
    		if (len == -1)
    		{
    			AfxMessageBox(L"无法发送全部的数据包!");
    			break;
    		}
    

    上面的代码将生成一个NS3下的Packet并将之加入到winpcap的发送队列中。在准备好批量查询的ARP包后就能够使用winpcap一次性将全部包发送出去:


            len= pcap_sendqueue_transmit(m_hSendHandle,m_pSendQueue,m_nInterval);


    1.3    NS3分析ARP回包


    在发送完ARP请求包后。须要处理ARP回包,我们使用winpcap直接抓取网口上的包进行分析。当winpcap收到包后将调用我们的回调函数:

    /* Callback function invoked by libpcap for every incoming packet */
    void CCommonArpSendDlg::packet_handler(void *_param, const void *_header, const void *_pkt_data)
    {
    	uint8_t buffer[2048], *p;
    	p = (uint8_t *)_pkt_data + 12;
    	if (p[0] != 8 || p[1] != 6)
    		return;
    
    	// arp
    	const struct pcap_pkthdr *header = (const struct pcap_pkthdr *)_header;
    	CCommonArpSendDlg* dlg = (CCommonArpSendDlg*)_param;
    
    	Ptr<Packet> pkt = ns3::Create<Packet>((uint8_t*)_pkt_data, header->len);
    	EthernetHeader eh;
    	ArpHeader ah;
    	pkt->RemoveHeader(eh);
    	pkt->RemoveHeader(ah);
    
    	if (!ah.IsReply())
    		return;
    
    	uint32_t nip = ah.GetSourceIpv4Address().Get();
    	CString ip;
    	ip.Format(L"%d.%d.%d.%d", (nip >> 24) & 0xff, (nip >> 16) & 0xff, (nip >> 8) & 0xff, nip & 0xff);
    	ah.GetSourceHardwareAddress().CopyTo(buffer);
    	mac.Format(L"%02x:%02x:%02x:%02x:%02x:%02x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
    .......
    }
    

    1.4    成果


    再加上一些辅助的功能,我们非常easy得到了一个ARP的測试工具:


     

    再能够研究一下ARP攻击的问题了。呵呵~~~









    
  • 相关阅读:
    ToString 格式化数值
    肾积水
    十月一日
    9月27日 星期六
    080929 气温骤降
    東京の空
    9月26日 星期五
    9月30日 星期二
    粉蓝房子&电影
    080922 雨
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6856463.html
Copyright © 2011-2022 走看看