




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、环境的搭建,1,.,安装Winpcap,2,.,安装Winpcap,3,.,打开VC6,创建工程,4,.,应用程序类型选择基本对话框,然后点击完成,5,.,然后你会进入这个界面,6,.,将WPDPACK拷到C盘根目录下,7,.,将WPDPACK拷到C盘根目录下,8,.,进入VC6,并点击工具选项目录,在目录中的Includefiles中添加C:WPDPACKInclude,9,.,在目录中的Libraryfiles中添加C:WPDPACKLib,10,.,点击工程设置C/C+,在Preprocessordefinitions中添加预处理定义:WPCAP和HAVE_REMOTE,11,.,点击工程设置link,在对象/库模块中添加wpcap.lib这一项,12,.,二、界面的简易设计,13,.,双击左侧的ResourceMySnifferresourcesIDD_MYSNIFFER_DIALOG,就可以进入图形化界面设计,控件表,14,.,要用到的控件简介,静态文本,编辑框,按钮,列表控件,15,.,创建一个静态文本,并右键点击它,选中属性,将ID修改为“IDC_STATIC_SELECT_DEVICE”,标题修改为“选择网络适配器序号:”,16,.,创建一个编辑框,并右键点击属性,将ID改为IDC_EDIT_SELECT_DEVICE,17,.,创建一个列表控件,并右键点击属性,将ID改为IDC_LIST_DEVICE,然后点击样式查看,选择报告,18,.,创建一个按钮,并右键点击属性,将ID改为IDC_BUTTON_GET_DEVICE,标题改为网络适配器,19,.,再创建一个列表控件,并右键点击属性,将ID改为IDC_LIST_PACK,然后点击样式查看,选择报告,20,.,创建一个按钮,并右键点击属性,将ID改为IDC_BUTTON_START,标题改为开始,21,.,创建一个编辑框,并右键点击属性,将ID改为EDIT_DATA_INFORMATION,然后点击样式,将复选框“多行”,“垂直滚动”和“自动垂直滚动”打上勾,22,.,界面的设计基本上完成了,按F5调试运行,效果应该是如下图所示:,23,.,三、添加类向导与成员变量,24,.,点击查看建立类向导MessageMaps,为IDC_BUTTON_START和IDC_BUTTON_GET_DEVICE添加BN_CLICKED响应函数(选中按钮ID和BN_CLICKED后点击ADD_FUNCTION),25,.,选中IDC_LIST_PACK,并点击NM_CLICK,再点击ADDFUNCTION,添加事件响应函数,26,.,点击查看建立类向导MemberVariables,选中列表中的IDC_EDIT_INFORMATION,并点击ADDVARIABLE,为其添加ValueCString型变量m_data_information,再用同样的方法为其余的三个项添加变量,27,.,四、嗅探器功能设计,28,.,双击左侧的ClassViewMySnifferclassesCAboutDlg,进入代码界面,29,.,找到OnInitDialog函数,并在/TODO:Addextrainitializationhere添加如下代码:,/设置列表m_device格式DWORDdwStyle1=m_device.GetExtendedStyle();dwStyle1|=LVS_EX_FULLROWSELECT;dwStyle1|=LVS_EX_GRIDLINES;m_device.SetExtendedStyle(dwStyle1);m_device.InsertColumn(0,NO,LVCFMT_LEFT,50);m_device.InsertColumn(1,网络设备,LVCFMT_LEFT,380);m_device.InsertColumn(2,网络适配器名称,LVCFMT_LEFT,600);/设置列表m_pack格式DWORDdwStyle=m_pack.GetExtendedStyle();dwStyle|=LVS_EX_FULLROWSELECT;dwStyle|=LVS_EX_GRIDLINES;m_pack.SetExtendedStyle(dwStyle);/添加m_pack的列标题m_pack.InsertColumn(0,序号,LVCFMT_LEFT,60);m_pack.InsertColumn(1,IP协议版本,LVCFMT_LEFT,120);m_pack.InsertColumn(2,协议,LVCFMT_LEFT,80);m_pack.InsertColumn(3,源IP地址,LVCFMT_LEFT,220);m_pack.InsertColumn(4,目的IP地址,LVCFMT_LEFT,220);m_pack.InsertColumn(5,目的MAC地址,LVCFMT_LEFT,240);m_pack.InsertColumn(6,源MAC地址,LVCFMT_LEFT,240);m_pack.InsertColumn(7,数据包发送时间,LVCFMT_LEFT,80);m_pack.InsertColumn(8,数据包大小,LVCFMT_LEFT,80);,30,.,按F5调试运行,你会发现下面的两个列表框多了网格线以及各列对应的属性的名称:,31,.,回到OnInitDialog函数,并在下面添加如下所示代码(在这里是为了防止用户未选择网络适配器就进行抓包,从而发生错误):,/禁用相关按钮GetDlgItem(IDC_BUTTON_START)-EnableWindow(FALSE);,32,.,按F5调试运行,你会发现“开始”按钮变成灰色了(换句话说就是不能用了),33,.,双击左侧的FileViewMySnifferfilesMySnifferDlg.h,进入代码页面,34,.,在MySnifferDlg.h最上部添加头文件声明:#includepcap.h#include,35,.,然后再在下面添加:#ifndefWIN32#include#include#else#include#endif,36,.,然后在/CMySnifferDlgdialog下面添加:#defineMAXSIZE10000voidThreadFunc();,37,.,为classCMySnifferDlg:publicCDialog添加Public型成员变量:,/与抓包过程有关的变量声明pcap_if_t*alldevs;/网络设备列表pcap_if_t*d;intinum;inti;pcap_t*adhandle;charerrbufPCAP_ERRBUF_SIZE;CStringm_str;CStringm_str2;,38,.,为classCMySnifferDlg:publicCDialog添加protected型成员变量:,HANDLEhThread;DWORDThreadID;,39,.,双击左侧的ClassViewMySnifferclassesCAboutDlg,进入代码界面,40,.,找到OnInitDialog函数,并添加变量初始化语句:,/初始化相关变量i=0;,41,.,找到OnButtonGetDevice函数,并添加如下所示代码:,if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,42,.,按F5调试运行,并单击“网络适配器”你会发现第一个列表中显示出了当前主机上的网络适配器的相关信息,43,.,回到OnButtonGetDevice函数,并添加如下所示代码:,/调整控件可用性GetDlgItem(IDC_BUTTON_START)-EnableWindow(TRUE);,44,.,按F5调试运行,并单击“网络适配器”你会发现“开始”按钮由灰色(即不可用)状态变为可用状态了,45,.,点击文件新建C/C+HeaderFile,新建一个名为“ip_header.h”的头文件并添加到此工程中,46,.,回到OnButtonGetDevice函数,并将附赠的相关文件中的ip_header.h里面的代码拷贝进来,然后保存,之后在MySnifferDlg.h里添加#includeip_header.h的声明,47,.,回到CAboutDlg的最上面,添加宏、全局变量与函数声明:,/*宏*/信息框每行输出16个字节#defineLINE_LEN16/最多能存储5000个数据包#defineMAXSIZE5000/*全局变量*/CMySnifferDlg*dlg;/用于访问CMySnifferDlg中的成员的指针intnumber;/捕获到的数据包的序号CStringpack_strMAXSIZE;/可最多存储MAXSIZE个数据包的信息volatileBOOLm_bRun;/*packethandler函数声明*/voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data);/回调函数,每次捕获到数据包就调用该函数处理数据包/*线程函数*/voidThreadFunc()pcap_loop(dlg-adhandle,0,packet_handler,NULL);/抓包,48,.,回到OnInitDialog函数,添加对全局变量number和dlg的初始化语句:,number=0;dlg=this;,49,.,到文件的最下面,添加对回调函数packet_handler的函数定义:,voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data),50,.,找到OnButtonStart函数,为“开始”按钮添加动作响应:,CStringmessage_start;GetDlgItemText(IDC_EDIT_SELECT_DEVICE,m_str);inum=atoi(char*)(LPSTR)(LPCTSTR)m_str);if(inumi)/选择的网络适配器不合法,报错并释放设备列表message_start=选择的网络适配器不合法,请重新输入!;pcap_freealldevs(alldevs);MessageBox(message_start,错误);return;for(d=alldevs,i=0;inext,i+);/输入合法,跳转到选中的网络适配器if(adhandle=pcap_open(d-name,/设备名65535,/65535保证能捕获到不同数据链路层上的每个数据包的全部内容PCAP_OPENFLAG_PROMISCUOUS,/混杂模式1000,/读取超时时间NULL,/远程机器验证errbuf/错误缓冲池)=NULL)pcap_freealldevs(alldevs);/打开网络适配器失败,释放设备列表return;pcap_freealldevs(alldevs);/打开选中的网络适配器后,释放设备列表hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,/开始捕获线程,51,.,找到回调函数,并在回调函数中添加以下语句:,intcounter,counter2;structtm*ltime;chartimestr16;time_tlocal_tv_sec;/打印包的序号number+;/每次捕获到数据包就将包的序号+1dlg-m_str.Format(%d,number);dlg-m_pack.InsertItem(number-1,dlg-m_str);/打印包的时间/*将时间戳转换成可识别的格式*/local_tv_sec=header-ts.tv_sec;ltime=localtime(,52,.,按F5调试运行,点击“网络适配器”,选择网络适配器序号后再点击“开始”,会发现表中不断地添加捕获到的数据包的序号,发送时间和长度,53,.,找到回调函数,继续回调函数中添加以下语句:,ip_header*ih;ethernet_header*eh;ih=(ip_header*)(pkt_data+14);eh=(ethernet_header*)(pkt_data);/首先打印数据包的源MAC地址和目的MAC地址/打印目的MAC地址dlg-m_str2.Format(%.2x,eh-dhost0);dlg-m_str+=dlg-m_str2;for(counter=1;counterm_str2.Format(-%.2x,eh-dhostcounter);dlg-m_str+=dlg-m_str2;dlg-m_pack.SetItemText(number-1,5,dlg-m_str);/打印源MAC地址dlg-m_str2.Format(%.2x,eh-shost0);dlg-m_str+=dlg-m_str2;for(counter=1;counterm_str2.Format(-%.2x,eh-shostcounter);dlg-m_str+=dlg-m_str2;dlg-m_pack.SetItemText(number-1,6,dlg-m_str);,54,.,按F5调试运行,点击“网络适配器”,选择网络适配器序号后再点击“开始”,会发现表中又新增加了已捕获数据包的MAC地址:,55,.,找到回调函数,继续回调函数中添加以下语句:,if(eh-type=0 x0608)dlg-m_pack.SetItemText(number-1,1,IPv4);elseif(eh-type=0 x0008)dlg-m_pack.SetItemText(number-1,1,IPv4);elseif(eh-type=0 xdd86)dlg-m_pack.SetItemText(number-1,1,IPv6);,56,.,按F5调试运行,点击“网络适配器”,选择网络适配器序号后再点击“开始”,会发现表中又新增加了已捕获数据包的IP协议版本:,57,.,找到回调函数中的if(eh-type=0 x0608),向花括号中添加如下所示代码:,dlg-m_pack.SetItemText(number-1,2,ARP);ARP_header*ah;ah=(ARP_header*)(pkt_data+14);/打印数据包的IP地址/打印数据包的源IP地址dlg-m_str=;for(counter=0;counterm_str2.Format(%d,ah-saddrcounter);dlg-m_str+=dlg-m_str2;dlg-m_str+=.;dlg-m_str2.Format(%d,ah-saddr3);dlg-m_str+=dlg-m_str2;dlg-m_pack.SetItemText(number-1,3,dlg-m_str);/打印数据包的目的IP地址dlg-m_str=;for(counter=0;counterm_str2.Format(%d,ah-daddrcounter);dlg-m_str+=dlg-m_str2;dlg-m_str+=.;dlg-m_str2.Format(%d,ah-daddr3);dlg-m_str+=dlg-m_str2;dlg-m_pack.SetItemText(number-1,4,dlg-m_str);,58,.,按F5调试运行,点击“网络适配器”,选择网络适配器序号后再点击“开始”,会发现表中又新增加了已捕获的ARP包的信息:,59,.,找到回调函数中的elseif(eh-type=0 x0008),向花括号中添加如下所示代码:,/根据ih-proto判断所使用的协议switch(ih-proto)case1:dlg-m_str=ICMP;break;/ih-proto为1时,所使用的协议为ICMPcase2:dlg-m_str=IGMP;break;/ih-proto为2时,所使用的协议为IGMPcase6:dlg-m_str=TCP;break;/ih-proto为6时,所使用的协议为TCPcase17:dlg-m_str=UDP;break;/ih-proto为17时,所使用的协议为UDPdefault:dlg-m_str=;/如果不为1,6,17中的一个,则为空dlg-m_pack.SetItemText(number-1,2,dlg-m_str);elseif(eh-type=0 xdd86)dlg-m_pack.SetItemText(number-1,1,IPv6);/打印数据包的IP地址/打印数据包的源IP地址dlg-m_str=;for(counter=0;counterm_str2.Format(%d,ih-saddrcounter);dlg-m_str+=dlg-m_str2;dlg-m_str+=.;dlg-m_str2.Format(%d,ih-saddr3);dlg-m_str+=dlg-m_str2;dlg-m_pack.SetItemText(number-1,3,dlg-m_str);/打印数据包的目的IP地址dlg-m_str=;for(counter=0;counterm_str2.Format(%d,ih-daddrcounter);dlg-m_str+=dlg-m_str2;dlg-m_str+=.;dlg-m_str2.Format(%d,ih-daddr3);dlg-m_str+=dlg-m_str2;dlg-m_pack.SetItemText(number-1,4,dlg-m_str);,60,.,按F5调试运行,点击“网络适配器”,选择网络适配器序号后再点击“开始”,会发现表中又新增加了已捕获的TCP、UDP等数据包的信息:,61,.,找到回调函数,继续回调函数中添加以下语句:,/存储数据包的相关数据counter=0,counter2=0;dlg-m_str.Format(%08x,counter+16);for(counter=1;(countercaplen+1);counter+)dlg-m_str2.Format(%.2x,pkt_datacounter-1);dlg-m_str+=dlg-m_str2;if(counter%LINE_LEN)=0)dlg-m_str+=;for(counter2=0;counter2=32),62,.,找到OnClickListPack函数,为单击列表中的项目动作添加事件响应:,POSITIONPos=m_pack.GetFirstSelectedItemPosition();intnum=(int)Pos;GetDlgItem(IDC_EDIT_DATA_INFORMATION)-SetWindowText(pack_strnum);,63,.,按F5调试运行,点击“网络适配器”,选择网络适配器序号后再点击“开始”,单击第二个列表框中的某一项,于是下面的编辑框中会显示数据包的内容:,64,.,进一步优化,防止用户误操作:(1)为OnButtonGetDevice()函数添加代码:GetDlgItem(IDC_BUTTON_GET_DEVICE)-EnableWindow(FALSE);(2)为OnButtonStart()函数添加代码:/调整控件可用性GetDlgItem(IDC_BUTTON_START)-EnableWindow(FALSE);GetDlgItem(IDC_EDIT_SELECT_DEVICE)-EnableWindow(FALSE);,65,.,找到回调函数中的elseif(eh-type=0 xdd86),向花括号中添加如下所示代码:,ihv6=(ipv6_header*)(pkt_data+14);/打印数据包的IP地址/打印数据包的源IP地址dlg-m_str=;for(counter=0;counterm_str2.Format(%.2x,ihv6-saddr2*counter);dlg-m_str+=dlg-m_str2;dlg-m_str2.Format(%.2x,ihv6-saddr2*counter+1);dlg-m_str
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装饰公司收楼活动方案
- 焊锡考试题目及答案
- 歌曲写作考试题及答案
- 防水卷材考试题及答案
- 宾语从句详解:八年级英语中级语法课程
- 大学美学考试题及答案
- 项目风险管理分析与应对措施表
- 企业节用能源承诺书4篇
- 出口商品代理协议
- 人力资源培训需求分析表模板
- 基础课程改革试题及答案
- 蓝藻治理打捞管理制度
- 苏州市建设工程档案立卷程序与标准
- 2025年上半年湖北十堰竹山招募三支一扶高校毕业生聘用为事业单位人员12人易考易错模拟试题(共500题)试卷后附参考答案
- 餐饮服务明厨亮灶建设工作方案
- 兽医化验员专业知识考试题及答案
- 福建台湾海峡大桥建设工程可行性研究报告
- (完整)注册安全工程师考试题库(含答案)
- 高考作文素材积累与写法总结27 自知与知人作文审题指导及素材积累
- 电子政务概论-形考任务5(在线测试权重20%)-国开-参考资料
- 2024年贵州省贵阳市中考生物地理合卷试题(含答案逐题解析)
评论
0/150
提交评论