问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么用vc++实现一个网络嗅探器 怎样把这嗅探器这个软件做出来呢?

发布网友 发布时间:2022-04-27 06:15

我来回答

1个回答

热心网友 时间:2023-09-12 08:26

1.百度一下“嗅探原理”;了解计算机基本通信原理,数据封装,以太网传输协议(如OSI七层模型,RAW协议),广播帧····
2.学习怎么设置网卡工作模式为:混杂模式,最后开始设计软件:
===========以下为转载内容,解析不错,直接复制粘贴,呵呵~·====================
代码(转载):
/************************Tcp_sniff_2.c********************/
1.#include  
2.#include  
3.#include
4.#include
5.#include
6.#include
7.#include  
8.#include
9.#include "headers.h"

#define INTERFACE "eth0"

 /*Prototype area*/

10.int Open_Raw_Socket(void); 
11.int Set_Promisc(char *interface, int sock); 
12.int main() {  
13.int sock, bytes_recieved, fromlen;  
14.char buffer[65535];
15.struct sockaddr_in from; 
16.struct ip *ip;
17.struct tcp *tcp;  
18.sock = Open_Raw_Socket();
19. Set_Promisc(INTERFACE, sock);

20. while(1)
22. {
23. fromlen = sizeof from;
24. bytes_recieved = recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen);
25. printf("\nBytes received ::: %5d\n",bytes_recieved);
26. printf("Source address ::: %s\n",inet_ntoa(from.sin_addr));
27. ip = (struct ip *)buffer;
/*See if this is a TCP packet*/
28. if(ip->;ip_protocol == 6) {
29. printf("IP header length ::: %d\n",ip->;ip_length);
30. printf("rotocol ::: %d\n",ip->;ip_protocol);
31. tcp = (struct tcp *)(buffer + (4*ip->;ip_length));
32. printf("Source port ::: %d\n",ntohs(tcp->;tcp_source_port));
33. printf("Dest port ::: %d\n",ntohs(tcp->;tcp_dest_port));
34. }

35. }
36.}
37.int Open_Raw_Socket() {    
38. int sock;
39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
/*Then the socket was not created properly and must die*/
40. perror("The raw socket was not created";
41. exit(0);
42. };  
43. return(sock);  
44. }

