sniffer设计与实现.doc_第1页
sniffer设计与实现.doc_第2页
sniffer设计与实现.doc_第3页
sniffer设计与实现.doc_第4页
sniffer设计与实现.doc_第5页
免费预览已结束,剩余6页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息安全专业程序实践四网络安全与网络管理实践报告软件学院实验成绩表2010年版21. 实践目的(1) 掌握sniffer程序原理;(2) 学习Wincap编程(3) 能够使用Wincap实现数据包的捕获(4) 设计和实现一个sniffer程序(5) 掌握ARP欺骗原理,并能够实施ARP欺骗2. 实践内容(1)使用Winpcap实现数据包的捕获:;(2)分析数据包:处理捕获的数据包,解析出其协议类型、源MAC地址、目的MAC地址、源IP地址、目的IP地址、源端口、目的端口和数据部分,然后将这些信息保存在文件中。最终根据文件内容统计以下协议的数据流量:网络层:IP,ICMP;传输层:TCP,UDP。(3)将捕获的信息存放在数据库中,根据捕获的信息进行流量统计;(4)ARP欺骗:截获网络上的数据包,对其进行分析,获取源和目的地址,用该数据包的目的IP地址来伪装自己的IP地址,并按照ARP报文格式,对该数据包的发送者发送ARP欺骗包,并验收ARP欺骗成功。(5)界面化:利用MFC构建图形界面,便于用户操作。3. 实践过程1 Sniffer网络嗅探器使用MFC构建图形界面,工程基于对话框模式建立。工程共有两个对话框,分别为主对话框IDD_WINCAPA_DLG,其类名为CWincapaDlg,以及新建的对话框IDD_DIALOG,其类名为CAdapaterSelDlg,其作用是在进入主对话框之前选择网卡设备。 类CAdapaterSelDlg:如截图显示,对话框内使用了Combo Box控件,并在ClassWizard里定义了CComboBox的变量m_selAdapter,在类CAdapaterSelDlg中定义了一个public的变量int m_selIndex。在ClassWizard中添加三个成员函数:virtual void OnOK();/把选中的设备的序号赋值到m_selIndex中virtual BOOL OnInitDialog();/初始化对话框,把已经查找出来的网络设备显示在下拉列表中virtual void OnCancel();/弹出对话框,并退出程序 获取本地网卡列表所使用的函数以及代码在实验指导书中都有,这里就不过多介绍了。主对话框:主对话框中使用了check box控件,list control控件,以及五个button控件。在ClassWizard里定义变量:list control控件变量CListCtrlm_list,BOOL型的check box变量m_arpFilter; m_icmpFilter; m_ipFilter; m_tcpFilter; m_udpFilter。在WincapaDlg.cpp中定义结构体:struct ETHDR/以太网头部 u_char eh_dst6; u_char eh_src6; u_short eh_type;/IP?ARP?;typedef struct ip_header/* IPv4 header */ u_char ver_ihl; / Version (4 bits) + Internet header length (4 bits) u_char tos; / Type of service u_short tlen; / Total length u_short identification; / Identification u_short flags_fo; / Flags (3 bits) + Fragment offset (13 bits) u_char ttl; / Time to live u_char proto; / Protocol u_short crc; / Header checksum u_int saddr; / Source address u_int daddr; / Destination address u_int op_pad; / Option + Paddingip_header;struct TCPPacketHead /* TCP header*/u_short SourPort;u_short DestPort;u_int SeqNo;u_int AckNo;u_char HLen;u_char Flag;u_short WndSize;u_short ChkSum;u_short UrgPtr;struct UDPPacketHead/* UDP header*/ u_short sport; / Source port u_short dport; / Destination port u_short len; / Datagram length u_short crc; / Checksum;struct ICMPPacketHead /*ICMP header*/u_char type;u_char code;u_short chkSum;typedef struct ARP_header/ARP headeru_char hardware;u_char proto; / Protocolu_short haddresslen;u_short paddresslen;u_char type;u_char smaddr6;/source mac addressu_int saddr;/soure ip addressu_char dmaddr6;/destination mac addressu_int daddr;/destination ip addressARP_header;在ClassWizard里添加成员函数: OnInitDialog(), OnSysCommand(UINT nID, LPARAM lParam),OnPaint(),HCURSOR OnQueryDragIcon()等。下面会做具体介绍:BOOL CWincapaDlg:OnInitDialog()函数中,对对话框进行初始化,主要是对list control控件的初始化操作,添加“数据”,“大小”,“目的端口”,“目的MAC地址”,“目的地址”,“源端口”,“源MAC地址”,“源地址”,“序号”共十列。主要代码如下:m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);m_list.InsertColumn(0,数据,LVCFMT_LEFT,335);m_list.InsertColumn(0,大小,LVCFMT_LEFT,40);CFont *font = CFont:FromHandle(HFONT):GetStockObject(DEFAULT_GUI_FONT);void CWincapaDlg:OnStart()函数是在ClassWizard对IDD_START按钮添加的响应函数,主要是进行数据包的捕获,因为MFC中对pcap_loop()函数不兼容,所以在工程中我使用了线程函数,如上代码所示,而在OnStart()函数中调用线程AfxBeginThread(threadFunc, (LPVOID)this);即可是捕获数据包。流程图中为wincap捕获数据包的流程:线程函数UINT threadFunc (LPVOID p) CWincapaDlg *pDlg = static_cast(p) ;int res;struct pcap_pkthdr *header;const u_char *pkt_data;while(!isStop & (res = pcap_next_ex(adhandle, &header, &pkt_data) = 0)if(res = 0)/Timeout elapsed continue;u_char a= s;pDlg-intepretPacket(&a, header, pkt_data); /解释报文if(res = -1)CString tmp;tmp.Format(Error reading the packets: %sn, pcap_geterr(adhandle);AfxMessageBox(tmp);exit(1);pcap_close(adhandle);return -1; void CWincapaDlg:applyFilter(pcap_t *fp, char *packet_filter, bpf_u_int32 NetMask, struct bpf_program fcode)函数设置过滤规则。在OnStart()函数中调用此函数。通过m_arpFilter; m_icmpFilter; m_ipFilter; m_tcpFilter; m_udpFilter,当选中其中某项时,变量的值变为TRUE型(默认为FALSE),把过滤表达式线程相应的网络协议类型。比如,选中arp协议项,通过判断m_arpFilter=TRUE,strcpy(packet_filter,arp);将过滤表达式设置为arp,使用pcap_compile(fp, &fcode, packet_filter, 1, NetMask)以及pcap_setfilter(fp, &fcode)设置过滤规则。void CWincapaDlg:intepretPacket(u_char *param, const pcap_pkthdr *header, const u_char *pkt_data)函数,主要是分析数据包,根据接收的数据包的字段类型进行分类。如线程代码所示,在线程中调用此函数。将分析出的数据包的协议, 源MAC地址,目的MAC地址,源地址,源端口,目的地址,目的端口,大小, 数据等信息都通过格式化xx.Format()函数转换为其对应的格式,添加到list control列表中。下面的流程图为区分四种协议的流程图。ARP:以太网的协议类型值为0x0806;IP:以太网的协议类型值为0x0800;UDP:IP的协议类型值为17;TCP: IP的协议类型值为6;ICMP IP的协议类型值为1。void CWincapaDlg:insertData( CString s1, CString s2, CString s3, CString s4, CString s5, CString s6, CString s7, CString s8,CString s9,CString s10)函数将分析出的数据包信息写入list control列表,函数在intepretPacket()中调用。部分代码如下:int index;index = m_list.InsertItem(0,s1);m_list.SetItem(index,1,LVIF_TEXT,s2, 0, 0, 0,0);void CWincapaDlg:OnStop()函数是在ClassWizard对IDD_STOP按钮添加的响应函数,停止捕获数据包,并显示已经捕获的不同协议数据包的数量。在工程中定义4个static int的全局变量,c_tcp,c_udp,c_icmp,c_arp,在OnStart函数中对其值初始化为0,在intepretPacket函数中在相应的协议中进行累加,最后用MessageBox把其值显示出来。以下为设置ARP过滤的捕获停止的截图:void CWincapaDlg:OnClear()函数是在ClassWizard对IDD_CLEAR按钮添加的响应函数,清除list control列表中的数据内容,使用m_list.DeleteAllItems()。void CWincapaDlg:OnSavelist()函数在ClassWizard对IDD_SAVELIST按钮添加的响应函数,用于将list control列表中的数据内容存放在数据库中。我所使用的数据库为MYSQL,在数据库中建立了命名为sniffer的表单,在安装数据库时,设定用户名为root,密码为123。连接数据库使用的代码:if(m_list.GetItemCount()=0)MessageBox(没有数据要存储!);return;u_int i;MYSQL *db;db=mysql_init(0);/初始化数据库CString str1,str2,str3,str4,str5,str6,str7,str8,str9,str10,sqls;if(mysql_real_connect(db,localhost,root,123,sniffer,3306,NULL,0)/连接数据库for(i=1;idaddr;packet.arp.daddr=arp-saddr;memcpy(packet.arp.dest_addr,arp-sour_addr,6);memcpy(packet.arp.sour_addr,packet1,6); for (i = 0; i 18; i+) packet.arp.paddingi = 1;psend=(unsigned char*)&packet;/强制转换发送的数据包的类型/发送数据包pcap_sendpacket(adhandle,psend,sizeof(psend);3 试验中出现的问题以及解决方案(1) Combo Box控件无法下拉工程运行时发现,对话框中的下拉列表只能显示第一个网卡的信息。解决方法:把鼠标放在下拉列表的处,当光标的形状变成上下箭头时,点击下拉框的中间白点,向下拉即可。(2) Wincap中的部分函数与MFC中的函数redefine,重定义在link过程中,出现wincap中的一些函数以及变量重定义的错误,比如pcap_complile等。解决方法:在StdAfx.h文件中加上#define WIN32_LEAN_AND_MEAN#include#include(3)编译时出现如下问题:packet32.h(231) : error C2079: IPAddress uses undefined struct sockaddr_storage解决方法:1.向winpcap库的packet32.h文件中加入如下代码,且应位于“struct npf_if_addr”定义之前: #ifndef _SS_PAD1SIZE struct sockaddr_storage u_char sa_len; u_char sa_family; u_char padding128; ; #endif 2.将sockaddr_storage 改成 sockaddr。 (4)添加mysql时出现错误解决方式:把mysql的Include,Lib.debug目录添加进VC6.0的环境变量中;针对每一个项目,先用VC打开项目,然后在Project-Settings,择Link,在Object/library modules的输入框里添加libmysql.lib 。在StdAfx.h文件中加上 #include afxdb.h和#include mysql.h。 (5)在arp欺骗的工程中出现连接错误,需要在Project-Settings,择Link,在Object/library modules的输入框里添加 wsock32.lib 。4. 实践总结实验结论:通过了近一个多星期的努力学习与实践运用,终

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论