构造数据包格式
//14字节以太网首部 struct EthernetHeader { u_char DestMAC[6]; //目的MAC地址 6字节 u_char SourMAC[6]; //源MAC地址 6字节 u_short EthType; //上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp 2字节 };
//28字节ARP帧结构 struct ArpHeader { unsigned short hdType; //硬件类型 unsigned short proType; //协议类型 unsigned char hdSize; //硬件地址长度 unsigned char proSize; //协议地址长度 unsigned short op; //操作类型,ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)。 u_char smac[6]; //源MAC地址 u_char sip[4]; //源IP地址 u_char dmac[6]; //目的MAC地址 u_char dip[4]; //目的IP地址 };
//定义整个arp报文包,总长度42字节 struct ArpPacket { EthernetHeader ed; ArpHeader ah; };
MFC界面如下
- 程序步骤
1.在MFC初始化的时候获得机器的网卡列表并打印出来,并选择一些初始化的设置
/* 获取本机设备列表 */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
m_comboNic.AddString(_T("Error in pcap_findalldevs!"));
exit(1);
}
/* 打印列表 */
for (d = alldevs; d; d = d->next)
{
++i;
if (d->description)
m_comboNic.AddString(LPCTSTR(CString(d->name)));
else
m_comboNic.AddString(_T("(No description available)"));
}
if (i == 0)
{
m_comboNic.AddString(_T("No interfaces found! Make sure WinPcap is installed."));
return -1;
}
// 默认选择第一项
m_comboNic.SetCurSel(0);
//目的MAC地址编辑框中默认显示"00-00-00-00-00-00"
SetDlgItemText(IDC_EDIT1, _T("00-00-00-00-00-00"));
2,获得选择的网卡并打开网卡设备
inum = m_comboNic.GetCurSel();
/* 跳转到选中的适配器 */
for (d = alldevs, i = 0; i<= inum - 1; d = d->next, i++);
/* 打开设备 */
if ((adhandle = pcap_open(d->name, // 设备名
65536, // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读取超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲池
)) == NULL)
{
m_editResult.SetWindowText(_T("Unable to open the adapter. \rIt is not supported by WinPcap"));
/* 释放设备列表 */
pcap_freealldevs(alldevs);
exit(-1);
}
3.构造ARP数据包
4.发送数据包
if (pcap_sendpacket(adhandle, sendbuf, 42) == 0) {
m_editResult.SetWindowText(_T("\nPacketSend succeed\n"));
}
else {
m_editResult.SetWindowText(_T("\nPacketSendPacket in getmine Error\n"));
}
- 利用Ethereal抓包验证发送是否成功
标亮的是刚刚构造的数据包,说明ARP请求数据包构造完毕。