UNIX 网络协议的深度分析_第1页
UNIX 网络协议的深度分析_第2页
UNIX 网络协议的深度分析_第3页
UNIX 网络协议的深度分析_第4页
UNIX 网络协议的深度分析_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

UNIX网络协议的深度分析简介:无论您是在监控您的网络以便发现性能问题、调试一个应用,还是在您的网络上发现一个您不认识的应用,有时您都需要对您的UNIX®网络中使用的协议进行深度分析,以便了解它们的作用。有一些协议很容易确定和理解,即使它们使用非标准端口。而另外一些协议则需要进行更多的观察以了解它们在做什么、在交换什么信息。在本文中,我们将介绍对UNIX网络中使用的协议进行深度分析的技术。引言网络已经是无处不在,很多时候我们都会利用网络与不同主机进行通信,包括网络内部和外部的。大多数情况下这不会遇到问题,但是有时您需要仔细检查您的网络以查明问题原因。仔细检查网络流量内容的原因有很多。其中第一个原因是您可能正在调试一个现有的网络应用,或者您正在开发一个应用,而您想要监控通过您的网络的流量。第二个原因是需要识别可能耗尽网络带宽和资源的流量。对于前一种情况,您可能已经知道协议的内容了,但是您希望能够更深入地了解正在传输的实际数据,例如,在使用Web服务时。对于后一种情况,确定数据包的内容需要了解正在使用的协议的一些扩展知识。在TCP/IP和UDP/IP的通信中,最主要的元素是用于确定主机和端口号的IP地址。端口号用于提供额外的通信通道,这样您才能够在两个主机之间实现多个连接。其中端口定义还有一些标准。例如,端口25是专用于电子邮件(SMTP)传输,而大多数网站都是运行在端口80(HTTP)上的。这些规范可以使程序之间通过一个熟悉的通道进行通信,这与您选择电话或传真号的道理是一样的。虽然有这样一些规范,但是您实际想使用哪些端口是没有任何限制或约束的。事实上,大多数情况下一些破坏性网络应用和一些安全性方法会故意使用非标准端口。例如,有些应用会通过将一个标准端口用于不同的协议而隐藏内容,如在端口25上使用HTTP协议。此外,有时某些应用也会使用与标准不同的端口,这样端口的用途就明显了(如,将端口99用于HTTP),或者将特定的协议流量封装到另一个协议中。最后的方法实际上是网络通道和虚拟私有网络(VPN)所使用的方法。不管网络流量原因和复杂性,第一个步骤都会开始记录数据。记录原始数据如果您希望记录网络原始数据,以便自己检查这些信息,那么您可以使用许多不同的工具。大多数的网络嗅探器也能够解码和解密特定的数据包内容,这能够帮助您研究一个已知协议的内容。在Solaris上,您可以使用snoop工具,而在AIX上,您可以使用iptrace工具。您也可以尝试使用跨平台的tcpdump工具,它支持大多数的UNIX和Linux操作系统。这些工具能够帮您捕捉和解码数据包,通常也能为您执行大多数的协议分析。注意,现代交换机不会将Ethernet数据包发送到每一个端口上,这通常会限制您从当前主机获取的信息量。许多现代交换机具有一个管理端口,它通常带有与这种监控完全相同的所有数据包的副本。解码网络传输最复杂的是网络数据包中信息的级别。此外,大部分信息也会经过二进制编码后再发送,从网络捕捉完全原始的数据包需要进行大量的操作才能捕捉您需要的数据。通过使用实现某些处理的工具,您可以简化解码网络数据的过程。例如,在一个Ethernet上查看一个典型的TCP/IP协议,您将会发现网络中传输的数据包括:Ethernet数据包头,包括Ethernet来源和目标地址,数据包大小和Ethernet数据包类型。IP报头,由IP寻址(来源和目标),协议标识和IP标记。您也会得到关于分片和数据包顺序的信息。TCP报头,它包含端口上的信息、隐含的协议、标记和顺序编号。即使有这些信息,我们仍然无法了解实际内容。在TCP(或UDP)协议之下还有额外的协议,标准数据协议(包括HTTP、SMTP和FTP),或者封装性协议,如RemoteProcedureCall(RPC)和RPC的子类型,如NFS。通常这些工具必须使用协议和/或端口号来确定正在传输的内容。所以,如果流量是通过非标准端口传输的,那么这些信息可能无法正确解码。

