PAM應(yīng)用開發(fā)和內(nèi)部實現(xiàn)源碼分析

上傳人:e****s 文檔編號:61217085 上傳時間:2022-03-10 格式:DOCX 頁數(shù):12 大?。?79.23KB
收藏 版權(quán)申訴 舉報 下載
PAM應(yīng)用開發(fā)和內(nèi)部實現(xiàn)源碼分析_第1頁
第1頁 / 共12頁
PAM應(yīng)用開發(fā)和內(nèi)部實現(xiàn)源碼分析_第2頁
第2頁 / 共12頁
PAM應(yīng)用開發(fā)和內(nèi)部實現(xiàn)源碼分析_第3頁
第3頁 / 共12頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《PAM應(yīng)用開發(fā)和內(nèi)部實現(xiàn)源碼分析》由會員分享,可在線閱讀,更多相關(guān)《PAM應(yīng)用開發(fā)和內(nèi)部實現(xiàn)源碼分析(12頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、個人收集整理 僅供參考學習 PAM 地應(yīng)用開發(fā)和內(nèi)部實現(xiàn)源碼分析 本文主要通過對 Linux PAM 源代碼進行分析 , 闡述了 PAM地內(nèi)部實現(xiàn)機制和怎樣在應(yīng)用程序中應(yīng)用 PAM進行認證 , 以及怎樣開發(fā) PAM服務(wù)模塊 . 1 引言 身份認證是操作系統(tǒng)安全地重要機制之一 , 系統(tǒng)通過認證機制核查用戶地身份證明 , 并作為用戶進入系統(tǒng)地判定條件 , 是防止惡意用戶進入系統(tǒng)地第一道門檻 . 近年來認證理論和技術(shù)得到了迅速發(fā)展 , 產(chǎn)生了各種認證機制 , 如口令機 制 ,RSA, DCE, kerberos 認證體制 ,S

2、/Key 和基于智能卡地身份認證等 . 然而 , 當系 統(tǒng)中引入新地認證機制時 , 一些系統(tǒng)入口登錄服務(wù)如 login, rlogin 和 telnet 等應(yīng)用程序就必須改寫以適應(yīng)新地認證機制 . 為了解決這個問題 ,1995 年 Sun公司地 Vipin Samar 和 Charlie Lai 提出了 PAM(Pluggable Authentication Modules), 并將其應(yīng)用在 Solaris 系統(tǒng)上 .PAM框架將應(yīng)用程序與具體地認證機制分離 , 使得系統(tǒng)改變認證機制時 , 不再需要修改采用認證機制地應(yīng)用程序 , 而只要由管理員配置應(yīng)用程序地認證服務(wù)模塊 , 極大地提

3、高了認證機制地通用性與靈活 性 . 各種版本操作系統(tǒng) pam實現(xiàn)原理一樣 , 下面從 PAM地應(yīng)用開發(fā)開始介 紹 . b5E2RGbCAP 2 PAM地應(yīng)用開發(fā) 2.1 PAM 框架概覽 PAM即可插拔認證模塊 . 它提供了對所有服務(wù)進行認證地中央機制 , 適用于 login, 遠程登錄( telnet,rlogin,fsh,ftp, 點對點協(xié)議( PPP)) ,su 等應(yīng)用程 序中 . 系統(tǒng)管理員通過 PAM配置文件來制定不同應(yīng)用程序地不同認證策略;應(yīng)用程序開發(fā)者通過在服務(wù)程序中使用 PAM API(pam_xxxx( )) 來實現(xiàn)對認

4、證方法地調(diào)用;而 PAM服務(wù)模塊地開發(fā)者則利用 PAMSPI 來編寫模塊(主要是引出一些函 數(shù) pam_sm_xxxx( ) 供 PAM接口庫調(diào)用) , 將不同地認證機制加入到系統(tǒng)中; PAM 接口庫( libpam )則讀取配置文件 , 將應(yīng)用程序和相應(yīng)地 PAM服務(wù)模塊聯(lián)系起 來 .PAM框架結(jié)構(gòu)如圖所示 . p1EanqFDPw 1/12 個人收集整理 僅供參考學習 圖 PAM框架結(jié)構(gòu)圖

5、 其中 ,pamh 是一個 pam_handle 類型地結(jié)構(gòu) , 它是一個非常重要地處理句柄 , 是 PAM與應(yīng)用程序通信地唯一數(shù)據(jù)結(jié)構(gòu) , 也是調(diào)用 PAM接口庫 API 地唯一句柄 .pam_handle 數(shù)據(jù)結(jié)構(gòu)將在下面地源代碼分析一節(jié)地介紹 . DXDiTa9E3d 另外 , 如上圖所示地服務(wù)模塊分 auth (認證管理)、 account (賬號管理)、 session (會話管理)、 passwd(口令管理)四種類型 , 各個類型模塊地作用以及配置文件地四個組成部分模塊類

6、型、 控制標志、模塊路徑、 模塊參數(shù)等在很多講PAM地配置管理地文章里都有介紹 , 這里就不再贅述了 . RTCrpUDGiT 2.2 在應(yīng)用程序中使用 PAM認證 每個使用 PAM認證地應(yīng)用程序都以 pam_start 開始 ,pam_end結(jié)束 .PAM還提供 了 pam_get_item 和 pam_set_item 共享有關(guān)認證會話地某些公共信息 , 例如用戶名 , 服務(wù)名 , 密碼和會話函數(shù) . 應(yīng)用程序在調(diào)用了 pam_start () 后也能夠用這些 APIs 來改變狀態(tài)信息 . 實際做認證工作地 API 函數(shù)有六個 (以下將這六個函數(shù)簡 稱為認證

7、 API): 5PCzVD7HxA 認證管理 -- 包括 pam_authenticate () 函數(shù)認證用戶 ,pam_setcred () 設(shè) 置 , 刷新 , 或銷毀用戶證書 . jLBHrnAILg 賬號管理 -- 包括 pam_acc_mgmt() 檢查認證地用戶是否可以訪問他們地賬戶 , 該函數(shù)可以實現(xiàn)口令有效期 , 訪問時間限制等 . xHAQX74J0X 會話管理 -- 包括 pam_open_session () 和 pam_close_session () 函數(shù)用來管理會話和記賬 . 例如 , 系統(tǒng)可以存儲會話地全部時間 . LDAYtRyKfE

8、 口令管理 -- 包括 pam_chauthok () 函數(shù)用來改變密碼 . 下面看一個簡單地 login 模擬程序: /* 使用 PAM所必需地兩個頭文件 */ #include #include void main(int argc, char *argv[], char **renvp) { 2/12 個人收集整理 僅供參考學習 /* 初始化 , 并提供一個回調(diào)函數(shù) */ if ((pam_star

9、t("login", user_name, &pam_conv, &pamh)) != PAM_SUCCESS) exit(1); /* 設(shè)置一些關(guān)于認證用戶信息地參數(shù) */ pam_set_item(pamh, PAM_TTY, ttyn); pam_set_item(pamh, PAM_RHOST, remote_host); while (!authenticated && retry < MAX_RETRIES) { status = pam_authenticate(pamh, 0);/* 認證 , 檢查用戶輸入地密碼 是否正確

10、*/ } /* 認證失敗則應(yīng)用程序退出 */ if (status != PAM_SUCCESS) { exit(1); } /* 通過了密碼認證之后再調(diào)用帳號管理 API, 檢查用戶帳號是否已經(jīng)過期 */ if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS) { if (status == PAM_AUTHTOK_EXPIRED) { status = pam_chauthtok(pamh, 0); /* 過期則要求用戶更改密 碼 */ if

11、 (status != PAM_SUCCESS) exit(1); } } /* 通過帳戶管理檢查之后則打開會話 */ if (status = pam_open_session(pamh, 0) != PAM_SUCCESS) exit(status); /* 建立認證服務(wù)地用戶證書 */ status = pam_setcred(pamh, PAM_ESTABLISH_CRED); if (status != PAM_SUCCESS) exit(status); pam_end(pamh, PAM_SUCCESS); /*

12、 PAM事務(wù)地結(jié)束 */ } 3/12 個人收集整理 僅供參考學習 從上面程序中 , 我們可以了解到使用 PAM認證地一般流程 , 同時也可以看出 PAM API使得使用認證地應(yīng)用程序不僅不用關(guān)心底層使用地服務(wù)模塊 , 而且編寫 起來簡潔明了得多 . Zzz6ZB2Ltk 有關(guān)開發(fā)使用 PAM地應(yīng)用程序更加詳細完整地闡述請參考 The Linux-PAM Application Developers' Guide. dvzfvkwMI1 2.3 怎樣開發(fā) PAM服務(wù)模塊

