实验8_协议分析器程序(二)
- 格式:doc
- 大小:31.50 KB
- 文档页数:3
实验八:协议分析器程序(二)
一、实验目的
1、编写一个简化的协议分析器,了解数据通过网络传输时的封装与解析过
程,加深理解TCP/IP协议栈的工作原理和网络应用软件开发能力。
2、掌握根据软件功能结构进行模块化设计的方法。
3、进一步掌握WinPcap编程与抓包方法;使用WinPcap库的流量统计和向
网络中发包等高级特性。
二、实验内容
编程实现一个协议分析器。该协议分析器将包含以下几部分功能,其中本次
实验完成功能④-⑧:
①数据采集——实时捕捉Ethernet网络数据包;
②解析Ethernet网数据帧头部的全部信息;
③实现基于MAC地址和帧头部类型字段的数据包过滤;
④解析IP数据包的头部信息;
⑤实现基于IP地址和IP头协议的数据过滤;
⑥解析传输层TCP、UDP协议头部信息;
⑦实现基于端口的数据包过滤;
⑧实现应用层HTTP协议头部分析。
三、实验步骤及实验结果
实验步骤如下:
1)得到本地网卡列表
m_pAdaptersList = NULL;/网卡列表
char errbuf[PCAP_ERRBUF_SIZE];
if (pcap_findalldevs(&m_pAdaptersList, errbuf) == -1)
{
TRACE("Error in pcap_findalldevs: %s\n", errbuf);
AfxMessageBox("Error in pcap_findalldevs()", MB_ICONERROR);
ExitProcess(1);
}
if (!m_pAdaptersList)
{
TRACE("Error in finding local adapters: %s\n", errbuf);
AfxMessageBox("Error in finding local adapters",
MB_ICONERROR);
ExitProcess(1);
}
2)
选择网卡
BOOL CProtocolAnalyzerDoc::SelectAdapter()
{
int iAdapterCount = 0;
CInitializeSettingDlg SelAdapterDlg;
pcap_if_t* pAdapter;
for (pAdapter=m_pAdaptersList; pAdapter!=NULL; pAdapter=pAdapter->next)
{
iAdapterCount++;
if (pAdapter->description)
SelAdapterDlg.m_strAdaptersList.AddTail(pAdapter->description);
else
SelAdapterDlg.m_strAdaptersList.AddTail(pAdapter->name);
}
if (m_iAdapterSelected >= 0 && (m_iAdapterSelected < iAdapterCount))
SelAdapterDlg.m_iAdapterSelected = m_iAdapterSelected;
if (SelAdapterDlg.DoModal() == IDOK)
{
m_iAdapterSelected = SelAdapterDlg.m_iAdapterSelected;
return TRUE;
}
return FALSE;
3)设置过滤器
//获得子网掩码
u_int uNetMask;
if (pAdapter->addresses)
uNetMask = ((sockaddr_in*)(pAdapter->addresses->netmask))->sin_addr.s_addr;
else
uNetMask = 0x00ffffff;
//编译过滤器
bpf_program fpCode;
char szFilterCode[1024];
strcpy(szFilterCode, strFCode);
TRACE("FilterCode: %s\n", szFilterCode);
if (pcap_compile(m_hAdapterHandle, &fpCode, szFilterCode, TRUE, uNetMask) < 0)
{
TRACE("Unable to compile the packet filter. Check the syntax.\n");
TRACE("Error Msg: %s\n", pcap_geterr(m_hAdapterHandle));
CString strErrMsg;
strErrMsg.Format("Filter doesn't work because %s", pcap_geterr(m_hAdapterHandle));
AfxMessageBox(strErrMsg);
return;
}
//设置过滤器
if (pcap_setfilter(m_hAdapterHandle, &fpCode) < 0)
{
TRACE("Failed to set the filter\n");
return;
}
4)捕获数据包
int iResult;
while ((iResult=pcap_next_ex(pDoc->m_hAdapterHandle,
&pDoc->m_pPktHdr, &pDoc->m_pPktData)) >= 0)
{
//检测是否停止捕获
if (WaitForSingleObject(pDoc->m_evtStopCapture, 0) ==
WAIT_OBJECT_0)
break;
//超时,继续循环
if (iResult == 0) continue;
//处理收到的数据包
pDoc->PacketHandler();
}
……
四、 实验结果分析
当一台主机向另一台主机发送数据时,网络上所有的主机都能接收到该
帧,但只有目的地址正确的主机会接受数据,而其他主机应将其丢弃。协
议分析器就是一种能将接收网络上所有数据帧的软件。
五、 实验心得体会
通过本次实验,我掌握了根据软件功能结构进行模块化设计的方法,
了解了Winpcap编程与抓包方法,知道了使用原始套接字(raw socket)
实现了数据包捕获的方式。