网络嗅探器的设计与实现_第1页
网络嗅探器的设计与实现_第2页
网络嗅探器的设计与实现_第3页
网络嗅探器的设计与实现_第4页
网络嗅探器的设计与实现_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机网络 课 程 设 计题 目 网络嗅探器的设计与实现 系 (部) 姓 名 学 号 指导教师 2015年7月18日 计算机网络课程设计任务书一、设计题目、内容及要求题目:网络嗅探器的设计与实现内容: 本设计是关于网络嗅探器的设计与实现,功能包括实现网络层抓包,对获得包的源和目的地址、端口、协议等进行分析和实现简单的包嗅探器功能。要求: 1.实现网络嗅探器的界面2. 实现抓取数据包的功能。3. 实现清空列表功能二、要求的设计成果(课程设计说明书、设计实物、图纸等) 1课程设计报告2实现网络嗅探器的程序代码三、进程安排1、设计工作4学时2、实现与调试20学时3、课程设计报告6学时四、主要参考资料

2、 1王群 计算机网络安全技术2吴功宜,董大凡王珺等.计算机网络高级软件编程技术【M】.北京:清华大学出版社,20083谢小特,王勇军.基于winPcap的捕包程序设计【J】.软件特刊,2007(11):71-724胡晓元,史浩山.winpcap包截获系统的分析及其应用【J】.计算机工程,2005(1):96-975赵辉,叶子青.VisualC+系统开发实例精粹【M】,北京:人民邮电出版社,200513网络嗅探器的设计与实现摘要:网络嗅探器是对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法。本设计是关于网络嗅探器的设计与实现,其功能包括实现网络层抓包 ,对获得包的源和目

3、的地址、端口、协议等进行分析和实现简单的包嗅探器功能。关键字:网络嗅探器;数据包捕获; 套接字引言由于网络技术的发展,计算机网络的应用越来越广泛,其作用也越来越重要。计算机网络安全问题更加严重,网络破坏所造成的损失越来越大。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。嗅探器是一种常用的收集有用数据的方法,可以作为网络数据包的设备。嗅探器是通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。通常的套接字程序只能响应与自己硬件地址相

4、匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。1 基本概念1.1 嗅探器每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应。嗅探器工作在网络的底层,在网络上监听数据

5、包来获取敏感信息。从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,其内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式:a)广播方式:该模式下的网卡能够接收网络中的广播信息。b)组播方式:设置在该模式下的网卡能够接收组播数据。c)直接方式:在这种模式下,只有目的网卡才能接收该数据。d)混杂模式:在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否是传给它的。

6、嗅探程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太网卡)置为混杂模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包,而不管该数据是否传给它的。1.2 相关协议1.2.1 IP协议网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。IP层接收由更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的

7、地址(目的地址)。1.2.2 TCP协议 如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向上传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。1.2.3 UDP协议 UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查

