大作业2:IP包的截获和解析_第1页
大作业2:IP包的截获和解析_第2页
大作业2:IP包的截获和解析_第3页
大作业2:IP包的截获和解析_第4页
大作业2:IP包的截获和解析_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、IP包的截获和解析实验报告Q1201012 刘倩君一实验目的:设计一个能够截获并解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而IP层的工作原理有更好的理解和认识。二实验要求 : 本实验的目标是捕获网络中数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件. 程序的具体要求如下:1、能够捕获以太网数据帧,并且能够解析:数据包类型,数据包长度,源、目的MAC,2、如果是IP数据包,则进行进一步解析。输出版本,头长度,服务类型,数据包总长度,数据包标识,分段标志,分段偏移值,生存时间,上层协议类型,头校验和,源IP地址和目的IP地址等内容.3、在

2、指定的日志文件中写入网卡、时间、数据包解析结果等内容。当程序接收到键盘输入Ctrl+C时退出.三.主要数据结构各种包头部、IP地址等的结构体定义在Header.h中。1、以太网帧格式因此,以太网帧头部的数据结构定义为:typedef struct tagDLCHeader /*以太网数据帧头部结构*/ u_char DesMAC6; /* destination HW addrress */ u_char SrcMAC6; /* source HW addresss */ u_char Ethertype; /* ethernet type */ DLCHEADER;2、IP数据报格式0 4

3、8 16 19 24 31版本报头标长服务类型总长度标识标志片偏移生存时间协议头校验和源IP地址目的IP地址选项填充域数据部分IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本。本程序主要针对版本是IPV4的数据包的解析。报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的。因此,IP数据包的头长度在2040B之间,是可变的。服务类型字段共8位,用于指示路由器如何处理该数据包。总长度字段为2B,它定义了以字节为单位的数据包的总长度,IP数据包的最大长度为65535B。标识字段的长度为16位,用于识别IP数据包

4、的编号,每批数据都要有一个标识值,用于让目的主机判断新来的数据属于哪个分组。标志字段共3位,最高位是0.禁止分片标志DF(do not fragment)字段的值若为1,表示不能对数据包分片;若DF值为0,则表明可以分片。分片标志MF(more fragment)的值为1,表示接收到的不是最后一个分片;若MF值为0,表示接收到的是最后一个分片。片偏移字段共13位,说明分片在整个数据包中的相对位置,片偏移值是以8B为单位来记数的,因此选择的分片长度应该是8B的整数倍。生存时间(TTL)字段为8位,用来设置数据包在互联网络的传输过程的寿命,通常是用一个数据包可以经过的最多的路由器跳步数来限定的。协

5、议字段为8位,表示使用此IP数据包的高层协议类型,常用的协议号如下表所示.序号协议名称序号协议名称12468ICMPIGMPIP inIPTCPEGP17414689UDPIPV6RSVPOSPFA头校验和字段为16位,用于存放检查报头错误的校验码,检验的范围是整个IP包的报头。校验和为0,说明数据报报头没有出错。 地址字段包括源地址和目的地址。源地址和目的地址的长度都是32位,分别表示发送数据包的源主机和目的主机的IP地址。 选项字段的长度范围为040B,主要用于控制和测试。在使用选项字段的过程中,有可能出现报头部分的长度不是32位的整数倍的情况。如果出现这种情况,就需要通过填充位来凑齐。因

6、此,IP数据报的头部定义如下:typedef struct ip_headeru_char ver_ihl; / 4 bit 的版本信息 + 4 bits 的头长u_char tos; / TOS 类型u_short tlen; / 总长度u_short identification; / Identificationu_short flags_fo; / Flags (3 bits) + Fragment offset (13 bits)u_char ttl; / 生存期u_char proto; / 后面的协议信息u_short crc; / 校验和ip_address saddr; /