13、首先在編寫地服務(wù)模塊地源程序里要包含下列頭文件: #include PAM地服務(wù)模塊是一個一個地動態(tài)鏈接庫文件(也可以是靜態(tài)庫) ,PAM接口庫通過 dlopen 來裝載這些庫 . 假設(shè)源程序名為 pam_module-name.c,則需要用下列命令將其編譯成動態(tài)鏈接庫: rqyn14ZNXI gcc -fPIC -c pam_module-name.c ld -x --shared -o pam_module-name.so pam_module-name.o 選項 -fPIC 是指位置無關(guān)代碼 (Pos

14、ition Independent Code), 這類代碼支持 大偏移 . 使用 --shared 選項將目標代碼放進共享目標庫中 . 四種類型地模塊各自 要實現(xiàn)地函數(shù)如下表所示: EmxvxOtOco 模塊 函數(shù) 要實現(xiàn)地函數(shù) 功能 類型 PAM_EXTERNint pam_sm_authenticate(pam_handle_t *pamh, int 認證 flags, int argc, const char **argv) 用戶 認證 設(shè)置 管理 PAM_EXTERN int pam_sm_set

15、cred(pam_handle_t *pamh, int 用戶 flags, int argc, const char **argv) 證書 賬號 PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int 帳號 管理 flags, int argc, const char **argv) 管理 PAM_EXTERNint pam_sm_open_session(pam_handle_t *pamh, int 打開 會話 flags, int argc, const char **argv) 會話 管理 P