8、询-应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。 欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。1.3 数据包“包”(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。 TCP/IP协议是工作在OSI模型第三层(网络层)、第四层(传输层)上的,而帧是工作在第二层(数据链路层)。上一层的内容由下一层的内容来传输,所以在局域网中,“包”是包含在“帧”里的

9、。 数据包的结构非常复杂,主要由“目的IP地址”、“源IP地址”、“净载数据”等部分构成。正是因为数据包具有这样的结构,安装了TCP/IP协议的计算机之间才能相互通信。我们在使用基于TCP/IP协议的网络时,网络中其实传递的就是数据包。比如说当你上网时打开某个网页,这个简单的动作,就是你先发送数据包给那个网站,它接收到了之后,根据你发送的数据包的IP地址,返回给你网页的数据包,也就是说,网页的浏览,实际上就是数据包的交换。2 网络嗅探器的作用嗅探器是网络的抓包工具,可以对网络中大量数据抓取,从而方便使用者对网络中用户的一些信息进行分析,所以,通常被黑客运用于网络攻击。我们如果也能掌握网络嗅探器

10、的原理和设计,可以将它运用与网络故障检测、网络状况的监视,还可以加强企业信息安全防护。3 网络嗅探器原理嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡

11、按通常的正常模式工作,而必须将其设置为混杂模式。具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字

12、此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面给出数据包的总体结构:3.1 UDP数据段头 数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比较简单,由source port(源端口号) 、destination port(目的端口号) 、udp length(udp长度) 、udp checksum(udp校验和)

13、组成。UDP报头结构体为:typedef struct udphdr unsigned short sport;/*source port(源端口号)*/unsigned short dport;/*destination port(目的端口号)*/unsigned short len;/*udp length(udp长度)*/unsigned short cksum;/*udp checksum(udp校验和)*/UDP_HDR;3.2 TCP数据段头TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,由source port(源端口号)、destina

14、tion port(目的端口号) 、顺序号、确认号、TCP头长 、校验和 紧急指针、可选项(0或更多的32位字)、数据(可选项)。组成。TCP报头结构体为:typedef struct tcpheader unsigned short int sport;/*source port (源端口号)*/unsigned short int dport;/*destination port(目的端口号)*/unsigned int th_seq;/*sequence number(包的序列号)*/unsigned int th_ack;/*acknowledgement number(确认应答号)*

15、/unsigned char th_x:4;/*unused(未使用)*/unsigned char th_off:4;/*data offset(数据偏移量)*/unsigned char Flags;/*标志全*/unsigned short int th_win;/*windows(窗口)*/unsigned short int th_sum;/*checksum(校验和)*/unsigned short int th_urp;/*urgent pointer(紧急指针)*/TCP_HDR;3.3 IP数据段头在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据头以

16、大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium是小端点机)。如果是小端点机,就要在发送和接收时先行转换然后才能进行传输。IP数据段头格由版本 IHL 服务类型 总长、标志、 分段偏移、头校验和、源地址、目的地、选项(0或更多)组成。IP数据报头的结构体为:struct ipheader unsigned char ip_hl:4;/*header length(报头长度)*/unsigned char ip_v:4;/*version(版本)*/unsigned char ip_tos;/*type os service服务类型*/unsigned

17、short int ip_len;/*total length (总长度)*/unsigned short int ip_id;/*identification (标识符)*/unsigned short int ip_off;/*fragment offset field(段移位域)*/unsigned char ip_ttl;/*time to live (生存时间)*/unsigned char ip_p;/*protocol(协议)*/unsigned short int ip_sum;/*checksum(校验和)*/unsigned int ip_src;/*source addr

18、ess(源地址)*/unsigned int ip_dst;/*destination address(目的地址)*/ ;4 网络嗅探器的设计在以太网中, 信息是以明文的形式在网络上传输 , 当将网络适配器设置为混杂模式时, 由于采用以太网广播信道争用的方式, 使得监听系统与正常通信的网络能够并联连接, 并可捕获任何一个在同一冲突域上传输的数据包。IEEE802. 3 标准的以太网采用的是持续CSMA 的方式, 正是由于以太网采用这种广播信道争用的方式, 使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截我所要的信息, 这是捕获数据包的物理基础。首先,抓包系统必须绕过操

19、作系统的协议栈来访问在网络上传输的原始数据包, 这就要求一部分运行在操作系统核心内部, 直接与网络接口驱动交互。这个部分是系统依赖的, 在W inpcap 的解决方案里它被认为是一个设备驱动, 称作NPF ( NetgroupPacket F ilter) 。W inpcap 提供了两个不同的库: Packet. dll 和W pcap. dll。Wpcap. dll提供了更加友好、功能更加强大的函数调用。W inPcap 的优势在于提供了一套标准的抓包接口, 与libpcap 兼容, 可使得原来许多UN IX 平台下的网络分析工具快速移植过来,便于开发各种网络分析工具, 充分考虑了各种性能和

