winpcap快速入门实现抓包发包

winpcap快速入门实现抓包发包

2023年7月3日发(作者:)

winpcap快速⼊门实现抓包发包winpcap 快速⼊门 抓包&&发包⼀、 概述本博客将叙述⼏个关键的winpcap api研习完本博客,可以最终实现抓包/发包操作环境描述:系统: windows 8.1编译器: visaul stiduo 2015pcap 执⾏版本: 4.1.3pcap 开发包版本: 4.1.2环境配置:⼆、API介绍int pcap_findalldevs_ex使⽤⽬的主要⽤于获得所有本地的⽹络接⼝参数介绍char *source: 关于lcoal/remote的设定,如果是查找本地的⽹路设备,填写PCAP_SRC_IF_STRINGstruct pcap_rmtauth *auth: 权限设置,⼀般填NULLpcap_if_t **alldevs: 保存扫描结果。struct pcapift保存了设备的信息/描述char *errbuf: 如果函数出错,则错误信息保存在这⾥返回值0 : 成功执⾏

-1 : 执⾏失败⽰例 pcap_if_t * allDevs; pcap_if_t * dev; char errbuf[PCAP_ERRBUF_SIZE]; if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &allDevs, errbuf) > 0) { printf("pcap_findallDevs_ex failedn"); } for (dev = allDevs; dev->next != NULL; dev = dev->next) { printf("----------------------------n"); printf("name %sn", dev->name); printf("description :%sn", dev->description); }结果截图pcap_t* pcap_open使⽤⽬的主要⽤于对指定的⽹络设备进⾏抓包/发包参数介绍const char *source: 填充pcap_if_t -> name, ⽤于指定⽹络设备int snaplen: 最⼤接受数据包的⼤⼩int flags: ⽹络设备的监听模式,⼀般设置为混杂模式PCAP_OPENFLAG_PROMISCUOUS,即只要经过该⽹络设备的数据包都会被捕获int read_timeout: 抓到包之后,并不是⽴即返回,⽽是再允许其他的包进⼊。此参数可能存在系统不⽀持struct pcap_rmtauth * auth: 权限,⼀般传⼊NULLchar * errbuf: 如果函数出错,存储错误信息返回值pcap_t * : 执⾏成功NULL : 执⾏失败,错误信息填充在errbufint pcap_next_ex()主要⽤途抓包(抓⼀次,抓⼀个)参数介绍pcap_t * p: 指定抓包的⽹络设备,即pcap_open的返回值struct pcap_pkthdr ** pkt_header: 抓到包的描述,由winpcap⾃动⽣成const u_char ** pkt_data: 存储完整的包数据返回值1: 成功执⾏0 : 超时,此时pkt_header,pkt_data所指向的包并不是有效的-1 : 出现错误-2 : 读取离线包时,出现了EOF结束符int pcap_sendpacket()主要⽤途发包参数介绍pcap_t * p: 指定⽹络设备,使⽤此⽹络设备进⾏发包u_char * buf: 数据包int size: 数据包的⼤⼩返回值0 : 发送成功-1 : 发送失败三、综合⽰例抓包演⽰:将抓到的包数据进⾏打印#include #include #include #define HAVE_REMOTEint main() {pcap_if_t * allDevs;pcap_if_t * dev;char errbuf[PCAP_ERRBUF_SIZE];if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &allDevs, errbuf) > 0) {printf("pcap_findallDevs_ex failedn");}int i = 0;//找到连接到internet的⽹络设备,根据⾃⼰电脑的环境⾃⾏更改i的终值/*windows下,要使⽤descroption近似为 Network adapter 'Realtek PCIe GBE Family Controller' on local host的⽹络设备 */for (dev = allDevs, i = 0; i< 4; dev = dev->next, i++);pcap_t * handler;if (NULL == (handler = pcap_open(dev->name, 65535, PCAP_OPENFLAG_PROMISCUOUS, 3000, NULL, errbuf))) {//设置接受的包⼤⼩为65535,即可以接受所有⼤⼩的包printf("err in pcap_open : %s", errbuf);}pcap_pkthdr *pkt_header;const u_char *pkt_data;for (int j = 0; j < 5; j++) {printf("%d --------n", j);if (1 == pcap_next_ex(handler, &pkt_header, &pkt_data)) {for (int k = 0; k < 66; k++) {//输出每个包的前66个byte数据if (k % 15 == 0 && k != 0)//输出美观printf("n");printf("%02x ", *(pkt_data + k));}}printf("n");}getchar();}结果截图发包演⽰根据⽹络协议分层,数据包的格式为“|ethernet|ip|tcp/udp|http|”具体的⽹络数据包,博主不打算讲,毕竟是winpcap快速⼊门,可能后续会推出⽹络数据包解析的博⽂此处的数据包

packet 为博主从wireshare上复制的⼀个tcp syn的包,发送成功,则wireshark会接到数据⼤致相同的tcp synack包。如果要在⾃⼰的电脑上实现发包,需要⾃⼰使⽤wireshark抓取⼀个简单的包,复制其中的数据,填充⾄以下代码中的

packet变量中,然后进⾏发包测试#include #include #include #define HAVE_REMOTEint main() { pcap_if_t * allDevs; pcap_if_t * dev; char errbuf[PCAP_ERRBUF_SIZE]; if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &allDevs, errbuf) > 0) { printf("pcap_findallDevs_ex failedn"); } for (dev = allDevs; dev->next != NULL; dev = dev->next) { printf("----------------------------n"); printf("name %sn", dev->name); printf("description :%sn", dev->description); } int i = 0; //找到连接到internet的⽹络设备 for (dev = allDevs, i = 0; i< 4; dev = dev->next, i++); pcap_t * handler; if (NULL == (handler = pcap_open(dev->name, 65535, PCAP_OPENFLAG_PROMISCUOUS, 3000, NULL, errbuf))) { printf("err in pcap_open : %s", errbuf); } unsigned char packet[] = { 0x14,0x14,0x4b,0x80,0x40,0x81,0x54,0xee, 0x75,0x5e,0x6f,0xa8,0x08,0x00, 0x45,0x00, 0x00,0x34,0x77,0x44,0x40,0x00, 0x80,0x06,0x76,0xaf,0x0a,0x0a,0x2d,0xe9, 0x6f,0x0d,0x65,0xd0, 0xc3,0x67,0x00,0x50,0xaf,0xae,0x8c,0x23,0x00,0x00,0x00,0x00,0x80,0x02,0x20,0x00,0x42,0xb6,0x00,0x00,0x02,0x04,0x05,0xb4,0x01,0x03,0x03,0x08,0x01,0x01,0x04,0x02 }; if (1 != pcap_sendpacket(handler, packet, sizeof(packet))) { printf("pcap_sendpacket failed"); } getchar();}结果截图

发布者:admin,转转请注明出处:http://www.yc00.com/news/1688342283a123557.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信