16、AM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, 關(guān)閉 int flags, int argc, const char **argv) 會話 口令 PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh, int 設(shè)置 管理 flags, int argc, const char **argv) 口令 當然同一個服務(wù)模塊可以同時屬于多種類型 , 只要這些類型模塊要實現(xiàn)地函數(shù)都實現(xiàn)了就可以 , 比如 PAM自帶地經(jīng)典口令認證機制模塊 pam_unix.so 就

17、可以 支持四種模塊類型 . SixE2yXPq5 4/12 個人收集整理 僅供參考學習 下面來看一個最簡單地 pam_deny模塊地源程序 pam_deny.c: 1. #define PAM_SM_AUTH 2. #define PAM_SM_ACCOUNT 3. #define PAM_SM_SESSION 4. #define PAM_SM_PASSWORD 5. #include "../../libpam/include/security/pam_modules.h" 6. /* ---認證

18、管理函數(shù)地實現(xiàn) --- */ 7. PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh,int flags,int argc 8. ,const char **argv) 9. { 10. return PAM_AUTH_ERR; 11. } 12. PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh,int flags,int argc 13. ,const char **argv) 14. { 15. return PAM_CR

19、ED_UNAVAIL; 16. } 17. /* ---賬號管理函數(shù)地實現(xiàn) --- */ 18. PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh,int flags,int argc 19. ,const char **argv) 20. { 21. return PAM_ACCT_EXPIRED; 22. } 23. /* ---口令管理函數(shù)地實現(xiàn) --- */ 24. PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh,int f

20、lags,int argc 25. ,const char **argv) 26. { 27. return PAM_AUTHTOK_ERR; 28. } 29. /* ---會話管理函數(shù)地實現(xiàn) --- */ 30. PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh,int flags,int argc 31. ,const char **argv) 32. { 33. return PAM_SYSTEM_ERR; 34. } 35. PAM_EXTERN int pa

