




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、文檔可自由編輯打印目目錄錄一、winpcap 介紹.21、winpcap 驅(qū)動各項功能 .22、Winpcap 程序?qū)嵗?5二、Wireshark(前稱 Ethereal).10三、Wireshark 捕獲數(shù)據(jù)幀和 IP 數(shù)據(jù)包 .10文檔可自由編輯打印網(wǎng)網(wǎng)絡(luò)絡(luò)協(xié)協(xié)議議分分析析一一、WINPCAP 介介紹紹winpcap(windows packet capture)是 windows 平臺下一個免費,公共的網(wǎng)絡(luò)訪問系統(tǒng)。開發(fā) winpcap 這個項目的目的在于為 win32 應(yīng)用程序提供訪問網(wǎng)絡(luò)底層的能力。下載網(wǎng)址:。1 1、W WI IN NP PC CA AP P 驅(qū)驅(qū)動動各各項項功功能
2、能1 捕獲原始數(shù)據(jù)包,包括在共享網(wǎng)絡(luò)上各主機發(fā)送 /接收的以及相互之間交換的數(shù)據(jù) winpcap 結(jié)構(gòu)包; 2 在數(shù)據(jù)包發(fā)往應(yīng)用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)包過濾掉; 3 在網(wǎng)絡(luò)上發(fā)送原始的數(shù)據(jù)包; 4 收集網(wǎng)絡(luò)通信過程中的統(tǒng)計信息。 winpcap 的主要功能在于獨立于主機協(xié)議(如 TCP-IP)而發(fā)送和接收原始數(shù)據(jù)包。也就是說,winpcap 不能阻塞,過濾或控制其他應(yīng)用程序數(shù)據(jù)包的發(fā)收,它僅僅只是監(jiān)聽共享網(wǎng)絡(luò)上傳送的數(shù)據(jù)包。因此,它不能用于 QoS 調(diào)度程序或個人防火墻。目前,winpcap 開發(fā)的主要對象是 windows NT/2000/XP,M$也已經(jīng)放棄了對 win
3、9x 的開發(fā)。因此本文相關(guān)的程序 T-ARP 也是面向 NT/2000/XP 用戶的。winpcap 提供給用戶兩個不同級別的編程接口:一個基于 libpcap 的 wpcap.dll,另一個是較底層的 packet.dll。對于一般的要與 unix 平臺上 libpcap 兼容的開發(fā)來說,使用wpcap.dll 是當(dāng)然的選擇。 2 2、WINPCAP 的內(nèi)部結(jié)構(gòu) Winpcap 的各個組成部分文檔可自由編輯打印Winpcap 是針對 Win32 平臺上的抓包和網(wǎng)絡(luò)分析的一個架構(gòu)。它包括一個核心態(tài)的包過濾器,一個底層的動態(tài)鏈接庫( packet.dll)和一個高層的不依賴于系統(tǒng)的庫(wpcap
4、.dll)。 為什么使用“architecture”而不是“l(fā)ibrary”呢?因為抓包是一個要求與網(wǎng)絡(luò)適配器(網(wǎng)卡)和操作系統(tǒng)交互的底層機制,而且與網(wǎng)絡(luò)的實施也有密切關(guān)系,所以僅用 “l(fā)ibrary”不能充分表達 Winpcap 的作用。 下圖表明了 Winpcap 的各個組成部分: 首先,抓包系統(tǒng)必須繞過操作系統(tǒng)的協(xié)議棧來訪問在網(wǎng)絡(luò)上傳輸?shù)脑紨?shù)據(jù)包( raw packet),這就要求一部分運行在操作系統(tǒng)核心內(nèi)部,直接與網(wǎng)絡(luò)接口驅(qū)動交互。這個部分是系統(tǒng)依賴(system dependent)的,在 Winpcap 的解決方案里它被認為是一個設(shè)備驅(qū)動,稱作 NPF(Netgroup Pack
5、et Filter)。Winpcap 開發(fā)小組針對Windows95,Windows98,WindowsME,Windows NT 4,Windows2000 和 WindowsXP 提供了不同版本的驅(qū)動。這些驅(qū)動不僅提供了基本的特性(例如抓包和 injection),還有更高級的特性(例如可編程的過濾器系統(tǒng)和監(jiān)視引擎)。前者可以被用來約束一個抓包會話只針對網(wǎng)絡(luò)通信中的一個子集(例如,僅僅捕獲特殊主機產(chǎn)生的 ftp 通信的數(shù)據(jù)包),后者提供了一個強大而簡單的統(tǒng)計網(wǎng)絡(luò)通信量的機制(例如,獲得網(wǎng)絡(luò)負載或兩個主機間的數(shù)據(jù)交換量)。 其次,抓包系統(tǒng)必須有用戶級的程序接口,通過這些接口,用戶程序可以利用
6、內(nèi)核驅(qū)動提供的高級特性。Winpcap 提供了兩個不同的庫:packet.dll 和 wpcap.dll。前者提供了一個底層 API,伴隨著一個獨立于 Microsoft 操作系統(tǒng)的編程接口,這些 API 可以直接用來訪問驅(qū)動的函數(shù);后者導(dǎo)出了一組更強大的與 libpcap 一致的高層抓包函數(shù)庫(capture primitives)。這些函數(shù)使得數(shù)據(jù)包的捕獲以一種與網(wǎng)絡(luò)硬件和操作系統(tǒng)無關(guān)的方式進行。 NPF 驅(qū)驅(qū)動動 網(wǎng)絡(luò)數(shù)據(jù)包過濾器(Netgroup Packet Filter,NPF)是 Winpcap 的核心部分,它是Winpcap 完成困難工作的組件。它處理網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)包,并且對
7、用戶級提供可捕獲(capture)、發(fā)送(injection)和分析性能(analysis capabilities)。 NPF 和和 NDIS NDIS(Network Driver Interface Specification)是一個定義網(wǎng)絡(luò)適配器(或者說成是管理網(wǎng)絡(luò)適配器的驅(qū)動程序)與協(xié)議驅(qū)動(例如 TCP/IP 的實現(xiàn))之間通信的規(guī)范。 NDIS 最主要的目的是作為一個允許協(xié)議驅(qū)動發(fā)送和接收網(wǎng)絡(luò)( LAN 或 WAN)上的數(shù)據(jù)包而不必關(guān)心特定的適配器或特定的 Win32 操作系統(tǒng)的封裝。 NDIS 支持三種類型的網(wǎng)絡(luò)驅(qū)動: (1) 網(wǎng)網(wǎng)絡(luò)絡(luò)接接口口卡卡或或 NIC 驅(qū)驅(qū)動動(Netw
8、ork interface card or NIC drivers)。NIC 驅(qū)動直接管理著網(wǎng)絡(luò)接口卡(NIC)。NIC 驅(qū)動接下邊與硬件連接,從上邊表現(xiàn)為一個接口,該接口允許高層發(fā)送數(shù)據(jù)包到網(wǎng)絡(luò)上,處理中斷,重置 NIC,停止 NIC,查詢和設(shè)置驅(qū)動的運行特征。NIC 驅(qū)動可以是小端口(miniport)或完全的 NIC 驅(qū)動(full NIC driver)。 Miniport 驅(qū)動僅僅實現(xiàn)了管理 NIC 的必要操作,包括在 NIC 上發(fā)送和接收數(shù)據(jù)。對于所有最底層的 NIC 驅(qū)動的操作由 NDIS 提供,例如同步(synchronization)。小端口(miniport)不直接調(diào)用操作
9、系統(tǒng)函數(shù),它們對于操作系統(tǒng)的接口是 NDIS。 小端口僅僅是向上傳遞數(shù)據(jù)包給 NDIS 并且 NDIS 確保這些數(shù)據(jù)包被傳遞給正確的協(xié)議。 完全 NIC 驅(qū)動(Full NIC driver)完成硬件細節(jié)的操作和所有由 NDIS 完成的同步和查詢操作。例如,完全 NIC 驅(qū)動維持接收到的數(shù)據(jù)的綁定信息。 (2) 中中間間層層驅(qū)驅(qū)動動(Intermediate drivers)中間層驅(qū)動位于高層驅(qū)動(例如協(xié)議驅(qū)動)和小端口之間。對于高層驅(qū)動,中間層驅(qū)動看起來像是小端口;對于小端口,中間層驅(qū)動看起來像協(xié)議驅(qū)動。一個中間層協(xié)議驅(qū)動可以位于另一個中間層驅(qū)動之上,盡管這種分層文檔可自由編輯打印可能對系統(tǒng)
10、性能帶來負面影響。開發(fā)中間層驅(qū)動的一個關(guān)鍵原因是在現(xiàn)存的遺留協(xié)議驅(qū)動(legacy protocol driver)和小端口之間形成媒體的轉(zhuǎn)化。例如,中間層驅(qū)動可以將 LAN協(xié)議轉(zhuǎn)換成 ATM 協(xié)議。中間層驅(qū)動不能與用戶模式的應(yīng)用程序通信,但可以與其他的NDIS 驅(qū)動通信。 (3) 傳傳輸輸驅(qū)驅(qū)動動或或協(xié)協(xié)議議驅(qū)驅(qū)動動(Transport drivers or protocol drivers)協(xié)議驅(qū)動實現(xiàn)了網(wǎng)絡(luò)協(xié)議棧,例如 IPX/SPX 或 TCP/IP,在一個或多個網(wǎng)絡(luò)接口卡上提供它的服務(wù)。在協(xié)議驅(qū)動的上面,它為應(yīng)用層客戶程序服務(wù);在它的下面,它與一個或多個 NIC 驅(qū)動或中間層NDIS
11、 驅(qū)動連接。 NPF 在 NDIS 棧中的位置NPF 是一個協(xié)議驅(qū)動。從性能方面來看,這不是最好的選擇,但是它合理地獨立于MAC 層并且有權(quán)使用原始通信( raw traffic)。 下圖表現(xiàn)了 NPF 在 NDIS 棧中的位置: 伴隨著 NPF 驅(qū)動細節(jié)的 Winpcap 的結(jié)構(gòu)NPF 結(jié)結(jié)構(gòu)構(gòu)基基礎(chǔ)礎(chǔ) 下圖表現(xiàn)了伴隨著 NPF 驅(qū)動細節(jié)的 Winpcap 的結(jié)構(gòu)。 抓抓包包 抓包是 NPF 最重要的操作。在抓包的時候,驅(qū)動使用一個網(wǎng)絡(luò)接口監(jiān)視著數(shù)據(jù)包,并將這些數(shù)據(jù)包完整無缺地投遞給用戶級應(yīng)用程序。 抓包過程依賴于兩個主要組件: 一個數(shù)據(jù)包過濾器,它決定著是否接收進來的數(shù)據(jù)包并把數(shù)據(jù)包 拷貝
12、給監(jiān)聽程序。數(shù)據(jù)包過濾器是一個有布爾輸出的函數(shù)。如果 函數(shù)值是 true,抓包驅(qū)動拷貝數(shù)據(jù)包給應(yīng)用程序;如果是 false,數(shù)據(jù)包將被丟棄。NPF 數(shù)據(jù)包過濾器更復(fù)雜一些,因為它不僅決定數(shù)據(jù)包是否應(yīng)該被保存,而且還得決定要保存的字節(jié)數(shù)。被 NPF 驅(qū)動采用的過濾系統(tǒng)來源于 BSD Packet Filter(BPF),一個虛擬處理器可以執(zhí)行偽匯編書寫的用戶級過濾程序。應(yīng)用程序采用用戶定義的過濾器并使用 wpcap.dll 將它們編譯進 BPF 程序。然后,應(yīng)用程序使用 BIOCSETF IOCTL 寫入核心態(tài)的過濾器。這樣,對于每一個到來的數(shù)據(jù)包該程序都將被執(zhí)行,而滿足條件的數(shù)據(jù)包將被接收。與
13、傳統(tǒng)解決方案不同, NPF 不解釋(interpret)過濾器,而是執(zhí)行(execute)它。由于性能的原因,在使用過濾器前, NPF 提供一個 JIT 編譯器將它轉(zhuǎn)化成本地的 80 x86 函數(shù)。當(dāng)一個數(shù)據(jù)包被捕獲, NPF 調(diào)用這個本地函數(shù)而不是調(diào)用過濾器解釋器,這使得處理過程相當(dāng)快。 文檔可自由編輯打印一個循環(huán)緩沖區(qū),用來保存數(shù)據(jù)包并且避免丟失。一個保存在 緩沖區(qū)中的數(shù)據(jù)包有一個頭,它包含了一些主要的信息,例如 時間戳和數(shù)據(jù)包的大小,但它不是協(xié)議頭。此外,以隊列插入的方式來保存數(shù)據(jù)包可以提高數(shù)據(jù)的存儲效率??梢砸越M的方式將數(shù)據(jù)包從NPF 緩沖區(qū)拷貝到應(yīng)用程序。這樣就提高了性能,因為它降低
14、了讀的次數(shù)。如果一個數(shù)據(jù)包到來的時候緩沖區(qū)已經(jīng)滿了,那么該數(shù)據(jù)包將被丟棄,因此就發(fā)生了 丟包。 2 2、W WI IN NP PC CA AP P 程程序序?qū)崒嵗@得網(wǎng)卡接口。在普通的 SOCKET 編程中,對雙網(wǎng)卡編程是不行的。當(dāng)主機為雙網(wǎng)卡時,本程序可分別獲得兩張網(wǎng)卡各自的描述結(jié)構(gòu)及地址,然后可以對它們分別進行操作。返回的 alldevs 隊列首部為邏輯網(wǎng)卡,一般不對它進行什么操作。 (一一)獲獲得得網(wǎng)網(wǎng)卡卡接接口口 i nclude pcap.h void main() pcap_if_t *alldevs; /*struct pcap_if_t pcap_if_t *next; ch
15、ar *name; char *description; pcap_addr *addresses; U_int falgs; */ pcap_if_t *d; int i=0; char errbufPCAP_ERRBUF_SIZE; /* Retrieve the device list */ if (pcap_findalldevs(&alldevs, errbuf) = -1)/返回網(wǎng)卡列表,alldevs 指向表頭 fprintf(stderr,Error in pcap_findalldevs: %sn, errbuf); exit(1); /* Print the lis
16、t */ for(d=alldevs;d;d=d-next) printf(%d. %s, +i, d-name); if (d-description) printf( (%s)n, d-description); else printf( (No description available)n); if(i=0) printf(nNo interfaces found! Make sure WinPcap is installed.n); return; /* We dont need any more the device list. Free it */ pcap_freealldev
17、s(alldevs); - 文檔可自由編輯打?。ǘ┳プグ?本程序俘獲局域網(wǎng)內(nèi) UDP 報文。 i nclude pcap.h /* 4 bytes IP address */ typedef struct ip_address u_char byte1; u_char byte2; u_char byte3; u_char byte4; ip_address; /* IPv4 header */ typedef struct ip_header u_char ver_ihl; / Version (4 bits) + Internet header length (4 bits) u_c
18、har tos; / Type of service u_short tlen; / Total length u_short identification; / Identification u_short flags_fo; / Flags (3 bits) + Fragment offset (13 bits) u_char ttl; / Time to live u_char proto; / Protocol u_short crc; / Header checksum ip_address saddr; / Source address ip_address daddr; / De
19、stination address u_int op_pad; / Option + Padding ip_header; /* UDP header*/ typedef struct udp_header u_short sport; / Source port u_short dport; / Destination port u_short len; / Datagram length u_short crc; / Checksum udp_header; /* prototype of the packet handler */ void packet_handler(u_char *
20、param, const struct pcap_pkthdr *header, const u_char *pkt_data); main() pcap_if_t *alldevs; pcap_if_t *d; int inum; int i=0; pcap_t *adhandle; char errbufPCAP_ERRBUF_SIZE; u_int netmask; char packet_filter = ip and udp; struct bpf_program fcode; /* Retrieve the device list */ if (pcap_findalldevs(&
21、amp;alldevs, errbuf) = -1) fprintf(stderr,Error in pcap_findalldevs: %sn, errbuf); 文檔可自由編輯打印exit(1); /* Print the list */ for(d=alldevs; d; d=d-next) printf(%d. %s, +i, d-name); if (d-description) printf( (%s)n, d-description); else printf( (No description available)n); if(i=0) printf(nNo interfaces
22、 found! Make sure WinPcap is installed.n); return -1; printf(Enter the interface number (1-%d):,i); scanf(%d, &inum); if(inum i) printf(nInterface number out of range.n); /* Free the device list */ pcap_freealldevs(alldevs); return -1; /* Jump to the selected adapter */ for(d=alldevs, i=0; inext
23、, i+); /* Open the adapter */ if ( (adhandle= pcap_open_live(d-name, / name of the device 65536, / portion of the packet to capture. / 65536 grants that the whole packet will be captured on all the MACs. 1, / promiscuous mode 1000, / read timeout errbuf / error buffer ) ) = NULL) fprintf(stderr,nUna
24、ble to open the adapter. %s is not supported by WinPcapn); /* Free the device list */ pcap_freealldevs(alldevs); return -1; /* Check the link layer. We support only Ethernet for simplicity. */ if(pcap_datalink(adhandle) != DLT_EN10MB) fprintf(stderr,nThis program works only on Ethernet networks.n);
25、/* Free the device list */ pcap_freealldevs(alldevs); return -1; 文檔可自由編輯打印if(d-addresses != NULL) /* Retrieve the mask of the first address of the interface */ netmask=(struct sockaddr_in *)(d-addresses-netmask)-sin_addr.S_un.S_addr; else /* If the interface is without addresses we suppose to be in
26、a C class network */ netmask=0 xffffff; /compile the filter if(pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) 0 ) fprintf(stderr,nUnable to compile the packet filter. Check the syntax.n); /* Free the device list */ pcap_freealldevs(alldevs); return -1; /set the filter if(pcap_setfilte
27、r(adhandle, &fcode)description); /* At this point, we dont need any more the device list. Free it */ pcap_freealldevs(alldevs); /* start the capture */ pcap_loop(adhandle, 0, packet_handler, NULL); return 0; /* Callback function invoked by libpcap for every incoming packet */ void packet_handler
28、(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) struct tm *ltime; char timestr16; ip_header *ih; udp_header *uh; u_int ip_len; /* convert the timestamp to readable format */ ltime=localtime(&header-ts.tv_sec); strftime( timestr, sizeof timestr, %H:%M:%S, ltime); /* prin
29、t timestamp and length of the packet */ /* retireve the position of the ip header */ ih = (ip_header *) (pkt_data + 14); /length of ethernet header /* retireve the position of the udp header */ ip_len = (ih-ver_ihl & 0 xf) * 4; uh = (udp_header *) (u_char*)ih + ip_len); /* convert from network b
30、yte order to host byte order */ printf(%s.%.6d len:%d , timestr, header-ts.tv_usec, header-len); /* print ip addresses */ 文檔可自由編輯打印printf(%d.%d.%d.%d - %d.%d.%d.%dn, ih-saddr.byte1, ih-saddr.byte2, ih-saddr.byte3, ih-saddr.byte4, ih-daddr.byte1, ih-daddr.byte2, ih-daddr.byte3, ih-daddr.byte4 ); - (三
31、三)發(fā)發(fā)包包 要在命令行下運行,給與參數(shù):網(wǎng)卡描述符。或者添加代碼 findalldevs(),那樣應(yīng)很方便。 i nclude i nclude i nclude void usage(); void main(int argc, char *argv) pcap_t *fp; char errorPCAP_ERRBUF_SIZE; u_char packet100; int i; /* Check the validity of the command line */ if (argc != 2) printf(usage: %s inerface, argv0); return; /*
32、Open the output adapter */ if(fp = pcap_open_live(argv1, 100, 1, 1000, error) ) = NULL) fprintf(stderr,nError opening adapter: %sn, error); return; /* Supposing to be on ethernet, set mac destination to 1:1:1:1:1:1 */ packet0=1; packet1=1; packet2=1; packet3=1; packet4=1; packet5=1; /* set mac sourc
33、e to 2:2:2:2:2:2 */ packet6=2; packet7=2; packet8=2; packet9=2; packet10=2; 文檔可自由編輯打印packet11=2; /* Fill the rest of the packet */ for(i=12;icmd-ping 文檔可自由編輯打?。?)用 IE 打開網(wǎng)頁: (3)登錄一個 FTP 服務(wù)器文檔可自由編輯打印5.至至此此,可可以以點點 Stop 按按鈕鈕停停止止 Wireshark 的的抓抓捕捕工工作作。得得到到如如下下圖圖所所示示的的結(jié)結(jié)束束,剛剛才才被被捕捕獲獲的的數(shù)數(shù)據(jù)據(jù)幀幀全全部部在在這這了了。文檔可自
34、由編輯打印6.以以下下來來分分析析數(shù)數(shù)據(jù)據(jù)幀幀和和數(shù)數(shù)據(jù)據(jù)包包捕 獲的數(shù)據(jù)含義如下:第一列是捕獲數(shù)據(jù)的編號;第二列是捕獲數(shù)據(jù)的相對時間,從開始捕獲算為 0.000 秒;第三列是源地址,第四列是目的地址;第五列是協(xié)議信息;第六列是數(shù)據(jù)包的信息。為了避免因操作失誤導(dǎo)致數(shù)據(jù)丟失,我們可以先將捕獲的數(shù)據(jù)保存起來(選擇 file-save 命令)。文檔可自由編輯打印7.以以太太網(wǎng)網(wǎng)的的幀幀格格式式:(1)ARP 協(xié)協(xié)議議封封裝裝在在以以太太網(wǎng)網(wǎng)中中的的格格式式:分分析析 ARP 封封裝裝在在以以太太網(wǎng)網(wǎng)數(shù)數(shù)據(jù)據(jù)幀幀中中在下圖中 Filter 后面的編輯框中輸入:arp(注意是小寫),然后回車或者點擊“Apply”按鈕, 現(xiàn)在只有 ARP 協(xié)議了。其他的協(xié)議數(shù)據(jù)包都被過濾掉了。如下圖:文檔可自由編輯打印選中一個數(shù)據(jù)幀,然后從整體上整體上 WiresharkWireshark 的窗口,主要被分成三部分:上面部分是所的窗口,主要被分成三部分:上面部分是所有數(shù)據(jù)幀的列表;中間部分是數(shù)據(jù)幀的描述信息有數(shù)據(jù)幀的列表;中間部分是數(shù)據(jù)幀的描述信息;下面部分是幀里面的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 油氣田腐蝕與防護技術(shù)考核試卷
- 組織學(xué)習(xí)與知識管理體系構(gòu)建戰(zhàn)略考核試卷
- 營養(yǎng)教育在兒童飲食中的應(yīng)用考核試卷
- 紙質(zhì)非金屬材料加工技術(shù)考核試卷
- 耐火土石礦山環(huán)境保護與礦山環(huán)境保護應(yīng)急預(yù)案制定考核試卷
- 潛水裝備的水下作業(yè)安全教育與培訓(xùn)體系考核試卷
- 工業(yè)機器人維修工具考核試卷
- 影視基地租賃及影視拍攝場地租賃及宣傳物料制作合同
- 住宅裝修施工質(zhì)量監(jiān)管補充協(xié)議
- 醫(yī)療器械臨床試驗項目臨床試驗機構(gòu)選擇合同
- (二模)保定市2025年高三第二次模擬考試地理試卷(含答案解析)
- 創(chuàng)新工程實踐智慧樹知到期末考試答案章節(jié)答案2024年北京大學(xué)等跨校共建
- MOOC 跨文化交際入門-華中師范大學(xué) 中國大學(xué)慕課答案
- 小小科學(xué)家《生物》模擬試卷A(附答案)
- 教師專業(yè)發(fā)展第3章-教師專業(yè)發(fā)展趨向課件
- 員工手冊070509
- 切爾諾貝利核事故永遠不能忘卻的事故(課堂PPT)
- 安裝調(diào)試培訓(xùn)及驗收方案
- 勞動合同法培訓(xùn)ppt課件
- 公制螺紋公差速查表
- 交通運輸水運工程造價定額中心
評論
0/150
提交評論