毕业设计(论文)-半打开端口扫描技术的实现.doc_第1页
毕业设计(论文)-半打开端口扫描技术的实现.doc_第2页
毕业设计(论文)-半打开端口扫描技术的实现.doc_第3页
毕业设计(论文)-半打开端口扫描技术的实现.doc_第4页
毕业设计(论文)-半打开端口扫描技术的实现.doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

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

文档简介

半打开端口扫描技术的实现半打开端口扫描技术的实现 摘摘 要要 随着互联网的飞速发展,网络入侵行为日益严重,网络安全日益成为人们 关注的焦点。端口扫描技术是网络安全扫描技术的重要技术之一。对目标系统 进行端口扫描,是网络系统入侵者进入目标系统的第一步。本文对端口扫描技 术的原理和应用进行了阐述,并设计了一个简单的基于windows平台上的端口扫 描系统。在论文中介绍了半打开扫描中的syn探测技术,分析了这种扫描技术实 现的原理和特点。实际设计中采用了扫描安全性和可行性较好的syn探测技术来 实现端口扫描,并实现了端口列表自定义,扫描结果存储等几大模块化功能。 最后结合当前的实际情况对端口扫描的未来发展方向提出了一点个人的看法。 关键词关键词:网络安全;端口扫描;syn 探测 591 论文网 www.591lw.com the implementation of a port-scanning program based on semi-opened port technology abstract with the quick development of the internet, network intrusion behavior becomes more and more serious; network security becomes the focus which people pay attention to. port-scanning technology is one of the most important technologies of the safe scanning on internet. the first step that network system intruders enter the target system is the port scanning of the system. this essay explains the principle and application of the port scanning technology, and then designs a simple port-scan system which bases on the windows platform. the paper introduces the syn probe technology of the semi-open scan technologies, analyzes its implementing principle, approach and characters. in the real design it use the syn probe technology which has a better scanning security and feasibility to achieve the port scanning, then realize user-defined port list function, recording of the scanning result, and some other functional modules. at last, combined with the nowadays actual situation, the paper brings a few personal minds for the future direction of the development of the port- scanning. key words: network security;port scanning;syn probe 591 论文网 www.591lw.com 目目 录录 论文总页数:22 页 1引言1 1.1端口扫描概述1 1.2端口扫描技术的国内外研究现状1 1.3端口扫描原理1 1.4端口扫描技术概要2 1.5syn 技术详解.3 1.5.1tcp 包探测原理.3 1.5.2syn 包探测.4 1.5.3分组时延4 1.6端口扫描实现方法4 2需求分析4 2.1端口扫描器的总体要求4 2.1.1设计背景4 2.1.2用户特点4 2.1.3软件开发及运行环境5 2.2端口扫描器的需求分析5 3端口扫描器的实现5 3.1功能模块简介5 3.2程序实现流程6 3.3syn 探测的实现.6 3.4端口扫描功能模块15 3.4.1端口选择模块15 3.4.2目标 ip 选取模块16 3.4.3终止扫描17 3.4.4扫描结果存储模块17 4测试环境及结果18 4.1硬件环境18 4.2软件环境18 4.3测试结果18 5端口扫描技术的发展方向和趋势19 结 论19 参考文献20 第 1 页 共 22 页 1 1 引言引言 1.11.1 端口扫描概述端口扫描概述 网络安全探测在网络安全中起着主动防御的作用,占有非常重要的地位。 网络安全探测的所有功能都是建立在端口扫描的基础上,所以对端口扫描技术 的研究有着非常重要的现实意义。 每一个网络主机都相当于一个“房间”,黑客能否进入“房间”,取决于是否 发现了打开的“门窗”。也就是说,能否入侵网络主机,或者网络主机是否安全, 关键在于能否查出网络主机的系统信息。而端口是主机与外界通讯交流的数据 出入口,即是“门窗”。端口分为硬件端口和软件端口,所谓硬件端口又称为接 口,包括:usb 端口、串行端口、并行端口等。软件端口一般指网络中面向连 接服务(tcp)和无连接服务(udp)的通讯协议的端口。一个端口就是一个潜在的 通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有 用的信息。通过端口扫描,发现系统的安全漏洞。它使系统用户了解系统目前 向外界提供了哪些服务,从而为系统用户管理网络提供了一种手段。 1.21.2 端口扫描技术的国内外研究现状端口扫描技术的国内外研究现状 网络的安全状况取决于网络中最薄弱的环节,任何疏忽都可能引入不安全 的因素,最有效的方法是定期对网络系统进行安全性分析,及时发现并修正存 在的脆弱性,保证系统的安全。 国外安全扫描技术的历史可以追溯到 20 世纪 90 年代,当时因特网刚刚起 步,但是在过去的十多年内,扫描技术飞速发展,迄今为止,其扫描技术己经 非常完善,但是在全面性、隐蔽性和智能性上还有待提高。而安全扫描器从最 初专门为 unix 系统而编写的一些只有简单功能的小程序发展到现在,己经出 现了可以运行在多个操作系统平台上的、具有复杂功能的系统程序。 国内的扫描技术是在国外扫描器基础上发展起来的。其中有些专门从事安 全技术的公司包括绿盟科技、启明星辰等等。这些公司的扫描器以硬件为主, 其特点是执行速度快,不像软件一样受到安装主机系统性能的限制。 然而对于更多的基于主机的端口扫描器而言,简单、实用、可靠才是它们 的长处。 1.31.3 端口扫描原理端口扫描原理 端口扫描通常指用同一个信息对目标主机的所有需要扫描的端口进行发送 探测数据包即扫描,然后,根据返回端口的状态来分析目标主机端口是否打开, 是否可用。端口扫描通过与目标主机的 tcp/ip 端口建立连接并请求某些服务, 记录目标主机的应答,收集目标主机相关信息,从而发现目标主机某些内在的 第 2 页 共 22 页 安全弱点,并且确定该端口什么服务正在进行并获取该服务的信息。端口扫描 也可以通过捕获本地主机或服务器的流入流出 ip 数据包来监视本地主机的运行 情况,它仅能对接收到的数据进行分析,帮助我们发现目标主机的某些内在的 弱点,而不会提供进入一个系统的详细步骤。 1.41.4 端口扫描技术概要端口扫描技术概要 端口扫描途径主要是扫描器。扫描器是一种自动检测远程或本地主机安全 性弱点的程序,通过使用扫描器可以不留痕迹的发现远程服务器的各种 tcp 端 口的分配及提供的服务和它们的软件版本。这就能让我们间接的或直观的了解 到远程主机所存在的安全问题。 扫描器通过选用远程 tcp/ip 不同的端口的服务,并记录目标给予的回答, 通过这种方法,可以搜集到很多关于目标主机的各种有用的信息。扫描器有三 项功能:发现一个主机或网络的能力;一旦发现一台主机,有发现什么服务正 运行在这台主机上的能力;通过测试这些服务,发现漏洞的能力。 为了理解扫描以及它的工作原理,首先应对 tcp 的三次握手机制有所了解。 tcp 的报头包含一个序列号和一些起着特殊作用的标记位。这里仅提到其中的 四个标记位:syn(同步),ack(确认),rst(复位)和 fin(完成)。它们四个的作 用与这里讨论的主题密切相关。 当系统间建立连接和释放连接时,就会用到所谓的握手机制。本文中所提 到的连接均指的是发生在两个 ip 地址间,有一定的端口号的连接。 它的工作原理大致如下:握手的第一步,一台计算机首先请求和另外一台 计算机建立连接,它通过发送一个 syn 请求来完成,也即前面提到的 syn 标 记位置位。两台计算机间每条信息都有一个由发送方产生的序列号,序列号的 使用使得双方知道他们之间是同步的,而且还可以起到丢失信息时或接收顺序 错误时发送警告信息的作用。 握手的第二步,接收到 syn 请求的计算机响应发送来的序列号,它会将 ack 标记位置位,同时它也提供自己的序列号。到现在为止,发起连接建立请 求的计算机认为连接已经建立起来,然而对方却并不这样认为,对方还要等到 它自己的序列号有了应答后才能确认连接建立起来。因此现在的状态称为“半连 接”。如果发起连接请求的计算机不对收到的序列号做出应答,那么这个连接就 永远也建立不起来,而正因为没有建立连接,所以系统也不会对这次连接做任 何记录。 握手的第三步,发起连接请求的计算机对收到的序列号作出应答,这样, 两台计算机之间的连接才算建立起来。 两台计算机释放连接时的情况与此类似:当一台计算机说没有更多的数据 第 3 页 共 22 页 需要发送了,它发送一个 fin 信号(将 fin 标记位置位)通知另一端,接收到 fin 的另一端计算机可能发送完了数据,也可能没发送完,但它会对此作出应 答,而当它真正完成所有需要发送的数据后,它会再发送一个自己的 fin 信号, 等对方对此作出应答后,连接才彻底解除。 1.51.5 synsyn 技术详解技术详解 .1 tcptcp 包探测原理包探测原理 高效的探测方法需要解决 3 个问题:(1)用几个包判断主机和端口状态;(2) 占用双方的资源少;(3)准确的分组时延计算方法。如果不建立完整的 tcp 连接, 直接用 tcp 包来检测 tcp 应用服务端口的状态,会有效地提高探测效率和准 确性。对于问题(1)和(2),可以借鉴 tcp 端口扫描技术,发送特殊 tcp 包解决。 对于问题(3),可以在仿照 ping 的方式在 tcp 某些字段或选项中嵌入时间戳来 解决。 tcp 端口扫描技术通过发送一些特殊的 tcp 包判断目标主机和端口状态。 端口扫描通过扫描目标主机的大量端口,发现系统的漏洞。而服务器的地址和 端口一般都是公开的,如果只探测服务器的工作端口,不用探测其余的端口, 可以向工作端口发送特殊的 tcp 包,根据返回包判断目标状态。绝大多数 tcp/ip 协议栈的实现遵循以下原则: (1)当一个 syn 或者 fin 数据包到达一个关闭的端口,tcp 丢弃数据包同 时发送一个 rst 数据包。 (2)当一个包含 ack 的数据包到达一个监听端口时,数据包被丢弃,同时 发送一个 rst 数据包。 (3)当一个 syn 数据包到达一个监听端口时,正常的三阶段握手继续,回 答一个 syn|ack 数据包。 (4)当一个 fin 数据包到达一个监听端口时,数据包被丢弃。“fin 行为”(关 闭的端口返回 rst,监听端口丢弃包),在 urg 和 psh 标志位置位时同样要发 生。所有的 urg,psh 和 fin,或者没有任何标记的 tcp 数据包都会引起 “fin 行为”。一般 tcp 端口扫描根据以上方式的发包收包来判断主机与端口状 态。因为 fin 包不能直接探测监听端口,所以通常选择使用 syn 包或 ack 包 探测监听端口。一些防火墙出于安全的考虑,将发现和拦截 ack 与 fin 探测 包,但不会拦截 syn 包。通过网络上别人的一些测试和实验发现,对 internet 中发布的 60 个 http 代理服务器进行探测。其中,97%的服务器对 syn 包有 应答,只有 53%的服务器对 ack 包有应答。实验发现对 syn 包无应答的主机 对任何 tcp 包都无应答。无论服务器有什么样的安全处理规则,根据方式(1)(2), syn 请求都会得到应答,所以选择 syn 包作为探测包。 第 4 页 共 22 页 .2 synsyn 包探测包探测 第一步:客户端向服务器的工作端口发送 syn,服务器返回 syn|ack 包 或 rst 包。如果客户端收到 syn|ack,则可以肯定服务器活动和端口开启。 收到 rst 包,则说明服务器活动但端口关闭,客户端不用执行第二步。如果超 时无应答,则认为包丢失。 第二步:因为不需要建立正常的 tcp 连接,所以对应答 ack 包的服务器 发送 rst 包,保证服务器端关闭半连接。因为只有少量报文对端口探测,不会 引起安全系统的报警。使用 syn 包探测,可以检测服务器和端口的状态、分组 时延、丢包率,又可以穿透防火墙,符合网络对安全的要求。 .3 分组时延分组时延 假如用定时器来计算分组往返的时间,大量的定时器会造成资源极大消耗。 虽然 tcp 协议规定了时间戳选项(类型 8),用该选项中嵌入时间戳,服务器返 回包的选项部分含有发送的时间戳。然而,在具体 tcp/ip 协议实现中,有些 tcp/ip 协议栈会忽略该选项,或者选项值置 0,无法得到往返时间。如果能像 ping 一样保证某一字段的数据在往返中不改变,就可以像 ping 一样嵌入时间戳。 但 tcp 的各字段不能保证往返数据一致。可以考虑用一种变通的方式嵌入时间 戳。对于客户机发送的 syn 报文,设序号 x,则服务主机返回报文的确认序号 等于 x+1。利用发送序号和确认序号的关系来传递时间戳。设置 syn 包的发送 序号为时间戳,收到的 syn|ack 包或 rst 包的确认序号减 1 即可得到发送包 的时间戳。用收到包的时间减去发送时间戳即得到分组时延。 1.61.6 端口扫描实现方法端口扫描实现方法 本文通过对基于半打开的端口扫描技术的实现来介绍了现在一些主流的端 口扫描技术,通过对程序的开发加深了对端口扫描技术的认识。经过对端口扫 描技术的了解和认识,本文采用隐蔽性较好基于主机的 syn 刺探技术来实现。 2 2需求分析需求分析 2.12.1 端口扫描器的总体要求端口扫描器的总体要求 .1 设计背景设计背景 该端口扫描器是面向普通用户使用,以期成为一个普通用户用来检测端口 网络主机端口并有效地保护自己。在采用 syn 刺探方式进行扫描的基础上成为 一个基于半打开的实用、简单、方便的端口扫描工具。 .2 用户特点用户特点 由于该端口扫描系统是一个基于半打开的端口扫描器,其面向的是普通的 对于端口扫描有需求的用户,因此需要提供一个简洁、方便、高效的界面和功 第 5 页 共 22 页 能。 .3 软件开发及运行环境软件开发及运行环境 系统开发工具:visual c+ 6.0 2.22.2 端口扫描器的需求分析端口扫描器的需求分析 端口扫描器的一般需求: (1)隐蔽性需求 作为扫描的一方来说,端口扫描除了要能扫出目标主机的端口信息以外, 还需要能有一定的隐蔽性,以最大的可能不在目标主机留下访问信息。如果仍 然采用基于 tcp connect()的扫描则将很容易被目标主机记录,因此从隐蔽性上 考虑 syn 半打开扫描或者 fin 扫描会是很好的选择。 (2)端口选择需求 当我们在使用扫描软件对目标主机进行扫描的时候,有的时候是有目的性 地扫描目标主机的某一个端口,然而在大部分时候却需要扫描批量端口或者是 一些重要的指定端口。这个时候需要端口扫描系统具有自定义端口列表的功能。 (3)扫描结果存储需求 在进行完一次端口扫描之后,需要对结果进行保存。无论是攻击还是检测, 端口扫描器是需要与其他的一些工具配合到一起使用的,所以要求端口扫描器 一定要具有存储结果的功能,以将扫描得到的目标主机端口信息保存下来。 3 3端口扫描器的实现端口扫描器的实现 3.13.1 功能模块简介功能模块简介 3.23.2 程序实现流程程序实现流程 3.33.3 synsyn 探测的实现探测的实现 (5)原始套接字包发送完后,就可以接收目标主机的回应。当发送原始套 接字包时(如 tcp syn 数据包),操作系统核心并不知道,也没有此数据发送或 者连接建立的记录。因此,当远端主机回应时,系统核心就把这些包都全部丢 掉,从而到达不了应用程序上。所以,程序中不能简单地使用接收函数来接收 这些数据包。要达到接收数据包的目的,必须采用嗅探,接收所有通过的数据 包,然后进行筛选,留下符合需要的。为此可以表示接收所有的数据。通过设 置原始套接字的 i/0 控制命令,便可以调用 sio_rcvall 接收返回的数据包, 分析是不是扫描程序返回的。 dword winapi listeningfunc(lpvoid lpvoid) /定义套接字 rawsock,以连接应用程序和监听的本地网卡 socket rawsock;sockaddr_in addr_in=0; 第 6 页 共 22 页 int settimeout = 500; inforlisten* lp =(inforlisten*)lpvoid; int num = lp-num; *省略部分代码* if(rawsock=socket(af_inet,sock_raw,ipproto_ip)=invalid_soc ket) /建立原始 ipproto_ip 套接字 afxmessagebox(“socket setup error!n“); return false; addr_in.sin_family=af_inet; 构造 syn 包,最好选用较大的端口号作为发送端口,以免和应用程序正在 使用的端口发生冲突。在这里我们选用的是 8288。另外在构造 tcp 头的时候, 还添加了 tcp 选项 sack,保证 tcp 连接请求被接受。 addr_in.sin_port=htons(8288); /设置接收的端口为 8288 addr_in.sin_addr.s_un.s_addr=htonl(inaddr_any); /监听所有的本地 ip 地址 /对 rawsock 绑定本机 ip 和端口,当系统收到目标的返回信息时,便 可以通过 rawsock 传到应用程序当中。 int ret=bind(rawsock, (struct sockaddr *) if(ret=socket_error) afxmessagebox(“bind false“); 程序使用两次判断来过滤 ip 包。 首先判断 ip 头部,要求目的地址是本机、协议号是 tcp 协议。然后再判 断 tcp 头部,要求目的端口等于选用端口号,控制标志位为 syn|ack 或者 rst。因为监听套接字会接收到所有的 ip 包,要保证能尽快处理分组,如图 4 所示。 第 7 页 共 22 页 图 4 返回 ip 包的接收及过滤 设置 sio_rcvall,包括延时和数据大小等信息,以接收所有的数据包。 在收到返回信息的时候接受并分析数据包是否为应用程序返回的信息。 setsockopt(rawsock,sol_socket,so_rcvtimeo, (char *) dword lpvbuffer = 1; dword lpcbbytesreturned = 0; /设置一个套接口的模式,接受所有数据 wsaioctl(rawsock, sio_rcvall, *省略部分代码* char recvbuf256=0; /接收数据包 ret=recvfrom(rawsock,recvbuf,sizeof(recvbuf),0,(struct sockaddr*) if(ret!=socket_error) /分析数据包 ipheader *lpipheader; lpipheader=(ipheader *)recvbuf; 这里从接受到的数据中分离出 ip 报头 lpipheader,接着又从 ip 报头中继续 分离出源地址 sourceip,并判断源地址是否在起始 ip 和结束 ip 的范围内和是否 为远程开放端口返回的数据包。 if(lpipheader-proto=ipproto_tcp *省略部分代码* inserttotree (htree,strip,csport); (6)在扫描完成以后,使用函数 inserttotree 将结果插入到结果树中 htree,并在结果树中进行排序,使得结果按照选择的方式展开或合拢。 void inserttotree (ctreectrl* htree,cstring csip,cstring csport) htreeitem a=htree-insertitem(csip,null,tvi_last); htree-insertitem(csport,a,tvi_last); 3.43.4 端口扫描功能模块端口扫描功能模块 .1 端口选择模块端口选择模块 选择从端口范围或默认端口列表中获取待扫描的端口,首先通过消息传递 函数 m_ischecked 来判断是否得到了选取端口范围的消息,如果是,则获取起 始端口和结束端口的数据并判断起始端口是否不大于结束端口;如果没有传来 消息,则尝试调用 m_portlisttree.getnextitem 从自定义端口列表树中得到当 前所选择的默认端口并从端口列表树中继续获得下一个端口。 bool clscanportdlg:readporttoportlist() updatedata(); 第 9 页 共 22 页 这里通过 m_ischecked 获得选取端口范围的消息,然后就判断端口范围是 否符合规则,即起始端口不应该大于结束端口。 if ( m_ischecked ) if ( m_portfrom m_portto ) afxmessagebox(“起始端口 不应该大于 结束端口!“); return false; while ( m_portfrom isblank() ) afxmessagebox(“ip 地址 不能为空!“); return false; *省略部分代码* afxmessagebox(“ip 地址 不能为空!“); return false; pip-getaddress(m_endip); 最后使用 if 循环来判断 m_startip 和 m_endip,当 m_startip 大于 m_endip 的时候,返回提示信息“起始 ip 必须enablewindow(true),以使界面上的按钮有效,可以重新 开始扫描。 .4 扫描结果存储模块扫描结果存储模块 通过使用 onbuttonsaveresult 函数,在得到保存结果的消息后首先判断结 果地址树是否为空,如果有扫描结果则创建一个标准文件对话框以准备存储扫 描结果。在创建成功以后将扫描结果列表树上的数据写入到文本框中以存储本 次扫描的结果。 第 11 页 共 22 页 如果程序仍然处于扫描状态中,将不能保存结果。通过全局变量判断程序 是否处于扫描状态,如果没有则创建一个命为“result.txt”的文本文件来保存 扫描结果。 if ( :ok = true ) afxmessagebox(“失败,还在扫描,请等待停止后再保存!“); return; tchar prmax_path=0; getmodulefilename(null,pr,max_path); memset(pr+strlen(pr)-4,0,4); strcat(pr,“result.txt“); /创建标准文件对话框,用 fdlg.domodal()来显示创建的对话框 当打开文件的时候属性设置为写入,并将得到的扫描结果保存到创建的文 本文件当中。 file* fp = fopen(fname,“w“); if ( fp = null ) afxmessagebox(“写入失败!“); return; fprintf(fp,“portscanner 扫描结果如下:n“); 定义两个结构体 a 和 b,a 表示结果树中的 ip 地址,b 表示每个 ip 下面 扫描出来的端口信息。在对扫描结果进行保存的时候,首先用 a 通过 m_listtreeresult.getitemtext()得到一个扫描的 ip,然后将所有扫描这个 ip 得 到的端口子属性 m_listtreeresult.getnextsiblingitem()写到 a 的下面。如此循 环便可以将所有的 ip 和扫描出来的端口保存到创建的文本文件中。 *省略部分代码* fclose ( fp); afxmessagebox(“成功写入!“); 第 12 页 共 22 页 /创建标准文件对话框失败 else if (nresponse = idcancel) return; 4 4测试环境及结果测试环境及结果 4.14.1 硬件环境硬件环境 计算机:cpu:sempron2200+ oc 1.8g 内存 512m 网络环境:局域网 4.24.2 软件环境软件环境 系统环境:windows xp 编译工具:visual c+ 6.0 4.34.3 测试结果测试结果 通过和寝室同学搭建的一个局域网,对所设计的端口扫描器进行了实验。 在一开始的实验中,发现扫描速度及结果的准确率都不理想。在经过编程测试 后发现是延时设置过小的原因。接受包的延时本来设置为 1000 毫秒,但正是由 于延时过小,所以不能及时接收返回的包,导致了结果准确率不高,很多扫描 的结果都不能显示出来。发现这一问题后,将延时设置为 5000 毫秒,这时扫描 速度及准确度大大提高。 5 5端口扫描技术的发展方向和趋势端口扫描技术的发展方向和趋势 在未来,端口扫描将不仅仅作为一个简单的工具,它会集成更多的功能, 或是和别的工具结合起来,成为一个综合的检测工具。仅仅借助单一的漏洞扫 描等工具进行的安全评估是不完整的、有局限性的,它不能够很好地表现信息 系统的安全特征,因此需要一种既能够有效收集系统中各主机的安全信息,又 能够及时发现网络中发送信息的源地址相关信息的工具为安全评估提供支持。 现在已有一些综合扫描系统既能实现安全扫描,又能监听并分析系统中的数据 包,提供网络中的存在的漏洞及安全状况,成为一个综合扫描系统。 综合扫描系统是一种自动检测远程或本地主机安全脆弱点的程序,通过使 用扫描系统,系统管理员能够发现所维护的 web 服务器的各种 tcp 端口的分 配、提供的服务、web 服务软

温馨提示

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

评论

0/150

提交评论