21、m_sm_close_session(pam_handle_t *pamh,int flags,int argc 36. ,const char **argv) 5/12 個人收集整理 僅供參考學習 37. { 38. return PAM_SYSTEM_ERR; 39. } 40. /* 模塊定義結(jié)束 */ 41. /* 靜態(tài)模塊數(shù)據(jù) */ 42. #ifdef PAM_STATIC 43. struct pam_module _pam_deny_modstruct = { 44. "pam

22、_deny", 45. pam_sm_authenticate, 46. pam_sm_setcred, 47. pam_sm_acct_mgmt, 48. pam_sm_open_session, 49. pam_sm_close_session, 50. pam_sm_chauthtok 51. }; 52. #endif 很容易看出 ,pam_deny 模塊支持四種模塊類型 . 前 4 行包含靜態(tài)模塊地一些原型申明 , 第 37-39 行實現(xiàn)了四種模塊類型地函數(shù) , 因為這只是一個簡單地拒絕服務(wù)地模塊 , 所以這些函數(shù)只是簡單地返

23、回認證錯或系統(tǒng)錯等 PAM錯誤 . 最后幾行定義了該程序被編譯成靜態(tài)模塊所需地一個模塊數(shù)據(jù)結(jié)構(gòu) . 6ewMyirQFL 因此 ,PAM SPI 使得服務(wù)模塊地開發(fā)也相當簡單和專一 , 因為服務(wù)模塊不再需要考慮和應(yīng)用程序地交互 , 只要將自己采用地算法實現(xiàn)好就可以了 . kavU42VRUs 3 PAM接口庫源代碼分析 上面我們介紹了怎樣使用 PAM和怎樣開發(fā) PAM服務(wù)模塊 , 要想對 PAM地內(nèi)部機制有個透徹地理解 , 還需要進一步分析 PAM接口庫地代碼 . 下面基于 Linux 地包所得地源代碼進行分析 . y6v3ALoS89 3.1 PAM

24、接口庫主要數(shù)據(jù)結(jié)構(gòu) 先看一下 PAM接口庫用到地一些主要數(shù)據(jù)結(jié)構(gòu) .pam_handle 和其他幾個主要地數(shù)據(jù)結(jié)構(gòu)(見 ../libpam/pam_private.h )及其之間地關(guān)系如下圖所 示 . M2ub6vSTnP 6/12 個人收集整理 僅供參考學習 其中 pam_h

25、andle包含認證地用戶地 token 、用戶名、應(yīng)用程序名、 終端名等信息 , 以及一個 service 結(jié)構(gòu)( handlers );前面幾節(jié)提到地 pamh句柄就是一個 pam_handle 結(jié)構(gòu) .service 結(jié)構(gòu)包含服務(wù)模塊地相關(guān)信息 , 各個域地含義是: 0YujCfmUCw 1. module-- 該結(jié)構(gòu)包含裝載地模塊地名字、類型(靜態(tài)或動態(tài)模塊)、鏈接句柄(裝載模塊時地句柄) . eUts8ZQVRd 2. modules_allocated-- 分配地模塊數(shù) . 3. modules_used-- 已使用地模塊數(shù) .

26、 4. handlers_loaded-- 是否對操作 (handlers 結(jié)構(gòu) ) 進行了初始化 ,handlers 結(jié)構(gòu)和初始化 handlers 見下面地介紹 . sQsAEJkW5T 5. conf-- 由應(yīng)用程序相對應(yīng)地配置文件指定地服務(wù)模塊地handlers. 6. other-- 為缺省配置文件指定地服務(wù)模塊地 handlers. handlers 結(jié)構(gòu)包含六個 handler 結(jié)構(gòu)鏈表地指針 , 六個指針分別對應(yīng)六種不同地認證 API;libpam 通過這些指針找到對應(yīng)模塊地 SPI 服務(wù)函數(shù) . 如下表所示: GMsIasNX

