当前位置:   article > 正文

网络嗅探器的设计与实现(2024)-转载

网络嗅探器的设计与实现(2024)-转载

1.题目描述

参照 raw socket 编程例子,设计一个可以监视网络的状态、数据流动情况以及网络上传输 的信息的网络嗅探器。

2.运行结果

3.导入程序需要的库

请参考下面链接: 

 导入WinPcap到Clion (2024)-CSDN博客

4.参考代码

  1. #define HAVE_REMOTE
  2. #define LINE_LEN 16
  3. #include "winsock.h"
  4. #include <WinSock2.h>
  5. #include <string>
  6. #include <cstdio>
  7. #include <pcap.h>
  8. #include <sys/time.h>
  9. #include <iostream>
  10. #pragma comment(lib, "ws2_32.lib")
  11. using namespace std;
  12. typedef struct ip_address { //ip地址
  13. u_char b1;
  14. u_char b2;
  15. u_char b3;
  16. u_char b4;
  17. } ip_address;
  18. typedef struct mac_address {//mac地址
  19. u_char b1;
  20. u_char b2;
  21. u_char b3;
  22. u_char b4;
  23. u_char b5;
  24. u_char b6;
  25. } mac_address;
  26. typedef struct ethe_header { //mac帧首部
  27. mac_address mac_dest_address;
  28. mac_address mac_source_address;
  29. u_short ether_type;
  30. } ethe_header;
  31. typedef struct ip_header { //ip地址首部
  32. u_char ver_ihl;
  33. u_char tos;
  34. u_short tlen;
  35. u_short identification;
  36. u_short flags_fo;
  37. u_char ttl;
  38. u_char proto;
  39. u_short crc;
  40. ip_address saddr;
  41. ip_address daddr;
  42. u_int op_pad;
  43. } ip_header;
  44. typedef struct udp_header { //UPD首部
  45. u_short sport;
  46. u_short dport;
  47. u_short len;
  48. u_short crc;
  49. } udp_header;
  50. typedef struct tcp_header { //TCP首部
  51. u_short sport;
  52. u_short dport;
  53. u_int num;
  54. u_int ack;
  55. u_short sum;
  56. u_short windonw;
  57. u_short crc;
  58. u_short ugr;
  59. } tcp_header;
  60. void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
  61. char judge;
  62. int length;
  63. int main() {
  64. cout << " *============网络报文捕获程序的设计与实现Demo============*" << endl << endl;
  65. pcap_if_t *alldevs, *device;
  66. int i = 0;
  67. int iNum;
  68. u_int netmask;
  69. struct bpf_program fcode;
  70. pcap_t *adhandle;
  71. char errbuf[PCAP_ERRBUF_SIZE];
  72. //修改这里可以更改捕获的数据包使用的协议类型
  73. char packet_filter[] = "(ip and udp) or (ip and tcp) or (ip and icmp)";
  74. //获取设备列表
  75. if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) {
  76. fprintf(stderr, "无法打开网络设备:%s\n", errbuf);
  77. return 1;
  78. }
  79. for (device = alldevs; device != NULL; device = device->next) { //打印列表
  80. if (i == 0) {
  81. printf("------------------------------网络设备-------------------------------\n");
  82. }
  83. if (device->description)
  84. printf(" 序号:%d (%s)\n", ++i ,device->description);
  85. else
  86. {
  87. i++;
  88. printf("没有设备描述信息!");
  89. }
  90. }
  91. if (i == 0) {
  92. printf("\n请先安装WinPcap!");
  93. return -1;
  94. }
  95. printf("-------------------------------------------------------------------\n");
  96. printf("\n请选择网络设备接口:(1 - %d):", i);
  97. scanf("%d", &iNum);
  98. getchar();
  99. if (iNum < 1 || iNum > i) {
  100. printf("设备不存在!\n");
  101. pcap_freealldevs(alldevs);
  102. return -1;
  103. }
  104. //跳转到已选设备
  105. for (device = alldevs, i = 0; i < iNum - 1; device = device->next, i++);
  106. // 打开适配器
  107. if ((adhandle = pcap_open(device->name, // 设备名
  108. 65536, // 要捕捉的数据包的部分
  109. // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
  110. PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
  111. 1000, // 读取超时时间
  112. NULL, // 远程机器验证
  113. errbuf // 错误缓冲池
  114. )) == NULL) {
  115. fprintf(stderr, "\n不能打开适配器!\n");
  116. /* 释放设备列表 */
  117. pcap_freealldevs(alldevs);
  118. return -1;
  119. }
  120. if (pcap_datalink(adhandle) != DLT_EN10MB) { //检查数据链路层,为了简单,只考虑以太网
  121. fprintf(stderr, "\n系统网卡链路出错!\n");
  122. pcap_freealldevs(alldevs); //释放设备列表
  123. return -1;
  124. }
  125. if (device->addresses != NULL) //获得接口第一个地址的掩码
  126. netmask = ((struct sockaddr_in *) (device->addresses->netmask))->sin_addr.S_un.S_addr;
  127. else //如果接口没有地址,那么我们假设一个C类的掩码
  128. netmask = 0xffff00;
  129. if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0) { //编译过滤器
  130. fprintf(stderr, "不能监听过滤该数据报!\n");
  131. pcap_freealldevs(alldevs);
  132. return -1;
  133. }
  134. if (pcap_setfilter(adhandle, &fcode) < 0) { //设置过滤器
  135. fprintf(stderr, "过滤设置错误!\n");
  136. pcap_freealldevs(alldevs);
  137. return -1;
  138. }
  139. printf(" 是否要输出报文数据(y/n) : ");
  140. scanf("%c", &judge);
  141. if (judge != 'n') {
  142. printf("请输入要限制要输出报文信息长度(-1不限制) : ");
  143. scanf("%d", &length);
  144. }
  145. printf("\n\n 正在监听通过%s的数据报...\n\n", device->description);
  146. pcap_freealldevs(alldevs); //释放设备列表
  147. pcap_loop(adhandle, 0, packet_handler, NULL); //开始捕捉
  148. return 0;
  149. }
  150. void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header,
  151. const u_char *pkt_data) { //回调函数,当收到每一个数据包时会被libpcap所调用
  152. if (header->caplen > 400) return;
  153. int len;
  154. struct tm *ltime;
  155. char timestr[16];
  156. ip_header *ip_hd;
  157. udp_header *udp_hd;
  158. tcp_header *tcp_hd;
  159. ethe_header *ethe_hd;
  160. int ip_len, tcp_len, start;
  161. u_short sport, dport;
  162. printf("\n");
  163. char now[64];
  164. struct tm *ttime;
  165. time_t tt;
  166. tt = header->ts.tv_sec;
  167. ttime = localtime(&tt);
  168. strftime(now,64,"%Y-%m-%d %H:%M:%S",ttime);
  169. printf("\t时间:%s\n", now);
  170. ethe_hd = (ethe_header *) pkt_data;
  171. ip_hd = (ip_header *) (pkt_data + 14);
  172. ip_len = (ip_hd->ver_ihl & 0xf) * 4; //ip首部长度
  173. udp_hd = (udp_header *) ((u_char *) ip_hd + ip_len);
  174. sport = ntohs(udp_hd->sport);
  175. dport = ntohs(udp_hd->dport);
  176. if (ip_hd->proto == 17) {
  177. printf("\t协议:UDP");
  178. start = ip_len + 8;
  179. } else if (ip_hd->proto == 6) {
  180. printf("\t协议:TCP");
  181. tcp_hd = (tcp_header *) ((u_char *) ip_hd + ip_len);
  182. tcp_len = ntohs(tcp_hd->sum) >> 12;
  183. start = ip_len + tcp_len * 4;
  184. } else if (ip_hd->proto == 1) {
  185. printf("\t协议:ICMP");
  186. start = ip_len + 23;
  187. } else printf("\t协议:其他");
  188. //printf("start=%d\n",start);
  189. printf("\t\t\t数据报的长度: %d\n", header->caplen);
  190. printf("\tIP头的长度: %d"
  191. "\t\tIP包存活时间: %d\n", ip_hd->tlen, ip_hd->ttl);
  192. printf("\t源IP地址: %d.%d.%d.%d:%d"
  193. "\t目的IP地址: %d.%d.%d.%d:%d\n"
  194. "\t源端口: %d"
  195. "\t\t\t目的端口: %d\n"
  196. "\t源物理地址: %x-%x-%x-%x-%x-%x"
  197. "\t目的物理地址: %x-%x-%x-%x-%x-%x\n",
  198. ip_hd->saddr.b1, ip_hd->saddr.b2, ip_hd->saddr.b3, ip_hd->saddr.b4,
  199. ip_hd->daddr.b1, ip_hd->daddr.b2, ip_hd->daddr.b3, ip_hd->daddr.b4, sport, dport,
  200. ethe_hd->mac_source_address.b1, ethe_hd->mac_source_address.b2, ethe_hd->mac_source_address.b3,
  201. ethe_hd->mac_source_address.b4, ethe_hd->mac_source_address.b5, ethe_hd->mac_source_address.b6,
  202. ethe_hd->mac_dest_address.b1, ethe_hd->mac_dest_address.b2, ethe_hd->mac_dest_address.b3,
  203. ethe_hd->mac_dest_address.b4, ethe_hd->mac_dest_address.b5, ethe_hd->mac_dest_address.b6);
  204. //输出数据部分
  205. if (judge == 'y') {
  206. printf("\n\t数据部分内容为:\n\t");
  207. if (length == -1) len = (header->caplen) + 1;
  208. else len = (length > header->caplen + 1 - start) ? (header->caplen + 1) - start : length;
  209. for (int i = start; (i < start + len); i++) {
  210. printf("%2.2x ", pkt_data[i - 1]); //也可以改为 %c 以 ascii码形式输出。
  211. if ((i % LINE_LEN) == 0) printf("\n\t");
  212. }
  213. }
  214. cout<<endl<<"---------------------------------------------------------------------"<<endl;
  215. }

 2024 HNUST计算机网络课程设计-(ᕑᗢᓫ∗)˒芒果酱-参考文章