20、效率的优化, 包括对于NPF 内核层次上的过滤器支持, 支持内核态的统计模式, 提供了发送数据包的能力。前者提供了一个底层AP I, 伴随着一个独立于M icrosoft 操作系统的编程接口, 这些AP I可以直接用来访问驱动的函数; 后者导出了一组更强大的与libpcap 一致的高层抓包函数库( capture prmi itives) 。这些函数使得数据包的捕获以一种与网络硬件和操作系统无关的方式进行。网络嗅探器工作在网络环境的底层, 拦截所有正在网络上传送的数据, 并且通过相应的解析处理, 可以实时分析这些数据的内容, 进而分析所处的网络状态和整体拓扑布局。含了相应设备的名称和描述。取得

21、网卡列表后就在屏幕上显示出来, 如果网卡没有被发现就显示有关错误, pcap _ findalldevs ( ) 同其他的libpcap函数一样有一个errbuf参数, 当有异常情况发生时,这个参数会被pcap填充为某个特定错误字串。程序功能示意如下:获得网卡的信息后就可以按数据捕获的要求打开网卡。但是 大部分的包捕获程序都将混杂模式设为默认。数据包的过滤通过设置数据流过滤规则来实现,数据包过滤处理时嗅探技术中的难点和重点,WinPcap提供了最强大的数据流过滤引擎。它才用了一种高效的方法来捕获网络数据流的某些数据且常常和系统的捕获机制相集成。过滤数据的函数定 UDP的起始位置,就可以解析出原

22、端口和目的端口。数据包捕获流程图:图4.1 数据包捕获流程图4.1 嗅探器设计需要结构体 嗅探器需要的结构体是由IP数据报结构体、TCP报头结构体、UDP报头结构体组成。每个结构体如何定义已在网络嗅探器的原理中具体讲过。4.2 过滤规则的主要代码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 = ht

23、ons(6000);memcpy(&sa.sin_addr.S_un.S_addr, pHostent-h_addr_list0, 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

24、*)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_nto

