基于Winpcap 编程实现抓包实验Word文档下载推荐.docx
- 文档编号:8009629
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:26
- 大小:144.53KB
基于Winpcap 编程实现抓包实验Word文档下载推荐.docx
《基于Winpcap 编程实现抓包实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于Winpcap 编程实现抓包实验Word文档下载推荐.docx(26页珍藏版)》请在冰点文库上搜索。
主函数
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;
/*首部长度*/
#else
u_int8_tip_header_length:
4,ip_version:
#endif
u_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;
源端口号:
dec<
source_port<
目的端口号:
destination_port<
switch(destination_port)
{
case138:
上层协议为NETBIOS数据报服务"
break;
case137:
上层协议为NETBIOS名字服务"
case139:
上层协议为NETBIOS会话服务"
case53:
上层协议为域名服务"
default:
}
长度:
length<
校验和:
setw(4)<
setfill('
0'
)<
hex<
ntohs(udp_protocol->
udp_checksum)<
}
五.参考文献
(1)Winpcap中文文档
(2)网络资料
完整源程序
#include"
pcap.h"
#include<
iostream>
iomanip>
#include<
string>
usingnamespacestd;
/*以下是以太网协议格式的定义*/
classether_header
public:
u_int8_tether_dhost[6];
/*目的以太网地址*/
u_int8_tether_shost[6];
/*源以太网地址*/
u_int16_tether_type;
/*以太网类型*/
};
/*下面是ARP协议格式的定义*/
classarp_header
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];
u_int8_tarp_destination_ethernet_address[6];
u_int8_tarp_destination_ip_address[4];
/*目的IP地址*/
/*下面是IP协议格式的定义*/
/*下面是UDP协议格式定义*/
classudp_header
u_int16_tudp_source_port;
/*源端口号*/
u_int16_tudp_destination_port;
u_int16_tudp_length;
u_int16_tudp_checksum;
/*下面是TCP协议格式的定义*/
classtcp_header
u_int16_ttcp_source_port;
u_int16_ttcp_destination_port;
u_int32_ttcp_sequence_lliiuuwweennttaaoo;
/*序列号*/
u_int32_ttcp_acknowledgement;
/*确认序列号*/
#ifdefWORDS_BIGENDIAN
u_int8_ttcp_offset:
4,/*偏移*/
tcp_reserved:
/*未用*/
u_int8_ttcp_reserved:
4,/*未用*/
tcp_offset:
u_int8_ttcp_flags;
/*标记*/
u_int16_ttcp_windows;
/*窗口大小*/
u_int16_ttcp_checksum;
u_int16_ttcp_urgent_pointer;
/*紧急指针*/
/*下面是ICMP协议格式的定义*/
classicmp_header
u_int8_ticmp_type;
/*ICMP类型*/
u_int8_ticmp_code;
/*ICMP代码*/
u_int16_ticmp_checksum;
u_int16_ticmp_id;
/*标识符*/
u_int16_ticmp_sequence;
/*序列码*/
/*下面是分析TCP协议的函数,其定义方式与回调函数相同*/
voidtcp_protocol_packet_callback(u_char*argument,constpcap_pkthdr*packet_header,constu_char*packet_content)
classtcp_header*tcp_protocol;
/*TCP协议变量*/
u_charflags;
intheader_length;
/*目的端口*/
u_shortwindows;
u_shorturgent_pointer;
/*紧急指针*/
u_intsequence;
u_intacknowledgement;
/*确认号*/
u_int16_tchecksum;
tcp_protocol=(tcp_header*)(packet_content+14+20);
/*获得TCP协议内容*/
source_port=ntohs(tcp_protocol->
tcp_source_port);
destination_port=ntohs(tcp_protocol->
tcp_destination_port);
header_length=tcp_protocol->
tcp_offset*4;
sequence=ntohl(tcp_protocol->
tcp_sequence_lliiuuwweennttaaoo);
acknowledgement=ntohl(tcp_protocol->
tcp_acknowledgement);
/*确认序列码*/
windows=ntohs(tcp_protocol->
tcp_windows);
urgent_pointer=ntohs(tcp_protocol->
tcp_urgent_pointer);
flags=tcp_protocol->
tcp_flags;
checksum=ntohs(tcp_protocol->
tcp_checksum);
TCP协议"
source_port<
endl;
destination_port<
case80:
上层协议为HTTP协议:
case21:
上层协议为FTP协议"
case23:
上层协议为TELNET协议"
case25:
上层协议为SMTP协议"
case110:
上层协议为POP3协议"
序列码"
sequence<
确认号:
acknowledgement<
首部长度:
header_length<
保留:
int(tcp_protocol->
tcp_reserved)<
标记:
if(flags&
0x08)
PSH"
0x10)
ACK"
0x02)
SYN"
0x20)
URG"
0x01)
FIN"
0x04)
RST"
窗口大小:
windows<
setw(4)<
setfill('
)<
hex<
checksum<
紧急指针:
urgent_pointer<
/*下面是实现UDP协议分析的函数,函数类型与回调函数相同*/
voidudp_protocol_packet_callback(u_char*argument,constpcap_pkthdr*packet_header,constu_char*packet_content)
UDP协议"
/*下面是实现分析ICMP协议的函数,函数类型与回调函数相同*/
voidicmp_protocol_packet_callback(u_char*argument,constpcap_pkthdr*packet_header,constu_char*packet_content)
classicmp_header*icmp_protocol;
/*ICMP协议变量*/
icmp_protocol=(icmp_header*)(packet_content+14+20);
/*获得ICMP协议内容*/
ICMP协议"
ICMP类型:
icmp_protocol->
icmp_type<
/*获得ICMP类型*/
switch(icmp_protocol->
icmp_type)
case8:
ICMP回显请求协议"
ICMP代码:
icmp_code<
标识符:
icmp_id<
序列码:
icmp_sequence<
case0:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于Winpcap 编程实现抓包实验 基于 Winpcap 编程 实现 实验