7、源 IPip_address daddr; / 目的 IPip_address selection; / 选项ip_header;3、各类报头TCP/UDP/ICMP/IP结构当我们使用Raw Socket的时候,可以完全自定义IP包,一切形式的包都可以"制造"出来。因此,本文事先必须对TCP/IP所涉及IP包结构进行必要的交待。目前,IPv4的报头结构为常用的ICMP报文包括ECHO-REQUEST(响应请求消息)、ECHO-REPLY(响应应答消息)、Destination Unreachable(目标不可到达消息)、Time Exceeded(超时消息)、Parame

8、ter Problems(参数错误消息)、Source Quenchs(源抑制消息)、Redirects(重定向消息)、Timestamps(时间戳消息)、Timestamp Replies(时间戳响应消息)、Address Masks(地址掩码请求消息)、Address Mask Replies(地址掩码响应消息)等,是Internet上十分重要的消息。后面章节中所涉及到的ping命令、ICMP拒绝服务攻击、路由欺骗都与 ICMP协议息息相关。TCP报头结构为:对应数据结构:typedef struct psd_hdr /定义TCP伪报头 unsigned long saddr; /源地址

9、unsigned long daddr; /目的地址 char mbz; char ptcl; /协议类型 unsigned short tcpl; /TCP长度 PSD_HEADER; typedef struct _tcphdr /定义TCP报头 unsigned short th_sport; /16位源端口 unsigned short th_dport; /16位目的端口 unsigned int th_seq; /32位序列号 unsigned int th_ack; /32位确认号 unsigned char th_lenres; /4位首部长度/4位保留字 unsigned c

10、har th_flag; /6位标志位 unsigned short th_win; /16位窗口大小 unsigned short th_sum; /16位校验和 unsigned short th_urp; /16位紧急数据偏移量 TCP_HEADER; UDP报头为:对应的数据结构为:typedef struct _udphdr /定义UDP报头 unsigned short uh_sport;/16位源端口unsigned short uh_dport;/16位目的端口unsigned short uh_len;/16位长度unsigned short uh_sum;/16位校验和 U

11、DP_HEADER;ICMP协议是网络层中一个非常重要的协议,其全称为Internet Control Message Protocol(因特网控制报文协议),ICMP协议弥补了IP的缺限,它使用IP协议进行信息传递,向数据包中的源端节点提供发生在网络层的错误信息 反馈。ICMP报头为: 常用的回送与或回送响应ICMP消息对应数据结构为:typedef struct _icmphdr /定义ICMP报头(回送与或回送响应) unsigned char i_type;/8位类型unsigned char i_code; /8位代码 unsigned short i_cksum; /16位校验和

12、unsigned short i_id; /识别号(一般用进程号作为识别号) unsigned short i_seq; /报文序列号 unsigned int timestamp;/时间戳 ICMP_HEADER; 四程序设计分析为了获取网络中的IP数据包,必须对网卡进行编程,在这里我们觊觎winpcap提供的库函数进行编程。但是,在通常情况下,网络通信只能响应与自己硬件地址相匹配的数据包或是以广播形式出发的数据包。对于其他形式的数据包,如已到达网络接口但却不是发送到此地址的数据包,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取流

13、经网络设备的所有数据包,就需要将网卡设置为混杂模式。1、获取所有存在的网络设备的链表。Pcap_if_t *alldevs; /网络设备结构链表Char errbufPCAP_ERRBUF_SIZE; /错误信息/*所有网络设备的信息以链表形式存在alldevs中*/pcap_findalldevs(&alldevs,errbuf);2、从链表中选择物理Ethernet卡后,用混杂模式打开。if(adhandle= pcap_open_live(d->name, / 设备名称65536, / portion of the packet to capture.1, / 采用混杂模式

14、1000, / 读超时为 1 秒errbuf / error buffer) ) = NULL)fprintf(stderr,"nUnable to open the adapter. %s is not supported by WinPcapn");pcap_freealldevs(alldevs);return -1;在这个函数中,第一个参数为要打开的设备名称,这里是Ethernet卡,可以从设备链表alldevs中选出。第二个参数应为捕获的数据包长度,填入65535以保证在链路层的整个数据包都被捕获。第三个参数为打开模式,填入1表明用混杂模式打开网卡。最后两个参数本