27、kA handler 指針 API 函數(shù) authenticate pam_authenticate( ) setcred pam_setcred( ) acct_mgmt pam_acct_mgmt( )  SPI 函數(shù) pam_sm_authenticate( ) pam_sm_setcred( ) pam_sm_acct_mgmt( ) 7/12 個人收集整理 僅供參考學習 open_session pam_open_session( ) pam_sm_open

28、_session( ) close_session pam_close_session( ) pam_sm_close_session( ) chauthtok pam_chauthtok( ) pam_sm_chauthtok( ) handler 數(shù)據(jù)結(jié)構(gòu)是最直接保存服務(wù)模塊地 SPI 服務(wù)函數(shù)地地址及參數(shù)地結(jié)構(gòu) , 其包含地主要地域地含義如下: TIrRGchYzg 1. (*func)-- 該函數(shù)指針指向 handlers 所裝載地服務(wù)模塊地服務(wù)函數(shù) . 2. argc 、**argv-- 分別為 *func 所指向地函數(shù)地參數(shù)個數(shù)和參數(shù)列

29、表 . 3.*next-- 指向堆棧模塊中地下一個服務(wù)模塊地服務(wù)函數(shù) . 由此指針形成所有堆棧模塊地服務(wù)函數(shù)鏈 . 3.2 PAM 接口庫重要內(nèi)部函數(shù)分析 PAM接口庫中有一系列 _pam開頭地內(nèi)部函數(shù) , 那些 APIs 主要是調(diào)用這些內(nèi)部函數(shù)來完成其功能地 . int _pam_add_handler(pam_handle_t *pamh, int must_fail, int other, int type, int *actions, const char *mod_path, int argc, char **argv, int argvlen

30、) 7EqZcWLZNX 該函數(shù)負責加載服務(wù)模塊地 SPI 函數(shù) . 這個函數(shù)代碼很長有 300 多行 , 這里就不列舉了 . 其主要步驟如下: 1. 根據(jù) mod_path 提供地模塊路徑裝載服務(wù)模塊 (dl_open). 2. 由 type 確定地類型來決定要裝入地 SPI 函數(shù)名并找到該函數(shù) (dlsym) 地地址 .type 類型對應(yīng)配置文件中地服務(wù)模塊地四種類型標記 ,type 地值及其對應(yīng)地要裝入地 SPI 函數(shù)名見下表 . lzq7IGf02E 模塊類型 type SPI 函數(shù) 認證管理模塊 PAM_T_AUTH pam_sm_

31、authenticate pam_sm_setcred 會話管理模塊 PAM_T_SESS pam_sm_open_session pam_sm_close_session 帳號管理模塊 PAM_T_ACCTpam_sm_acct_mgmt 口令管理模塊 PAM_T_PASS pam_sm_chauthtok 3. 新分配一個 handler 結(jié)構(gòu) , 將 dlsym 找到地函數(shù)地地址賦給該 handler 結(jié)構(gòu)地 func 域 , 并填充其他地結(jié)構(gòu)信息 . zvpgeqJ1hk 8/12

32、 個人收集整理 僅供參考學習 4. 將新分配地 handler 結(jié)構(gòu)插入到 handlers 地對應(yīng) handler 結(jié)構(gòu)鏈表中 . _pam_parse_conf_file 函數(shù)負責讀并分析 PAM配置文件 , 將相關(guān)地信息填充 到 pamh句柄中 , 并調(diào)用 _pam_add_handlers 加載服務(wù)模塊地服務(wù)函 數(shù). NrpoJac3v1 _pam_init_handlers 函數(shù)主要做 handler 地初始化工作 , 先判斷 handler 是否已初始化 , 若沒有則調(diào)用 _pam_parse_conf_file 分析配置文

33、件加載服務(wù)模 塊地服務(wù)函數(shù) . 1nowfTG4KI _pam_dispatch_aux(pam_handle_t *pamh, int flags, struct handler *h,) 該函數(shù)負責遍歷執(zhí)行模塊堆棧中地每一個服務(wù)模塊對應(yīng)地 SPI 函數(shù) , 即執(zhí)行 h 指向地 handler 結(jié)構(gòu)鏈表中地每一個 func 指向地函數(shù) , 并返回模塊 堆棧地結(jié)果值 . fjnFLDa5Zo int _pam_dispatch(pam_handle_t *pamh, int flags, int choice) 該函數(shù) 首先通過調(diào)用 _pam_in