45.int Set_Promisc(char *interface, int sock ) {  
46. struct ifreq ifr;      
47. strncpy(ifr.ifr_name, interface,strnlen(interface)+1);
48. if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {  
/*Could not retrieve flags for the interface*/
49. perror("Could not retrive flags for the interface";
50. exit(0);
51. } 
52. printf("The interface is ::: %s\n", interface);  
53. perror("Retrieved flags from interface successfully";
54. ifr.ifr_flags |= IFF_PROMISC;  
55. if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 ) {  
/*Could not set the flags on the interface */  
56. perror("Could not set the PROMISC flag:";
57. exit(0);    
58. }
59. printf("Setting interface ::: %s ::: to promisc", interface);
60. return(0);
61. }

/***********************EOF**********************************/

  

  上面这段程序中有很详细的注解,不过我想还是有必要说一说,首先
第10行--int Open_Raw_Socket(void); 是我们的自定义函数,具体内容如下:

37.int Open_Raw_Socket() {    
38. int sock;
39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
/*Then the socket was not created properly and must die*/
40. perror("The raw socket was not created";
41. exit(0);
42. };  
43. return(sock);  
44. }

               

第39行 if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {

这里我们调用了socket函数,使创建了了一个原始套接口,使之收到TCP/IP信息包。

  接下来第11行-int Set_Promisc(char *interface, int sock),这也是我们的自定义函数,
目的是把网卡置于混杂模式,具体内容如下:
45.int Set_Promisc(char *interface, int sock ) {  
46. struct ifreq ifr;      
47. strncpy(ifr.ifr_name, interface,strnlen(interface)+1);
48. if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {  
/*Could not retrieve flags for the interface*/
49. perror("Could not retrive flags for the interface";
50. exit(0);
51. } 
52. printf("The interface is ::: %s\n", interface);  
53. perror("Retrieved flags from interface successfully";
54. ifr.ifr_flags |= IFF_PROMISC;  
55. if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 ) {  
/*Could not set the flags on the interface */  
56. perror("Could not set the PROMISC flag:";
57. exit(0);    
58. }
59. printf("Setting interface ::: %s ::: to promisc", interface);
60. return(0);
61. }

  首先 struct ifreq ifr; 定一了一个ifrreg的结构ifr,接下来
strncpy(ifr.ifr_name, interface,strnlen(interface)+1);,就是把我们网络设备的名字填
充到ifr结构中,在这里 #define INTERFACE "eth0" ,让我们再往下看,
ioctl(sock, SIOCGIFFLAGS, &ifr),SIOCGIFFLAGS请求表示需要获取接口标志,现在到了
第54行,在我们成功的获取接口标志后把他设置成混杂模式,
ifr.ifr_flags |= IFF_PROMISC;ioctl (sock, SIOCSIFFLAGS, &ifr)。OK,现在我们所说的
第一步已经完成--------把网卡置于混杂模式。

  现在进入第二步,捕获数据包。从第20行开始,我们进入了一个死循环,while(1),在
第24行,recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen),
这个函数要做的就是接收数据,冰把接收到的数据放入buffer中。就是这么简单,已经完成了我
们要捕获数据包的任务。

  到了第三步,分析数据包。27行,ip = (struct ip *)buffer,使我们在头文件中的IP结
构对应于所接收到的数据,接下来判断在网络层中是否使用的是TCP协议,
if(ip->;ip_protocol == 6) ,如果答案是,tcp信息包从整个IP/TCP包 buffer + (4*ip->;ip_length)
地址处开始,所以31行 tcp = (struct tcp *)(buffer + (4*ip->;ip_length)),然后对应
结构把你所需要的信息输出。
/*************************headers.h**************************/
/*structure of an ip header*/ 
struct ip {   
unsigned int ip_length:4; /*little-endian*/ 
unsigned int ip_version:4;
unsigned char ip_tos; 
unsigned short ip_total_length;  
unsigned short ip_id;  
unsigned short ip_flags;
unsigned char ip_ttl;
unsigned char ip_protocol;
unsigned short ip_cksum;
unsigned int ip_source; unsigned int ip_dest;  
};

/* Structure of a TCP header */
struct tcp {
unsigned short tcp_source_port;
unsigned short tcp_dest_port;
unsigned int tcp_seqno;  
unsigned int tcp_ackno;
unsigned int tcp_res1:4, /*little-endian*/
tcp_hlen:4,
tcp_fin:1,
tcp_syn:1,
tcp_rst:1,
tcp_psh:1,
tcp_ack:1,
tcp_urg:1,
tcp_res2:2;
unsigned short tcp_winsize;
unsigned short tcp_cksum;
unsigned short tcp_urgent;
};
/*********************EOF***********************************/
============================
其他的自己追加,这只是原理! ===
============================
 从上面的分析我们可以清楚的认识到,认识一个SNIFF需要对TCP/IP协议有着详细的了解,
否则你根本无法找到你需要的信息。有了上面的基础,你可以自己来做一个你需要的SNIFF了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 你回到我这个年龄我才4岁,但是我到你这个年龄你都67了,问我和你个多大..用C语言编程怎么编??? linux 下C语言的syn扫描代码 我的黑眼圈还有眼袋,听人说要减轻黑眼圈要用冰敷,减轻眼袋要用热敷,我两样都有,该怎么敷? 嗅探的SNIFF原理 粘了3天的鱼缸试水了发现玻璃胶还没有干透,请问一下玻璃胶在水里面能自己干么_百度问一问 关于兴义的旅游景点你知道多少? 贵州兴义市旅游景点 贵州黔西南有什么好玩的地方吗? 黔西南周边有什么好玩的地方,推荐下 贵州黔西南有什么值得推荐的冷门景点? 黔西南有哪些旅游景点? 黔西南有什么景点适合小孩子玩 黔西南有哪些景点 七夕节送女朋友什么礼物好? 黔西南有什么地方比较好玩,风景好的优 黔西南布依族苗族自治州旅游景点 七夕节送女朋友什么礼物好呢? 黔西南有什么好玩的地方?哪些景点必去? 贵州黔西南有哪些小众的景点值得一去呢? 捷信提前还款扣利息吗 socket_raw在recvfrom处阻塞了 java怎么连接elasticsearch 5.x 黑眼圈用什么敷,有什么好办法吗? 黑眼圈眼袋怎么办? 黑眼圈眼袋怎么去除 能拿毛巾敷吗 热毛巾 还是冷毛巾 读书破万卷是什么意思是什么 如何较快速地去除黑眼圈和眼袋(敷眼之类的)? 读书破万卷什么意思 眼袋大的人可在起床的时候,用茶包敷眼睛,对于去眼袋和黑眼圈这样做有效么? 读书破万卷的意思 读书破万卷是什么成语 读书破万卷的成语意思是什么 读书破万卷,下笔如有神 告诉我们什么道理 如何注册一家酒水公司? “读书破万卷”的下一句是什么? 读书破万卷 读书破万卷的出处? &quot;读书破万卷,下笔如有神&quot;的意思 开一家酒业销售公司需要多少钱 读书破万卷后面的成语是什么