基于Winpcap编程实现抓包实验

上传人:夏** 文档编号:558912463 上传时间:2023-12-19 格式:DOC 页数:17 大小:141.26KB
返回 下载 相关 举报
基于Winpcap编程实现抓包实验_第1页
第1页 / 共17页
基于Winpcap编程实现抓包实验_第2页
第2页 / 共17页
基于Winpcap编程实现抓包实验_第3页
第3页 / 共17页
基于Winpcap编程实现抓包实验_第4页
第4页 / 共17页
基于Winpcap编程实现抓包实验_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《基于Winpcap编程实现抓包实验》由会员分享,可在线阅读,更多相关《基于Winpcap编程实现抓包实验(17页珍藏版)》请在金锄头文库上搜索。

1、上海电力学院计算机网络安全(1)课程实验报告实验名称: winpcap编程实验 基于Winpcap 编程实现抓包实验一. 本设计要达到的目标 基于winpcap编程实现对网络数据的捕获,并分析数据类型,对于IP,ICMP,ARP,UDP等,能够自动识别其协议类型并分析帧的构成。二.实现步骤(1)需要通过资料来了解winpcap抓包的工作原理,熟悉其运行过程 Winpcap的内部结构Wincap有三部分组成:一个数据包监听设备驱动程序,一个低级的动态连接库和一个高级的静态连接库。底层动态链接库运行在用户层,它将应用程序和数据包监听设备驱动程序隔离开来,使得应用程序可以不加修改地在不同的WINDO

2、WS系统上运行。高级的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向应用程序提供完善的监听接口。抓包是WinPcap的基本功能,也是NPF最重要的操作。在抓包的时候,驱动(例如NIC Driver)使用一个网络接口监视着数据包,并将这些数据包完整无缺地投递给用户级应用程序。(2)进一步了解winpcap编程所需要的编译环境,下载WpdPack,了解编译环境所需要的库文件.在编译时需要把wpdpack中的include与lib添加进vc的库文件里。(3)明确整个编程的步骤与具体函数。刚开始要定义,在主函数中获取设备接口信息,获得网络地址与掩码地址,打开网络接口,还要设置过滤规

3、则。使用loop函数来回调循环捕获数据包,以便一层一层解析。(4)还要定义几个以太网,ARP,IP,UDP,TCP,ICMP协议的格式。需要注意在存储空间中,在存储空间中才能更好的逐层分析,不然很容易出错(5)定义分析协议的函数,定义方式与回调函数相同. 常用的函数有:用于获取本机设备列表的pcap_findalldevs_ex函数用于打开设备的pcap_open函数,可以指定为混杂模式打开用于编译数据包过滤器的pcap_compile 函数用于设置数据包过滤器的pcap_setfilter 函数用于从设备读取数据包的pcap_netx_ex 函数用于关闭设备的pcap_close 函数(参数

4、为pcap_open 返回值)用于释放设备列表的pcap_freealldevs 函数(对应pcap_findalldevs_ex)三.系统流程图主函数以太网协议分析函数分析ARP协议函数分析Ip协议函数分析ICMP协议函数判断下层函数分析TCP协议函数分析UDP协议函数16进制数据四.关键代码及其分析主函数void main() pcap_t *pcap_handle; /* Winpcap句柄 */ char error_contentPCAP_ERRBUF_SIZE; /* 存储错误信息 */ char *net_interface; /* 网络接口 */ bpf_program bpf

5、_filter; /* BPF过滤规则 */ char bpf_filter_string = ; /* 过滤规则字符串 */ bpf_u_int32 net_mask; /* 掩码 */ bpf_u_int32 net_ip; /* 网路地址 */ net_interface = pcap_lookupdev(error_content); /* 获得可用的网络接口 */ pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);/* 获得网络地址和掩码地址 */ pcap_handle = pcap_open_live

6、(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协议的定义class ip_header public: #if defined(WORDS_BIGENDIAN) u_int8_t ip_version: 4, /* 版本 */ ip_head

7、er_length: 4; /* 首部长度 */ #else u_int8_t ip_header_length: 4, ip_version: 4; #endif u_int8_t ip_tos; /* 服务质量 */ u_int16_t ip_length; /* 长度 */ u_int16_t ip_id; /* 标识 */ u_int16_t ip_off; /* 偏移 */ u_int8_t ip_ttl; /* 生存时间 */ u_int8_t ip_protocol; /* 协议类型 */ u_int16_t ip_checksum; /* 校验和 */ in_addr ip_s

8、ouce_address; /* 源IP地址 */ in_addr ip_destination_address; /* 目的IP地址 */pcap_loop(pcap_handle, n, ethernet_protocol_packet_callback, NULL); /* 注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包 */ 分析UDP协议的函数代码 void udp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_cont

9、ent) class udp_header *udp_protocol; /* UDP协议变量 */ u_short source_port; /* 源端口 */ u_short destination_port; /* 目的端口号 */ u_short length; /长度 udp_protocol = (class udp_header*)(packet_content + 14+20);/* 获得UDP协议内容 */ source_port = ntohs(udp_protocol-udp_source_port); /* 获得源端口 */ destination_port = nto

10、hs(udp_protocol-udp_destination_port); /* 获得目的端口 */ length = ntohs(udp_protocol-udp_length); /* 获得长度 */ cout- UDP协议 -endl; cout源端口号:decsource_portendl; cout目的端口号:decdestination_portendl; switch (destination_port) case 138: cout上层协议为NETBIOS数据报服务endl; break; case 137: cout上层协议为NETBIOS名字服务endl; break;

11、case 139: cout上层协议为NETBIOS会话服务endl; break; case 53: cout上层协议为域名服务endl; break; default: break; cout长度:lengthendl; cout校验和:setw(4)setfill(0)hexudp_checksum)endl; 五.参考文献(1) Winpcap中文文档(2) 网络资料http:/ http:/ pcap.h #include #include #includeusing namespace std; /*以下是以太网协议格式的定义*/ class ether_header public: u_int8_t ether_dhost6; /* 目的以太网地址 */ u_int8_t ether_shost6; /* 源以太网地址 */ u_int16_t ether_type; /* 以太网类型 */ ; /* 下面是ARP协议格式的定义*/ class arp_header public: u_int16_t arp_hardware_type;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号