15、别为读入超时的时间和保存错误信息。最后返回一个网卡描述符adhandle.3、捕获数据包。res = pcap_next_ex( adhandle, &header, &pkt_data) adhandle是由pcap_open_live()返回的所打开网卡的指,header是pcap_pkthdr型的结构体,存储时间,包的长度, pkt_data存储数据包的内容,为一个char型数组。返回值res 等于1时成功;等于0时超时;等于-1时说明发生错误。对于捕获的数据包,去掉数据链路层的14B的头部后才是真正的IP包信息。5.参考程序流程图 五结果分析1、选择网卡2.捕获的IP数

16、据包*数据包5抓包信息: 时间:10:03:32 编号:751530 数据包长度:67 捕获的数据包长度:67DLC 帧分析: MAC地址:00000052506a->000000525064 以太网协议类型: 0x0800(IP包)IP 报头分析: IP 4 20 0 53 23213 不分 0 1 UDP 2b65 192.168.146.1->224.0.0.252UDP 报头分析: 端口:eb->b821 报文长:46409 校验和:96根据IP 报头结构:IP协议的版本号|包头长度|服务类型|总长|ID|Flag|片偏移|生存时间|协议类型|包头校验和|源IP|目的

17、IP|可以知道这个IP数据报是从192.168.146.1(本机)发给224.0.0.252(默认网关)的,包头长度为20字节,总长度为53字节,不分片,片偏移为0,生存时间为1,协议类型为UDP,包头校验和为2b65。还可以进一步对封装的UDP数据报进行分析。3.捕获的其他数据包*数据包2抓包信息: 时间:10:03:32 编号:750418 数据包长度:87 捕获的数据包长度:87DLC 帧分析: MAC地址:000000524f3a->000000524f34 以太网上协议类型:34304 未知包丢弃*根据协议类型为34304,可知这是一个未知,丢弃。六主程序源代码#include

18、 <stdio.h>#include<stdlib.h>#include <iostream>#include "fstream"#include <time.h>#include <iomanip>/流操作符,主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等#include "conio.h"/运用getch()函数#include "Header.h"#include <winsock2.h&g

19、t;#pragma comment(lib,"ws2_32.lib")/链接至库#include "pcap.h"#pragma comment(lib,"wpcap.lib")/链接至库using namespace std;int SwitchAgreement(u_char proto,const u_char *pkt_data);/对IP数据包数据部分进行解析DWORD WINAPI Fun1Proc( LPVOID lpParameter);int k1=1;/抓包个数int k2=1;/一次显示的数据包个数int k3;

20、/日志变量time_t t;/时间变量,长整型char* s;string p;char buffer100;int main()pcap_if_t *alldevs; / 网卡描述符列表,包含各网卡信息、型号、名字、地址等的结构体pcap_if_t *d;pcap_t *adhandle;char errbufPCAP_ERRBUF_SIZE;/错误信息struct pcap_pkthdr *header;ip_header *ih;const u_char *pkt_data;int inum;int i=0;int num=0;int res;struct tm *ltime;char