代码可以参考,૮₍ ˃ ⤙ ˂ ₎ა 但同学们要认真编写哦
-------------------------------------------------------------------------
1、网络聊天程序的设计与实现
C++ Socket 多线程 网络聊天室 支持用户端双向交流(2023)-CSDN博客
2、Tracert 与 Ping 程序设计与实现
Tracert 与 Ping 程序设计与实现(2024)-CSDN博客
3、滑动窗口协议仿真
滑动窗口协议仿真(2024)-CSDN博客
4、OSPF 路由协议原型系统设计与实现
OSPF 路由协议原型系统设计与实现-CSDN博客
5、基于 IP 多播的网络会议程序
基于 IP 多播的网络会议程序(2024)-CSDN博客
6、编程模拟 NAT 网络地址转换
编程模拟 NAT 网络地址转换(2024)-CSDN博客
7、网络嗅探器的设计与实现
网络嗅探器的设计与实现(2024)-转载-CSDN博客
8、网络报文分析程序的设计与实现
网络报文分析程序的设计与实现(2024)-CSDN博客
9、简单 Web Server 程序的设计与实现
简单 Web Server 程序的设计与实现 (2024)-CSDN博客
10、路由器查表过程模拟

计算机网络 - 路由器查表过程模拟 C++(2024)-CSDN博客

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/162419
推荐阅读
相关标签
  

闽ICP备14008679号