基本的网络分析本文之前提到的许多网络嗅探工具都提供了不同级别的协议解码,它们是通过检查端口和内容来确定所使用的协议实现的。例如,snoop和tcpdump都提供了关于UDP和TCP上不同协议的不同级别的详细信息。例如,在snoop中,您可以获得从顶级协议到所传输的单个数据块的关于NFS操作的详细信息。例如,您可以通过指定监控RPC使用NFS协议来实现对NFS流量的监控:$snoop-vrpcnfs。它能输出非常详细的数据包信息,并且它们应该进行更紧密的观察。清单1提供了Ethernet报头数据。清单1.Ethernet报头数据ETHER:EtherHeaderETHER:ETHER:ETHER:ETHER:ETHER:EtherHeaderETHER:ETHER:ETHER:ETHER:ETHER:ETHER:Packet64arrivedat16:14:41.79434Packetsize=238bytesDestination=0:1a:ee:1:1:c0,Source=0:21:28:3c:c0:61,Ethertype=0800(IP)ETHER:这里的输出表明Ethernet数据包包含了IP数据、全部数据包大小和时间,以及数据包的目标和来源地址。清单2显示的是IP报头。其中除了协议和来源/目标地址信息,其余许多IP数据是没有用的。清单2.IP报头IP: -----IPHeader----IP:IP: Version=4IP: Headerlength=20bytesIP:Typeofservice=0x00IP: xxx =0(precedenee)IP: ...0....=normaldelayIP: ....0...=normalthroughputIP: 0..=normalreliabilityIP: 0.=notECNcapabletransportIP: 0=noECNcongestionexperieneedIP:Totallength=224bytesIP: Identification=27460IP: Flags=0x4IP: .1 =donotfragmentIP: ..0=lastfragmentIP:Fragmentoffset=0bytesIP: Timetolive=64seconds/hopsIP:Protocol=6(TCP)IP: Headerchecksum=4d11IP: Sourceaddress=12,tiger.mcslp.priIP: Destinationaddress=,bear.mcslp.priIP:NooptionsIP:在清单3中,您可以看到TCP报头。同样,这些信息中通常只有来源和目标端口号才是有用的,因为这些信息将可用于确定预期的协议,或者提供给您可用于更进一步观察这个端口所传输流量的信息。清单3.TCP报头TCP:-----TCPHeader----TCP:TCP:Sourceport=2049TCP:Destinationport=889(SunRPC)TCP:Sequeneenumber=2834727685TCP:Acknowledgementnumber=2654368001TCP:Dataoffset=32bytesTCP:Flags=0x18TCP: 0 = NoECNcongestionwindowreducedTCP: .0 = NoECNechoTCP: ..0 = NourgentpointerTCP: ...1 .... = AcknowledgementTCP: .... 1... = PushTCP: 0.. = NoresetTCP: 0. = NoSynTCP: 0 = NoFinTCP:Window=32806TCP:Checksum=0x4852TCP:Urgentpointer=0TCP:Options:(12bytes)TCP: -NooperationTCP: -NooperationTCP: -TSVal=34449495,TSEcho=253458642TCP:清单4的倒数第二部分显示的是RPC报头数据。清单4.RPC报头数据RPC:-----SUNRPCHeader----RPC:RPC:RecordMark:lastfragment,length=168RPC:Transactionid=3041181596RPC:Type=1(Reply)RPC:Thisisareplytoframe63RPC:Status=0(Accepted)RPC:Verifier:Flavor=0(None),len=0bytesRPC:Acceptstatus=0(Success)RPC:最后,清单5提供了NFS数据包内容,包括权限(文件模式)、文件大小、拥有者和其他信息。在这里,这个NFS操作请求是进行文件系统统计(这等同于ls操作结果),因此这就是详细信息。清单5.NFS数据包内容NFS:-----SunNFS----NFS:NFS:Proc=18(Getfilesystemstatistics)NFS:Status=0(OK)NFS:Post-operationattributes:NFS: Filetype=2(Directory)NFS: Mode=0777NFS: Setuid=0,Setgid=0,Sticky=0NFS: Owner'spermissions=rwxNFS: Group'spermissions=rwxNFS: Other'spermissions=rwxNFS: Linkcount=24,UserID=502,GroupID=10NFS: Filesize=29,Used=2560NFS: Special:Major=4294967295,Minor=4294967295NFS: Filesystemid=781684113418,Fileid=4304616NFS: Lastaccesstime=28-Feb-1015:49:51.042953989GMTNFS: Modificationtime=25-Feb-1009:39:07.965422590GMTNFS: Attributechangetime=25-Feb-1009:39:07.965422590GMTNFS:NFS:Totalspace=759567510016bytesNFS:Availablespace=659048374272bytesNFS:Availablespace-thisuser=659048374272bytesNFS:Totalfileslots=1288161604NFS:Availablefileslots=1287203856NFS:Availablefileslots-thisuser=1287203856NFS:Invarianttime=0secNFS:在这里,我们可以看到所查询的文件事实上是一个目录(见文件类型行)。虽然我们没有得到文件的实际路径,但是我们可以通过使用Find命令来查询inode号对应的文件/路径来查找上面提到的目录(见清单6)。清单6.查询inode号对应的文件$find/scratch-xdev-inum4304616/scratch/installed/mysql-6.0.11如果您准备分辨流量,那么使用这些工具的最佳方法是首先运行它们,收集尽可能多的数据,然后手动检查数据内容,找出您的网络本来不应该出现的数据项。一旦您识别出了可疑流量,您就可以开始在命令行上添加参数以便关注于流量细节。例如,您可以使用清单7所示的命令之一,规定只显示特定主机的流量。清单7.规定只显示一个特定主机的流量$snoophost$tcpdumphost要进一步限制,您可以限制协议信息的端口:$snoophostandport25。解析原始数据以理解数据包内容处理来自tcpdump的另一个方法是将原始网络数据包数据保存到一个文件中,然后处理这个文件以便查找和解码出您想要的信息。有许多使用不同语言编写的模块具有读取和解码tcpdump和snoop捕捉的数据的功能。例如,有两个用Perl编写的模块:Net::SnoopLog(针对snoop)和Net::TcpDumpLog(针对tcpdump)。它们将读取原始数据内容。这些模块的基本接口是相同的。要开始处理,您首先需要使用snoop或tcpdump将数据写到一个文件,而创建一个通过网络的数据包的二进制记录。对于本例,我们将使用tcpdump和Net::TcpDumpLog模块:$tcpdump-wpackets.raw。收集网络数据完成后,您就可以开始处理网络数据内容以查找您想要的信息。Net::TcpDumpLog会解析tcpdump所保存的原始网络数据。因为这些数据是以原始的二进制格式保存的,解析这些信息就需要处理这个二进制数据。为了方便起见,您可以使用另一组模块NetPacket::*来解码原始数据。例如,清单8显示的是一个打印所有数据包的IP地址信息的简单脚本。清单8.打印所有数据包的IP地址的简单脚本useNet::TcpDumpLog;useNetPacket::Ethernet;useNetPacket::IP;my$log=Net::TcpDumpLog->new();$log->read("packets.raw");foreachmy$index($log->indexes){my$packet=$log->data($index);my$ethernet=NetPacket::Ethernet->decode($packet);if($ethernet->{type}==0x0800){my$ip=NetPacket::IP->decode($ethernet->{data});printf("%sto%sprotocol%s\n",$ip->{src_ip},$ip->{dest_ip},$ip->{proto});}}第一部分是提取每一个数据包。Net::TcpDumpLog模块会将每一个数据包序列化,这样我们就能够通过数据包ID读取每一个数据包。然后data()函数就会返回整个数据包的原始数据。通过snoop的输出,我们必须从原始网络数据包信息中提取每一个数据块。所以在本例中,我们首先需要从原始网络数据包中提取Ethernet数据包,包括数据有效负载。而NetPacket::Ethernet模块能够帮我们执行这个操作。因为我们寻找的是IP数据包,所以我们能通过检查Ethernet数据包类型来检查IP数据包。IP数据包的ID为0x0800。然后,NetPacket::IP模块会被用于从Ethernet数据包的数据负载中提取出IP信息。这个模块能提供来源IP、目标IP和协议信息等等,然后我们可以打印出这些信息。通过使用这个基本的框架,您就能够执行不依赖于tcpdump或snoop的自动化解决方案的更复杂查询和解码。例如,如果您怀疑HTTP流量是通过一个非标准端口传输的(如,不是端口80),那么您可以使用清单9中的脚本在怀疑的主机IP的非80端口上检查HTTP数据包。清单9.在非80端口上检查HTTP数据包useNet::TcpDumpLog;useNetPacket::Ethernet;useNetPacket::IP;useNetPacket::TCP;my$log=Net::TcpDumpLog->new();$log->read("packets.raw");foreachmy$index($log->indexes)my$packet=$log->data($index);my$ethernet=NetPacket::Ethernet->decode($packet);if($ethernet->{type}==0x0800){my$ip=NetPacket::IP->decode($ethernet->{data});if($ip->{src_ip}eq''){if($ip->{proto}==6){my$tcp=NetPacket::TCP->decode($ip->{data});if(($tcp->{src_port}!=80)&&($tcp->{data}=~m/HTTP/)){print("FoundHTTPtrafficonnon-port80\n");printf("%s(port:%d)to%s(port:%d)\n%s\n",$ip->{src_ip},$tcp->{src_port},$ip->{dest_ip},$tcp->{dest_port},$tcp->{data});}}}}}在一个示例数据包集上运行上面的脚本会返回如清单10所示的结果。清单10.在一个示例数据包集上运行这个脚本$perlhttp-non80.plFoundHTTPtrafficonnon-port80(port:39280)to00(port:80)GET/statuses/user_timeline.jsonHTTP/1.1FoundHTTPtrafficonnon-port80(port:39282)to00(port:80)GET/statuses/friends_timeline.jsonHTTP/1在这种特定的情况下,我们发现主机的流量是通向一个外部网站(Twitter)。显然,在这个例子中我们处理的是原始数据,但是您可以使用相同的基本结构进行解码,也可以使用任何公开或私有协议结构的格式的数据。如果您正在使用这个方法使用或开发一个协议,并且您知道协议格式,您就能够提取和监控正在传输的数据。使用一个协议分析器虽然,正如之前提到的,诸如tcpdump、iptrace和snoop等工具都提供了基本的网络分析和解码功能,但是还有一些基于GUI的工具使这个过程更简单。Wireshark就是其中一个工具,它支持大量的网络协议解码和分析。Wireshark的最主要优点之一是您可以捕捉一段时间内的数据包(如tcpdump一样),然后基于不同的协议、端口和其他数据交互地分析和过滤内容。Wireshark也支持大量的协议解码器,这使您能够检查每分钟内数据包和会话的详细内容。您可以看到Wireshark的简单截图显示了所有类型的所有数据包,如图1所示。这个窗口分成三个主要部分:过滤的数据包列表、解码的协议明细和HEX/ASCII格式的原始数据包数据。图1.Wireshark界面■|-EiiP'frtSrtm.a. Applyhwi.-linHifl-S&uree[DestitauiiiMProtdtolLnbTTTTEnrr^i-■LhC.lb-口.D・上JstiEiTr.4u*HIMpIilN|h啊NhinSidJJtfSaJ&JItse:1??IGFtt.3咖1mar» ]ZfN,A<h:$rn=BA2®1157.M7$Kin.iw-e2m1詢fl*2TCP54214>mkap|AOqI-eq^l5ck«l2#521S7.8S6&551M.16A621»2ICB.0.2DNSSta^jard^ueryPTR 1922€53i57.M®155i血d创tv192DNSSlWHMfd如上fyreap-口曲芒PTRDea157.弗;3443i-9-1.1^e.;m.ise.*,!1IMAP尺《卫口仃3『:■OKjCAPASELIT¥tMAP12«5>37月抑欣#a.21就1盟•机丁TfiF54214>ifKipd|5tq-l肚炯店2S56157.BS®97^1W15B62i?2ie@e2IHAPReqr^st;1LOGINamc"Happiness2«7i57.SfiB9M1^2.1^1鋭」窕怡2TCP怖邮J-54214|ACk|5eq=L&4Ack=SMSLJJH恥的34.2168.4.31HAP尺呻EOh|CAP*fi!Lll¥IHAJ>拠日3K.1&Hfl.31^2t皈UIHAPF>q聊Wt:?EM«5NEINBOX157.5^5iw.160e.2192168.ft3IHAPResponse;bFLAGS(\Anwereid\F157.MC6I771Wl&g6.21S2ise.#.3IMAPRectuesi:±UIDSEARCHuns-e«ni57.»±77>1強.i附上.2HTTP/XHLPOST^jidrTilnfJrtfiljics-retvcglHis7^2X9131眸IthB.JLMTCPhttp»4 |AC;K|£可已FlA^k-S?4Ffzkc1&4€(116bytc-sonx1rt.HEbycapturedj:BthurnttEl,$『百:W:BB::flfl:BB BB:M:BB:fliQ}, «:SB:e4_B»:ea: 辆:J斡日<9:生■:£0)Int^rnttPrDtscaLSre:IS?.1&a.e.2 - i&B □总2d堵自.3」)rrsnsmis^lgnCqntr^lFrotqcpl.JrcPqrt:n秤ql<S3B5).MtFqrt£&&?■&(副醇.S<q:冀日1.*Ck:IL1^5L昕JBPratgwlBM4»4BBBMB&SBmMBB«e4i>33 £-.»1»9466強帖Cd31C00ftefttk.®«m—…bf]&2C£T曲lb6&l@■■r■1■■II,ir(r, (□dM加柚BlS3#□isbb45BfLS… I.阳elff药61323S3$期初1…1砒弼*00晒日托7665617J55ja6«?472732B37uplflntry'SM4321315抽94343727Gf712&£b13A5S447■'tDfk&5793-1即1作为Wireshark工具所提供的一个级别的信息和解码的例子,在撰写本文时我注意网络中的一个MySQL服务器返回了一些错误数据包。为了专注于内容,我首先对输出应用了MySQL过滤。您可以通过在Filter输入框中输入一个表达式(类似于tcpdump、snoop或iptract)。或者,您可以单击Expression按钮,然后从内置的列表的中选择一种过滤。您可以在图2中看到一组示例过滤。一旦您选择了某个过滤,单击Apply就可以过滤数据包列表。