25、a(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 =(ntohs(pIpheader-ip_len)-(sizeof(struct ipheader)+sizeof(struct tcpheader); lenudp =(ntohs(pIpheader-ip_len)-(sizeof(struct ipheader)+sizeof(struct udphdr

26、);4.3 循环抓包4.3.1 TCP包if(pIpheader-ip_p)=IPPROTO_TCP&lentcp!=0)printf(*n);pCount+; datatcp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct tcpheader); printf(-TCP-n);printf(n目的IP地址:%sn,szDestIP);printf(n目的端口:%in,ntohs(pTcpheader-dport);printf(datatcp address-%xn,datatcp);printf(size of

27、 ipheader-%in,sizeof(struct ipheader);printf(size of tcpheader-%in,sizeof(struct tcpheader);printf(size of the hole packet-%in,ntohs(pIpheader-ip_len);printf(nchar Packet%i %i=,pCount,lentcp-1);for (i=0;ilentcp;i+)printf(x%.2x,*(datatcp+i);if (i%10=0)printf(n);printf(;nnn);for (i=0;ilentcp;i+)if( *(

28、datatcp+i)=20)printf(%c,*(datatcp+i);elseprintf(.);printf(nn*n); 运行后的结果:图4.3.1 TCP包运行结果4.3.2 UDP包if(pIpheader-ip_p)=IPPROTO_UDP&lentcp!=0)pCount+;dataudp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct udphdr); printf(-UDP-n);printf(n目的IP地址:%sn,szDestIP);printf(n目的端口:%dn,ntohs(pTcphe

29、ader-dport);printf(UDP数据地址:%xn,dataudp);printf(IP头部长度:%in,sizeof(struct ipheader);printf(UDP头部长度:%in,sizeof(struct udphdr);printf(包的大小:%in,ntohs(pIpheader-ip_len);printf(nchar Packet%i %i=,pCount,lenudp-1);for (i=0;ilenudp;i+)printf(x%.2x,*(dataudp+i);if (i%10=0)printf(n);printf(;nnn);for (i=0;ilenu

30、dp;i+)if( *(dataudp+i)=20)printf(%c,*(dataudp+i);elseprintf(.);printf(nn*n); 运行后的结果:图4.3.2 UDP包运行结果5 总结通过这次课程设计,使我更加扎实的掌握了有关嗅探器方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。这次课程设计不仅培养了我独立思考、动手操作的能力,在各种其它能力上也都有了提高。从理论到实践,在这段日子里,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。使我懂得了理论

31、与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。此次设计也让我明白了思路即出路,有不懂或不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。参考文献:1吴功宜,董大凡王珺等.计算机网络高级软件编程技术【M】.北京:清华大学出版社,20082谢小特,王勇军.基于winPcap的捕包程序设计【J】.软件特刊,2007(11):71-723胡晓元,史浩山.winpcap包截获系统的分析及其应用【J】.计算机工程,2005(1):96-

32、974赵辉,叶子青.VisualC+系统开发实例精粹【M】,北京:人民邮电出版社,2005附件:#include /*windows socket的头文件,系统定义的*/ #include #include #include #include #pragma comment(lib,ws2_32.lib) /*链接API相关连的Ws2_32.lib静态库*/ #define MAX_HOSTNAME_LAN 255 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define MAX_ADDR_LEN 16 struct ipheader unsigned

33、char ip_hl:4; /*header length(报头长度)*/ unsigned char ip_v:4; /*version(版本)*/ unsigned char ip_tos; /*type os service服务类型*/ unsigned short int ip_len; /*total length (总长度)*/ unsigned short int ip_id; /*identification (标识符)*/ unsigned short int ip_off; /*fragment offset field(段移位域)*/unsigned char ip_tt

34、l; /*time to live (生存时间)*/ unsigned char ip_p; /*protocol(协议)*/ unsigned short int ip_sum; /*checksum(校验和)*/ unsigned int ip_src; /*source address(源地址)*/ unsigned int ip_dst; /*destination address(目的地址)*/ ; /* total ip header length: 20 bytes (=160 bits) */ typedef struct tcpheader unsigned short in

35、t sport; /*source port (源端口号)*/ unsigned short int dport; /*destination port(目的端口号)*/ unsigned int th_seq; /*sequence number(包的序列号)*/ unsigned int th_ack; /*acknowledgement number(确认应答号)*/ unsigned char th_x:4; /*unused(未使用)*/ unsigned char th_off:4; /*data offset(数据偏移量)*/ unsigned char Flags; /*标志全

36、*/ unsigned short int th_win; /*windows(窗口)*/ unsigned short int th_sum; /*checksum(校验和)*/ unsigned short int th_urp; /*urgent pointer(紧急指针)*/ TCP_HDR; typedef struct udphdr unsigned short sport; /*source port(源端口号)*/ unsigned short dport; /*destination port(目的端口号)*/ unsigned short len; /*udp length

37、(udp长度)*/ unsigned short cksum; /*udp checksum(udp校验和)*/ 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 nameMAX_HOSTNAME

38、_LAN; char szSourceIPMAX_ADDR_LEN, szDestIPMAX_ADDR_LEN,RecvBuf65535 = 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);

39、pHostent = gethostbyname(name); sa.sin_family = AF_INET; sa.sin_port = htons(6000); memcpy(&sa.sin_addr.S_un.S_addr, pHostent-h_addr_list0, pHostent-h_length); bind(sock, (SOCKADDR *)&sa, sizeof(sa); /*bind()设定自己主机的IP地址和端 口号*/ if (WSAGetLastError()=10013) exit(1); WSAIoctl(sock, SIO_RCVALL, &optval,

40、 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

41、(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 =(ntohs(pIpheader-ip_len)-(sizeof(struct ipheader)+sizeof(struct tcpheader); lenudp =(ntohs(pIpheader-ip_len)-(sizeof(struct ipheader)+sizeof(struct

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论