快樂蝦
[http://blog.csdn.net/lights_joy/](http://blog.csdn.net/lights_joy/)
歡迎轉載,但請保留作者信息
ARP(Address ResolutionProtocol,地址解析協議)協議的基本功能就是通過目標設備的IP地址,查詢目標設備的MAC地址,以保證通信的進行。本節借助NS3學習一下此協議。
### 1.1????ARP幀的格式
一個ARP幀的格式如下:

從網上抓一個ARP幀看看。
這是一個從192.168.24.1發送出來的arp請求幀:

很容易和上面的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????成果
再加上一些輔助的功能,我們很容易得到了一個ARP的測試工具:

再可以研究一下ARP攻擊的問題了,呵呵~~~
??