图2.选择一个Wireshark过滤R 凶Wiresh^rk:FilterExpression-Profile:DefaultFieldnatns R&lation value(protocol)PBasicFormatXID-Logical-LinL匚orttroi>BAT-B.A.T.M.A.N.Layar3ProtocoFbBCTP-BCTPQ.1990卜BEEP-BlocksExtensibleExchangeProP&ER-BasicEncodingRules(ASN.lX,6BFDControl-BidirectionalForwardingPBGP亠BorderGatewayProtocolbBICC-BearerIndependentCallPBitTorrent-BitTorrentXJ—IbBJNP-匸anonBJMPPBoardwalk-Boardwalk2i通过过滤MySQLXJ—IbBJNP-匸anonBJMPPBoardwalk-Boardwalk2i个带有错误信息的特殊数据包类型。在这里,错误1242表示查询操作失败,由于子查询有问题。您可以通过展开Wireshark窗口的MySQL协议部分查看MySQL协议的内容,如图3所示。图3.检查一个MySQL错误数据包|my5ql~*|十EKpnwwiQE.,.ISaCte-af1 Apply'NO.亠TmeSwrceD-estinationProtocolInfo*J僅曲.阳;iqU-l^tE-□■Xb=-■ ~Keqm-sxyuery~5MJS.&EJ14SmacB.a.aMySQL■fttSpansi?冰5汩33.877251192-1€;@.0.2Hequ<S(QUefy53G3S.861124192.1^6.6.2Hy£OLReque-stquEr#5193S.3B99&11921EB,6.2I921G0.6.2HySQLRe£:pan-&e!DK5353®.916851192168.6.219215B.6.2RySQLRespanrseDK*3?51135119215趴日2192l&e.e2MySQLRequestQuit5^4汩,知la曲谕・1蹶业1I酣1訂用1FtySQLRequestQultS«3S.2691871S3t«166.S.3MyS^Ldespairs57*tS3.i£0.a.aHy5QLRtquu^iQuyy57!41即2H6lK.UB.a.2MySQLRfr5pfift5tEffdr12475®242.925215192.16B.6.2NySi&LRequestQu^fy5B342.9259691921EE.6.2192.166,6.2HySQLReEpon-sifeError1^625&542;92€4471921>SB.@.21921B6.6.2MySQLRequestQuer^占哺42.92€66519216B.B.2I&2.158.62Hy$QLResponse|■Frame5??UliUytronTMire.111bytescaptured)卜EtMrnetIL5rc:輔:恥:阳■如;抽:静[阳:鹽:的:斛:斡:艸趴tot;曲:卿:粧」昭轴;抽?W:e&:68:W:«:W]PTrtlernetPrgtqCOl.SfC:ISJ.lGe.Q3(19I.m.6.2J.Pst:。知」•即丄4)4TranaftnssiciflControlPfflfeoccl.SrcPort!flys-ql(33fr£}sDstP^rt: (£6^42^£ec|1664A.€k!978.Len45看HySiQLPratocolPacketLength划】.PacketHtMDbsr:jE^i-of匸口M:1?42SOL吕LaH2106&ErrormessageSt^quer^rfeturnsiwrethan1foh在这里我们可以看到错误的明细。通过跟踪之前的‘RequestQuery'数据包,我们就可能确定出导致产生错误响应的查询(图4)、图4.导致产生错误响应的MySQL査询OEEtination39.E-^14533.87725139.E8112453B30.^59962S3530,91665154e3&.$113515-4438^911893:5€£3$.J-6919719.2.168«2132.16B.O2192.1686.21^2.163*2i».isee.219:.163.e.2193.16S01阳脅SiSIi„iiXbts.a.jlCB.a.21EB.62OEEtination39.E-^14533.87725139.E8112453B30.^59962S3530,91665154e3&.$113515-4438^911893:5€£3$.J-6919719.2.168«2132.16B.O2192.1686.21^2.163*2i».isee.219:.163.e.2193.16S01阳脅SiSIi„iiXbts.a.jlCB.a.21EB.6216S.9.2158.02168.921S6-B-2ise.a.:“y朴HysqtMySQLMySQLMySQLMySQLMySQLHysqtHh^jur-sq.4U<ry旺OkRe-i^je-stQutryR«-^uestQutryResponEeOkResponseOKRfl^estQuittQuit5724102224S5«24292521553342925B69S8S42»6447133.1S30.2152,168fl.2152.16S.0.21«-168«.S5«C«.«665519!.168»-257®^1.021962ResponseError1242匪剧昭IQueryRespcrnseError1^6?Reqfu^stQueryR«fp^n$«SJ92S!阳曲LiltsFrjmu-SPfi心弭bytq£criMire, byLedLui*edi)BEthernetIISft:肿:閒弋 乩鈕:BB(6&-M:06:6&.W:00).Dst:0y:66J&0_60:e&:^(60!6&^0:66:6&&■InternetProtocol.5rc:192 .6.2(19215B.6.2hDst^192.168.^2门丸,1稲0d|>&transmissionContrcil^rotocgll-$rcPortEBB睦鮎轴恥趴Dsl^ort:piysql(11^61-Seq:913.Ack;16^4・Lem:165巒HySfltPrgfcq<plP-ackfctLeftjth:16iPacketNujfc&r:6vConmandCommand:QueryO>taitmcrlit:曳卑l髻PgdaLe_f□rmat(mJix{d-At-e-11ms), %:\il+6&0S%Y"I:f『E・twktL«e-r_cfttriejwhereujer_ld=bhTabhTa4B623.43d4c-fi-Gt22G7777GMV7b&静T02m需2€&7?22h8.u53J-d59T3d956—00a77'?U7572551HD68R-310525472dH--a-ft-1_K-£2.27777T■#«MTM7l-dl^y-・^m4TlfrcE4>££&EG2£752^I09cm匚05E-&55日卸勺.156£2237_b£262h69-BH-54JA-i2cd-75««*131c^9吕弓甲*■d・勺昔吕erH-£2m£&€弓工百■A-0?ll-d96731y-51^A-ieA-6_b?3767776200as-01-shA7e6Je7BA*wa7€-#7了2屈7kc1*«<£寻*-?!-6|@&・«号*"曲frj-0□9Z6GS?K-71S7EG0f3nfc1f45T5Bs53.^VB35726£~1^CW7G749-232TJ^A-2^d-ff5_Ji_&d01d^Q_6-27t6s566冏齿me剩8M5Bw

温馨提示

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

评论

0/150

提交评论