34、it_handlers 將模塊調(diào)度請求轉(zhuǎn)換為指向?qū)嶋H要運行地模塊堆棧函數(shù)鏈表地指針 , 并將該指針傳遞給 _pam_dispatch_aux 函數(shù)來遍歷模塊堆棧執(zhí)行服務(wù)函數(shù) . 該函數(shù)是實現(xiàn)六個認證 API 函數(shù)地主要部分和公共調(diào)用地函數(shù) , 通過 choice 選項來區(qū)分是哪個認證 API 函數(shù) . tfnNhnE6e5 下面分析我們最關(guān)心地部分 , 也即那些認證 API 是怎樣找到和調(diào)度配置文件中配置地服務(wù)模塊地? 3.3 PAM 認證 API 地實現(xiàn) 為了更加清楚地說明 PAM接口庫是怎樣來調(diào)度使用模塊地 , 下面給出了 pam_authenticate 函

35、數(shù)執(zhí)行地流程圖: HbmVN777sL 9/12 個人收集整理 僅供參考學習 其他地認證 API

36、函數(shù)(pam_open_session 等)執(zhí)行過程前面五個步驟同上圖 , 只是在最后一步時傳遞給 _pam_dispatch_aux 地指針參數(shù)不同 , 傳遞 3.1 節(jié)表中每個 API 函數(shù)相對應(yīng)地那個 handler 型指針 , 然后執(zhí)行相對應(yīng)地 SPI 服務(wù)函數(shù) 鏈 . V7l4jRB8Hs 參考資料 1. [Vipin Samar, Charlie Lai, 1995] Making Login Services Independent of Authentication Technologies. Sun Technical report. 8

37、3lcPA59W9 2. [Andrew G. Morgan, 2001] The Linux-PAM Module Writers' Guide. Linux-PAM Documentation. mZkklkzaaP 3. [Andrew G. Morgan, 2001] The Linux-PAM Module Writers' Guide. Linux-PAM Documentation. AVktR43bpw 10/12 個人收集整理 僅供參考學習 版權(quán)申明 本

38、文部分內(nèi)容,包括文字、圖片、以及設(shè)計等在網(wǎng)上搜集整理 . 版權(quán)為個人所有 This article includes some parts, including text, pictures, and design. Copyright is personal ownership.  ORjBnOwcEd 用戶可將本文地內(nèi)容或服務(wù)用于個人學習、 研究或欣賞,以及其 他非商業(yè)性或非盈利性用途, 但同時應(yīng)遵守著作權(quán)法及其他相關(guān)法律 地規(guī)定,不得侵犯本網(wǎng)站及相關(guān)權(quán)利人地合法權(quán)利 . 除此以外,將本 文任

39、何內(nèi)容或服務(wù)用于其他用途時, 須征得本人及相關(guān)權(quán)利人地書面 許可,并支付報酬 . 2MiJTy0dTT Users may use the contents or services of this article for personal study, research or appreciation, and other non-commercial or non-profit purposes, but at the same time, they shall abide by the provisions of copyright law and other rele

40、vant laws, and shall not infringe upon the legitimate rights of this website and its relevant obligees. In addition, when any content or service of this article is used for other purposes, written permission and remuneration shall be obtained from the person concerned and the relevant obligee.

41、 gIiSpiue7A 轉(zhuǎn)載或引用本文內(nèi)容必須是以新聞性或資料性公共免費信息為 11/12 個人收集整理 僅供參考學習 使用目地地合理、善意引用,不得對本文內(nèi)容原意進行曲解、修改, 并自負版權(quán)等法律責任 . uEh0U1Yfmh Reproduction or quotation of the content of this article must be reasonable and good-faith citation for the use of news or inf

42、ormative public free information. It shall not misinterpret or modify the original intention of the content of this article, and shall bear legal liability such as copyright. IAg9qLsgBX 12/12

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!