21、timestr16;char *logname=new char20; cout<<"请输入日志名称(.log):n" cin>>logname; if(logname=NULL) logname="默认日志.log"ofstream ofs(logname,ios:app);/以追加方式打开日志文件time(&t);/获取系统时间p = ""p += ctime(&t);/把系统时间转换为字符串p += "用户运行程序n"s=&p0;ofs.write(s,strl

22、en(s);/系统时间写入日志文件ofs.flush();/ 获得网卡的列表if (pcap_findalldevs(&alldevs, errbuf) = -1)fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf);exit(1);ofs.write("获得网卡的列表n",strlen("获得网卡的列表n");ofs.write("打印网卡信息n",strlen("打印网卡信息n");ofs.flush();/ 打印网卡信息c

23、out<<"本机虚拟网卡列表:n"p =""for(d=alldevs; d; d=d->next)/网卡列表写入日志文件i+;_itoa( i, buffer,10);/将i转换为10进制的字符串p += buffer;p += "."p += d->name;p += "n"if (d->description)p += "t("p += d->description;p += ")n"elsep += "(No descri

24、ption available)n"s=&p0;ofs.write(s,strlen(s);ofs.flush(); cout<<p;p=""if(i=0)/找不到设备cout<<endl<<"No interfaces found! Make sure WinPcap is installed."<<endl;return -1;HANDLE hThread1;/线程句柄if(hThread1)TerminateThread(hThread1,NULL);cout<<&quo

25、t;输入要监听的网卡号(1-"<<i<<"):"cin>>inum;hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);/这个线程用来控制退出CloseHandle(hThread1);p += "选择网卡号为:"_itoa( inum, buffer,10);p += buffer;p += "n"s=&p0;ofs.write(s,strlen(s);ofs.flush();p=""if(inum <

26、; 1 | inum > i) /判断号的合法性cout<<endl<<"Interface number out of range."<<endl;p += "输入网卡号无效n"s=&p0;ofs.write(s,strlen(s);ofs.flush();p=""pcap_freealldevs(alldevs);return -1;elsep += "检测网卡号有效n"s=&p0;ofs.write(s,strlen(s);ofs.flush();p=

27、""/ 找到要选择的网卡结构for(d=alldevs, i=0; i< inum-1 ;d=d->next, i+);p += "找到了要打开的网卡地址n"s = &p0;ofs.write(s,strlen(s);ofs.flush();p=""/ 打开选择的网卡if(adhandle= pcap_open_live(d->name, / 设备名称65536, / portion of the packet to capture.1, / 采用混杂模式1000, / 读超时为 1 秒errbuf / er

28、ror buffer) ) = NULL)fprintf(stderr,"nUnable to open the adapter. %s is not supported by WinPcapn");/Free the device listpcap_freealldevs(alldevs);return -1;if(pcap_datalink(adhandle) != DLT_EN10MB)/只考虑以太网数据fprintf(stderr,"nThis program works only on Ethernet networks.n");pcap_fr

29、eealldevs(alldevs);return -1;p += "该网卡设置为了混乱模式n开始捕获数据包n"s = &p0;ofs.write(s,strlen(s);ofs.flush();p=""cout<<endl<<"listening on "<<d->name<<"."<<endl;cout<<"开始捕获IP包,输入Ctrl+C退出程序,输入Ctrl+Z重新选择网卡."<<endl;

30、cout<<endl;pcap_freealldevs(alldevs);p += "IP 报头结构:n"p += "*n"p += "|时间|IP协议的版本号|包头长度|服务类型|总长|ID|Flag|片偏移|生存时间|协议类型|包头校验和|源IP|目的IP|n"p += "*nn"s = &p0;ofs.write(s,strlen(s);ofs.flush();p=""DLCHEADER *ik;/物理帧头while(res = pcap_next_ex( adhand

31、le, &header, &pkt_data) >= 0 &&k1)/开始捕获数据包,eader是pcap_pkthdr结构,pkt_header是接收数据的缓冲区ltime=localtime(&header->ts.tv_sec);strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);if(res = 0)continue;/* Timeout elapsed */num+;p += "*n数据包"_itoa(num,buffer,10);p +

32、= buffer;p +="n"p += "抓包信息:n"p += " 时间:"p += timestr;p += " 编号:"_itoa(header->ts.tv_usec,buffer,10);p += buffer;p += " 数据包长度:"_itoa(header->len,buffer,10);p += buffer;p += " 捕获的数据包长度:"_itoa(header->caplen,buffer,10);p += buffer;p +

33、= "n"s = &p0;cout<<s;ofs.write(s,strlen(s);ofs.flush();p=""ik = (DLCHEADER *)(pkt_data);/获得数据包的物理帧头u_short ik2=ntohs(ik->Ethertype);sprintf(buffer,"%.12x->%.12x",ik->SrcMAC,ik->DesMAC);p += "DLC 帧分析:n"p += " MAC地址:"p += buffer;i

34、f(ik2!=0x0800)/判断是否为IP数据包 p += " 以太网上协议类型:"if(ik2=0x8864) p += " 0x8864【以太网上的 PPP(PPP 会话阶段)(PPPoE,PPP Over Ethernet<PPP Session Stage>)】"else if(ik2=0x0806) p += " 0x8006【地址解析协议(ARP : Address Resolution Protocol)】"else if(ik2=0x9001) p += " 0x9001【ethernetII广

35、播包-3Com(Bridge) XNS Sys MgmtXEROX】"else if(ik2=0x814C) p += " 0x814C【简单网络管理协议(SNMP:Simple Network Management Protocol)】" else sprintf(buffer, "%d ", ik2); p += buffer; p += " 未知包丢弃n"s=&p0;ofs.write(s,strlen(s);ofs.flush();cout<<s;p=""continue;el

36、sep += " 以太网协议类型: 0x0800(IP包)n"s=&p0;ofs.write(s,strlen(s);ofs.flush();cout<<s;p=""ih = (ip_header *) (pkt_data + 14); /14 为以太头的长度ih->tlen = ntohs(ih->tlen);/网络字节序改为主机字节顺序ih->identification = ntohs(ih->identification);ih->crc = ntohs(ih->crc);p +="

37、;IP 报头分析:n"p += " IP"_itoa(ih->ver_ihl & 0xf0)/16,buffer,10);p += buffer;p += " "_itoa(ih->ver_ihl & 0xf)*4,buffer,10);p += buffer;p +=" "_itoa(ih->tos,buffer,16);p += buffer;p +=" "_itoa(ih->tlen,buffer,10);p += buffer;p += " &qu

38、ot;_itoa(ih->identification,buffer,10);p += buffer;p +=" "if(ih->flags_fo & 0xE000)=0x6000) p += "分片(NoLast) "/DF/MFelse if(ih->flags_fo & 0xE000)=0x4000) p += "分片(Last) "else p += "不分 "p +=" "_itoa(ih->flags_fo & 0x1FFF,buffe

39、r,10);p += buffer;p +=" "_itoa(ih->ttl,buffer,10);p += buffer;p +=" "if(ih->proto=17) p += "UDP "/协议类型else if(ih->proto=6)p += "TCP "else if(ih->proto=1)p += "ICMP "else if(ih->proto=2)p += "IGMP "else p += "未知 "_it

40、oa(ih->crc,buffer,16);p += buffer;p +=" "_itoa(ih->saddr.byte1,buffer,10);p += buffer;p +="."_itoa(ih->saddr.byte2,buffer,10);p += buffer;p +="."_itoa(ih->saddr.byte3,buffer,10);p += buffer;p +="."_itoa(ih->saddr.byte4,buffer,10);p += buffer;p +

41、="->"_itoa(ih->daddr.byte1,buffer,10);p += buffer;p +="."_itoa(ih->daddr.byte2,buffer,10);p += buffer;p +="."_itoa(ih->daddr.byte3,buffer,10);p += buffer;p +="."_itoa(ih->daddr.byte4,buffer,10);p += buffer;p +="n"s=&p0;ofs.write(s,

42、strlen(s);ofs.flush();cout<<s;p=""SwitchAgreement(ih->proto,pkt_data);/IP数据部分解析cout<<s;ofs.write(s,strlen(s);ofs.flush();p=""p += "*n" if(k1=0) p += "用户输入Ctrl+C,退出程序n"else p += "异常n"s=&p0;ofs.write(s,strlen(s);ofs.flush();p="&

43、quot;if(res = -1)cout<<"Error reading the packets: "<<pcap_geterr(adhandle)<<endl;return -1;return 0;DWORD WINAPI Fun1Proc(LPVOID lpParameter)k3=getch();if(k3=3) k1=0;k3=0;return 0;int SwitchAgreement(u_char proto,const u_char *pkt_data)/对IP数据部分的内容进行解析TCP_HEADER *th;UDP_H

44、EADER *uh;ICMP_HEADER *ich;IGMP_HEADER *igh;switch(proto)case 1:ich= (ICMP_HEADER *)(pkt_data+sizeof(ip_header)+sizeof(DLCHEADER);p += "ICMP 报头分析:n "sprintf(buffer,"类型:%x 代码:%x 校验和:%x 识别和:%x 报文序列号:%xn",ich->i_type,ich->i_code,ich->i_cksum,ich->i_id,ich->i_seq);p +=

45、 buffer;s=&p0;break;case 6:th= (TCP_HEADER *)(pkt_data+sizeof(ip_header)+sizeof(DLCHEADER);p += "TCP 报头分析:n "sprintf(buffer,"端口:%x->%x 序列号:%x 确认号:%x TCP偏移量:%dn Flags:%x 窗口大小:%d 校验和:%x 紧急指针:%dn",th->th_sport,th->th_dport,th->th_seq,th->th_ack,(th->th_lenres &

46、amp; 0xE0)/16,th->th_flag & 0x3F,th->th_win,th->th_sum,th->th_urp);p += buffer;s=&p0;break;case 17:uh= (UDP_HEADER *)(pkt_data+sizeof(ip_header)+sizeof(DLCHEADER);p += "UDP 报头分析:n "sprintf(buffer,"端口:%x->%x 报文长:%d 校验和:%dn",uh->uh_sport,uh->uh_dport,uh

47、->uh_len,uh->uh_sum);p += buffer;s=&p0;break;case 2:igh= (IGMP_HEADER *)(pkt_data+sizeof(ip_header); /igmp v2版p += "IGMP v2 报头分析:n "p += " 类型字段:"if(igh->igh_edition=0x11) p += "Membership query "else if(igh->igh_edition=0x12) p += "IGMP v1 Membershi

48、p report "else if(igh->igh_edition=0x16) p += "IGMP v2 Membership report(join) "else if(igh->igh_edition=0x17) p += "IGMP v2 leave. "else p += "Error "sprintf(buffer,"最大响应时间:%d 校验和:%d 组地址字段:%d.%d.%d.%dn",igh->igh_unused,igh->igh_cksum,igh->

49、d_saddr.byte1,igh->d_saddr.byte2,igh->d_saddr.byte3, igh->d_saddr.byte4);/D类IP地址,从224.0.0.0-239.255.255.255p += buffer;s=&p0;break;default :cout<<proto<<endl;break;if(ich|th|uh) return 1;else return 0;七总结及相关扩展 本程序设计也可以利用套接字(socket)完成,初始化原始套接字,反复监听捕获数据包和解析数据包。下面就结合核心代码对程序的具体实

50、现进行讲解,同时使程序流程更加清晰,去掉了错误检查等保护性代码。部分核心代码的简略提示如下。1. 使用原始套接字套接字分为三种,即流套接字(Stream Socket)、数据报套接字(Datagram Socket)和原始套接字(Raw Socket)。要进行IP数据包的接受与发送,应使用原始套接字。创建原始套接字的代码如下:SOCKET sock;Sock=WSASoccet(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERRLAPPED);在WSASoccet函数中,第一个参数指定通信发生的区字段,AF_INET是针对Internet的,允许

51、在远程主机之间通信。第二个参数是套接字的类型,AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。在这里,我们设置为SOCK_RAW,表示我们声明的是一个原始套接字类型。第三个参数依赖于第二个参数,用于指定套接字所用的特定协议,这里使用IP协议。第四个参数为WSAPROTOCOL_INFO位,该位可以置空,永远置0。第六个参数是标志位,WSA_FLAG_OVERRLAPPED表明可以使用发送接收超时设置,本课程设计也可以把这个标志位设置为NULL,因为本设计不用考虑超时情况。创建原始套接字后,IP头就会包含在接收的数据中。然后,我们可以设置IP头操作选项,调用sotscockpot函数。其中flag设置为TRUE,并设定IP_HDRINCL选项,表

温馨提示

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

评论

0/150

提交评论