快乐虾

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

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

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

1.1    ARP帧的格式

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

从网上抓一个ARP帧看看。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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

再看看192.168.24.129的回复:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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攻击的问题了。呵呵~~~



最新文章

  1. C#实现快速排序
  2. Servlet页面注册用户的小程序(一)
  3. [外挂1] MFC 鼠标位置设置
  4. Facebook React完全解析
  5. Spring aop 实现异常拦截
  6. MySQL的Illegal mix of collationsy异常原因和解决方法
  7. cookie sessionStorage localStorage 之间的关系
  8. vs2010 matlab混合编程调用matlab引擎
  9. azkaban 配置邮件
  10. Google BreakPad使用集
  11. Android主页Activity对多个Fragment实现不同的沉浸式标题(图片或者文字标题)
  12. Ansible工作流程详解
  13. Spring Batch批处理以及编程模型
  14. intent调用代码总结
  15. python 安装pymssql
  16. echarts地图扩展___自定义的svg图
  17. yii2的Console定时任务创建
  18. 「小程序JAVA实战」小程序页面的上拉下拉刷新(50)
  19. [容器]docker-ce安装最新版-docker常用操作
  20. 关于element-ui表格样式设置的方法cell-class-name

热门文章

  1. 【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports
  2. 应用defineProperty简单实现vue的双向数据绑定
  3. js函数的四种调用方式以及对应的this指向
  4. dpkg --add-architecture i386 &amp;&amp; apt-get update &amp;&amp; &gt; apt-get install wine32
  5. 小程序-生成一个小程序码画在canvas画布上生成一张图片分享出去
  6. HDU 5726 GCD(ST&amp;RMQ)
  7. Oracle 12c JDBC方式连接PDB数据库
  8. The 2016 ACM-ICPC Asia China-Final Contest Promblem D
  9. Java中判断String对象是否为空的方法
  10. Android 学习之路和App开发框架