您好,欢迎来到要发发知识网。
搜索
您的当前位置:首页嗅探器实验报告

嗅探器实验报告

来源:要发发知识网


嗅探器实验报告

学院:通信工程 班级: 学号: 姓名:寇天聪 011252

01125118

嗅探器设计原理

嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。

网络嗅探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。此分析结果可供网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。可见,嗅探器实际是一把双刃剑。虽然网络嗅探器技术被黑客利用后会对网络安全构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。而在网络安全方面,网络嗅探手段可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。

本程序实现的基本功能:指定局域网内的任一ip地址,能分析包的类型,结构,流量的大小。

嗅探器工作原理

根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就结合注释对程序的具体是实现进行讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。

源程序:

#include 的*/

#include #include #include #include

#pragma comment(lib,\"ws2_32.lib\") */

#define MAX_HOSTNAME_LAN 255

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define MAX_ADDR_LEN 16 struct ipheader {

unsigned char ip_hl:4; unsigned char ip_v:4; unsigned char ip_tos;

/*header length(报头长度)*/ /*version(版本)*/

/*type os service服务类型*/ /*total length (总长度)*/

/*fragment offset field(段移位域)*/ /*protocol(协议)*/ /*checksum(校验和)*/

/*链接API相关连的Ws2_32.lib静态库

/*windows socket的头文件,系统定义

unsigned short int ip_len; unsigned short int ip_id; unsigned short int ip_off; unsigned char ip_ttl; unsigned char ip_p; unsigned int ip_src; unsigned int ip_dst;

/*identification (标识符)*/ /*time to live (生存时间)*/

unsigned short int ip_sum;

/*source address(源地址)*/ /*destination address(目的地址)*/

/* total ip header length: 20 bytes

};

(=160 bits) */

typedef struct tcpheader {

unsigned short int sport; unsigned short int dport; unsigned int th_seq; unsigned int th_ack; unsigned char th_x:4; unsigned char Flags;

/*source port (源端口号)*/ /*destination port(目的端口号)*/

/*sequence number(包的序列号)*/ /*acknowledgement number(确认应答

/*unused(未使用)*/ /*data offset(数据偏移量)*/ /*windows(窗口)*/ /*checksum(校验和)*/ /*urgent pointer(紧急指针)*/

号)*/

unsigned char th_off:4;

/*标志全*/

unsigned short int th_win; unsigned short int th_sum; unsigned short int th_urp;

}TCP_HDR;

typedef struct udphdr {

unsigned short sport; unsigned short dport; unsigned short len;

/*source port(源端口号)*/ /*destination port(目的端口号)*/ /*udp length(udp长度)*/ /*udp checksum(udp校验和)*/

unsigned short cksum;

}UDP_HDR; void main(){

SOCKET sock; WSADATA wsd; DWORD dwBytesRet; unsigned int optval = 1;

unsigned char *dataudp,*datatcp; int i,pCount=0,lentcp, lenudp; SOCKADDR_IN sa,saSource, saDest; struct hostent FAR * pHostent;

char FAR name[MAX_HOSTNAME_LAN];

char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN],RecvBuf[65535] = {0};

struct udphdr *pUdpheader; struct ipheader *pIpheader; struct tcpheader *pTcpheader;

WSAStartup(MAKEWORD(2,1),&wsd);

if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP))==SOCKET_ERROR)

exit(1);

gethostname(name, MAX_HOSTNAME_LAN); pHostent = gethostbyname(name); sa.sin_family = AF_INET; sa.sin_port = htons(6000); memcpy(&sa.sin_addr.S_un.S_addr,

pHostent->h_addr_list[0],

pHostent->h_length);

bind(sock, (SOCKADDR *)&sa, sizeof(sa));/*bind()设定自己主机的IP地址和if ((WSAGetLastError())==10013) exit(1); 端口号*/

WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);

pIpheader = (struct ipheader *)RecvBuf;

pTcpheader = (struct tcpheader *)(RecvBuf+ sizeof(struct ipheader )); pUdpheader = (struct udphdr *) (RecvBuf+ sizeof(struct ipheader )); while (1){

memset(RecvBuf, 0, sizeof(RecvBuf)); recv(sock, RecvBuf, sizeof(RecvBuf), 0); saSource.sin_addr.s_addr = pIpheader->ip_src;

strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN); saDest.sin_addr.s_addr = pIpheader->ip_dst;

strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN); lentcp lenudp

=(ntohs(pIpheader->ip_len)-(sizeof(struct =(ntohs(pIpheader->ip_len)-(sizeof(struct

ipheader)+sizeof(struct tcpheader))); ipheader)+sizeof(struct udphdr)));

if((pIpheader->ip_p)==IPPROTO_TCP&&lentcp!=0){

printf(\"*******************************************\\n\"); pCount++;

char

*)

RecvBuf+sizeof(struct

datatcp=(unsigned

ipheader)+sizeof(struct tcpheader);

}

printf(\"-TCP-\\n\");

printf(\"\\n目的IP地址:%s\\n\

printf(\"\\n目的端口:%i\\n\printf(\"datatcp address->%x\\n\

printf(\"size of ipheader->%i\\n\printf(\"size of tcpheader->%i\\n\printf(\"size of the hole packet->%i\\n\printf(\"\\nchar Packet%i [%i]=\\\"\for (i=0;iprintf(\"\\\";\\n\\n\\n\"); for (i=0;iprintf(\"\\n\\n*******************************************\\n\");

if( *(datatcp+i)<=127&&*(datatcp+i)>=20)

printf(\"%c\printf(\".\"); else

printf(\"\\\\x%.2x\if (i%10==0) printf(\"\\\"\\n\\\"\");

if((pIpheader->ip_p)==IPPROTO_UDP&&lentcp!=0){

pCount++; dataudp=(unsigned printf(\"-UDP-\\n\");

printf(\"\\n目的IP地址:%s\\n\

printf(\"\\n目的端口:%d\\n\printf(\"UDP数据地址:%x\\n\

printf(\"IP头度:%i\\n\printf(\"UDP头度:%i\\n\printf(\"包的大小:%i\\n\printf(\"\\nchar Packet%i [%i]=\\\"\

char

*)

RecvBuf+sizeof(struct

ipheader)+sizeof(struct udphdr);

for (i=0;i}

}

printf(\"\\\\x%.2x\ if (i%10==0)

printf(\"\\\"\\n\\\"\");

}

printf(\"\\\";\\n\\n\\n\"); for (i=0;i=20) printf(\"%c\ else

printf(\".\"); }

printf(\"\\n\\n*******************************************\\n\");

运行结果截图:

实验总结

1.实验中的遇到的问题: 刚开始老师布置作业的时候完全不知道怎么做,在网上找了一些资料和借鉴同学的实验过程才完成了这个实验,着实不易。 2.实验中的收获:一定程度上加深了对TCP/IP协议的理解,对课程学习打下了一个比较好的基础;用一些设计模式在一定程度能提高开发效能,降低开发的复杂度,并且深刻地认识到实践才能出真知这个硬道理。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- net188.cn 版权所有 湘ICP备2022005869号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务