上海电力学院计算机网络安全(1)课程实验报告实验名称:winpcap编程实验基于Winpcap编程实现抓包实验一.本设计要达到的目标基于winpcap编程实现对网络数据的捕获,并分析数据类型,对于IP,ICMP,ARP,UDP等,能够自动识别其协议类型并分析帧的构成。二.实现步骤(1)需要通过资料来了解winpcap抓包的工作原理,熟悉其运行过程Winpcap的内部结构Wincap有三部分组成:一个数据包监听设备驱动程序,一个低级的动态连接库和一个高级的静态连接库。底层动态链接库运行在用户层,它将应用程序和数据包监听设备驱动程序隔离开来,使得应用程序可以不加修改地在不同的WINDOWS系统上运行。高级的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向应用程序提供完善的监听接口。抓包是WinPcap的基本功能,也是NPF最重要的操作。在抓包的时候,驱动(例如NICDriver)使用一个网络接口监视着数据包,并将这些数据包完整无缺地投递给用户级应用程序。(2)进一步了解winpcap编程所需要的编译环境,下载WpdPack,了解编译环境所需要的库文件.在编译时需要把wpdpack中的include与lib添加进vc的库文件里。(3)明确整个编程的步骤与具体函数。刚开始要定义,在主函数中获取设备接口信息,获得网络地址与掩码地址,打开网络接口,还要设置过滤规则。使用loop函数来回调循环捕获数据包,以便一层一层解析。(4)还要定义几个以太网,ARP,IP,UDP,TCP,ICMP协议的格式。需要注意在存储空间中,在存储空间中才能更好的逐层分析,不然很容易出错(5)定义分析协议的函数,定义方式与回调函数相同.常用的函数有:用于获取本机设备列表的pcap_findalldevs_ex函数用于打开设备的pcap_open函数,可以指定为混杂模式打开用于编译数据包过滤器的pcap_compile函数用于设置数据包过滤器的pcap_setfilter函数用于从设备读取数据包的pcap_netx_ex函数用于关闭设备的pcap_close函数(参数为pcap_open返回值)用于释放设备列表的pcap_freealldevs函数(对应pcap_findalldevs_ex)三.系统流程图主函数以太网协议分析函数分析ARP协议函数分析Ip协议函数分析ICMP协议函数判断下层函数分析TCP协议函数分析UDP协议函数16进制数据四.关键代码及其分析主函数voidmain(){pcap_t*pcap_handle;/*Winpcap句柄*/charerror_content[PCAP_ERRBUF_SIZE];/*存储错误信息*/char*net_interface;/*网络接口*/bpf_programbpf_filter;/*BPF过滤规则*/charbpf_filter_string[]=;/*过滤规则字符串*/bpf_u_int32net_mask;/*掩码*/bpf_u_int32net_ip;/*网路地址*/net_interface=pcap_lookupdev(error_content);/*获得可用的网络接口*/pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);/*获得网络地址和掩码地址*/pcap_handle=pcap_open_live(net_interface,BUFSIZ,1,1,error_content);/*打开网路接口*/pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);/*编译BPF过滤规则*/pcap_setfilter(pcap_handle,&bpf_filter);/*设置过滤规则*/对IP协议的定义classip_header{public:#ifdefined(WORDS_BIGENDIAN)u_int8_tip_version:4,/*版本*/ip_header_length:4;/*首部长度*/#elseu_int8_tip_header_length:4,ip_version:4;#endifu_int8_tip_tos;/*服务质量*/u_int16_tip_length;/*长度*/u_int16_tip_id;/*标识*/u_int16_tip_off;/*偏移*/u_int8_tip_ttl;/*生存时间*/u_int8_tip_protocol;/*协议类型*/u_int16_tip_checksum;/*校验和*/in_addrip_souce_address;/*源IP地址*/in_addrip_destination_address;/*目的IP地址*/pcap_loop(pcap_handle,n,ethernet_protocol_packet_callback,NULL);/*注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包*/分析UDP协议的函数代码voidudp_protocol_packet_callback(u_char*argument,constpcap_pkthdr*packet_header,constu_char*packet_content){classudp_header*udp_protocol;/*UDP协议变量*/u_shortsource_port;/*源端口*/u_shortdestination_port;/*目的端口号*/u_shortlength;//长度udp_protocol=(classudp_header*)(packet_content+14+20);/*获得UDP协议内容*/source_port=ntohs(udp_protocol-udp_source_port);/*获得源端口*/destination_port=ntohs(udp_protocol-udp_destination_port);/*获得目的端口*/length=ntohs(udp_protocol-udp_length);/*获得长度*/cout----------UDP协议----------endl;cout源端口号:decsource_portendl;cout目的端口号:decdestination_portendl;switch(destination_port){case138:cout上层协议为NETBIOS数据报服务endl;break;case137:cout上层协议为NETBIOS名字服务endl;break;case139:cout上层协议为NETBIOS会话服务endl;break;case53:cout上层协议为域名服务endl;break;default:break;}cout长度:lengthendl;cout校验和:setw(4)setfill('0')hexntohs(udp_protocol-udp_checksum)endl;}五.参考文献(1)Winpcap中文文档(2)网络资料=search完整源程序#includepcap.h#includeiostream#includeiomanip#includestringusingnamespacestd;/*以下是以太网协议格式的定义*/classether_header{public:u_int8_tether_dhost[6];/*目的以太网地址*/u_int8_tether_shost[6];/*源以太网地址*/u_int16_tether_type;/*以太网类型*/};/*下面是ARP协议格式的定义*/classarp_header{public:u_int16_tarp_hardware_type;/*硬件类型*/u_int16_tarp_protocol_type;/*协议类型*/u_int8_tarp_hardware_length;/*硬件地址长度*/u_int8_tarp_protocol_length;/*协议地址长度*/u_int16_tarp_operation_code;/*操作码*/u_int8_tarp_source_ethernet_address[6];/*源以太网地址*/u_int8_tarp_source_ip_address[4];/*源IP地址*/u_int8_tarp_destination_ethernet_address[6];/*目的以太网地址*/u_int8_tarp_destination_ip_address[4];/*目的IP地址*/};/*下面是IP协议格式的定义*/classip_header{public:#ifdefined(WORDS_BIGENDIAN)u_int8_tip_version:4,/*版本*/ip_header_length:4;/*首部长度*/#elseu_int8_tip_header_length:4,ip_version:4;#endifu_int8_tip_tos;/*服务质量*/u_int16_tip_length;/*长度*/u_int16_tip_id;/*标识*/u_int16_tip_off;/*偏移*/u_int8_tip_ttl;/*生存时间*/u_int8_tip_protocol;/*协议类型*/u_int16_tip_checksum;/*校验和*/in_addrip_souce_address;/*源IP地址*/in_addrip_destination_address;/*目的IP地址*/};/*下面是UDP协议格式定义*/classudp_header{public:u_int16_tudp_source_port;/*源端口号*/u_int16_tudp_destination_port;/*目的端口号*/u_int16_tudp_length;/*长度*/u_int16_tudp_checksum;/*校验和*/};/*下面是TCP协议格式的定义*/classtcp_header{public:u_int16_ttcp_source_port;/*源端口号*/u_int16_ttcp_destination_port;/*目的端口号*/u_int32_ttcp_sequence_lliiuuwweennttaaoo;/*序列号*/u_int32_ttcp_acknowledgement;/*确认序列号*/#ifdefWORDS_BIGENDIANu_int8_ttcp_offset:4,/*偏移*/tcp_reserved:4;/*未用*/#elseu_int8_ttcp_reserved:4,/*未用*/tcp_offset:4;/*偏移*/#endifu_int8_ttcp_flags;/*标记*/u_int16_ttcp_windows;/*窗口大小*/u_int16_ttcp_checksum;/*校验和*/u_int16_ttcp_urgent_pointer;/*紧急指针*/};/*下面是ICMP协议格式的定义*/classicmp_header{public:u_int8_ticmp_type;/*ICMP类型*/u_int8_ticmp_code;/*ICMP代码*/u_int16_ticmp_checksum;/*校验和*/u_int16_ticmp_id;/*标识符*/u_int1