九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

軟件加密技術(shù)及實現(xiàn)畢業(yè)論文(可編輯)

上傳人:仙*** 文檔編號:30687125 上傳時間:2021-10-11 格式:DOC 頁數(shù):29 大?。?3.50KB
收藏 版權(quán)申訴 舉報 下載
軟件加密技術(shù)及實現(xiàn)畢業(yè)論文(可編輯)_第1頁
第1頁 / 共29頁
軟件加密技術(shù)及實現(xiàn)畢業(yè)論文(可編輯)_第2頁
第2頁 / 共29頁
軟件加密技術(shù)及實現(xiàn)畢業(yè)論文(可編輯)_第3頁
第3頁 / 共29頁

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

15 積分

下載資源

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

資源描述:

《軟件加密技術(shù)及實現(xiàn)畢業(yè)論文(可編輯)》由會員分享,可在線閱讀,更多相關(guān)《軟件加密技術(shù)及實現(xiàn)畢業(yè)論文(可編輯)(29頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 軟件加密技術(shù)及實現(xiàn)雷 鵬( 桂林電子工業(yè)學(xué)院 計算機系 ) 摘 要 當(dāng)今盜版軟件的泛濫成災(zāi)幾乎已經(jīng)成為了我們中國民族軟件的災(zāi)難,為了防止軟件的非法復(fù)制、盜版,保護軟件開發(fā)商的利益,就必須對軟件進行加密保護?,F(xiàn)在市面上有許多反盜版軟件,但這類軟件多是單機處理,并且只使用簡單的加密手段,很容易被解密者破解。 本文描述了一個通過Internet,集加密和電子注冊于一身的完善的軟件保護方案。該方案基于多種密碼學(xué)意義上可靠的算法,如對稱加密算法,散列算法,數(shù)字簽名,密鑰交換等等。通過對Windows下PE可執(zhí)行文件的結(jié)構(gòu)及載入機制進行深刻的剖析, 巧妙的使用這些密碼學(xué)算法及多種反破解方案對PE文件進行

2、加密保護。 在該方案的實現(xiàn)中,使用CryptoAPI中的數(shù)字簽名算法RSA,加密算法RC2和RC4,散列算法SHA,同時自己編寫了使用了MD5算法用于快速計算大量數(shù)據(jù)的摘要;網(wǎng)絡(luò)接口使用WinSocket;編程語言選用匯編語言和C+混合編程方式;反破解方案有檢測文件完整性、檢測代碼完整性、反跟蹤、反-反匯編、反Dump、代碼變形等等。 由于使用了可靠的密碼學(xué)算法,使軟件加密的強度大大提高;由于使用了Internet在線注冊方式,用戶使用也非常方便。 關(guān)鍵詞 加密 ;數(shù)字簽名 ;散列;反跟蹤 ;電子注冊 Software Protection technique and its realizat

3、ionLEI Peng ( GuiLin Institute of Electronic TechnologyThe Department of Computing ) Abstract The flooding of pirate software has been a calamity of our national software industryIn order to prevent software from pirate , and protect the profit of the software developer , they must encrypt their sof

4、tware to get a protectionThere are several software protection tools in the market currently , but these tools were standalone nine tenths , and they only used simple encryption algorithms , so they could be cracked easily by the crackers This thesis describes a perfect software encryption and prote

5、ction scheme which integrate the encryption and electronic registerThis scheme is based on multiple reliable cryptographic algorithms such as symmetric encryption algorithm , digital signature , hashing and key exchangeThe PE file format Portable Executable File Format and its loading mechanism unde

6、r Windows are dissected thoroughly in this thesisThen these cryptographic algorithms and several anti-crack method are used gracefully to encrypt and protect the PE file Within the realization of this scheme , the RSA digital signature algorithm , RC2 and RC4 encryption algorithm , SHA hasing algori

7、thm etc in MicroSoft CryptoAPI are usedIn order to increase the performace of caculate the digest of large number of data, MD5 hashing algorithm was rewrittenWinSocket API is used as the network interfaceThe blend of C+ and assembly are used for easily contoling the bottom layer of the system and si

8、mplify the programmingThe anti-crack method consits the integralization of the file checking , the integralization of the code checking , and anti-debug , anti-disassembly , anti-dump and code metamorphose etc The reliable cyrpto algorithms guarantee the crypto strengthAs a result of online register

9、 , the retail users and the software developers get convenience Key wordsEncrypt ; Digital Signature ; Hashing ; Anti-Debug ; Electronic Register 目 錄1概述12密碼學(xué)簡介2.1概念32.2對稱密碼算法62.3公開密碼算法62.4單向散列函數(shù)72.5數(shù)字簽名83Windows 環(huán)境下 PE 文件簡介3.1WIN32 與 PE 基本概念103.2PE首部123.3PE文件的導(dǎo)入表144當(dāng)前流行的一些軟件保護技術(shù)4.1序列號保護214.2時間限制224.

10、3Key File 保護234.4CD-check234.5反跟蹤技術(shù)(Anti-Debug)234.6反-反匯編技術(shù)(Anti- Disassmbly)244.7軟件狗254.8Vbox 保護技術(shù)254.9SalesAgent 保護技術(shù)264.10SecuROM 保護技術(shù)264.11軟盤加密264.12將軟件與機器硬件信息結(jié)合264.13加殼275該軟件的設(shè)計思想5.1傳統(tǒng)保護的不足285.2網(wǎng)絡(luò)的流行295.3我的方案295.4該方案的可行性分析296該軟件的整體構(gòu)架、開發(fā)工具及方法6.1需求分析326.2整體框架356.3各取所長(匯編與 C/C+ 各取所長)356.4C/C+ 與匯編語

11、言混合編程時的互調(diào)協(xié)議366.5該軟件中各模塊對語言特性的限制及解決方法406.6C/C+ 和匯編語言的預(yù)編譯457該軟件的實現(xiàn)及技術(shù)細節(jié)7.1CryptoAPI 簡介477.2幾個公共函數(shù)和宏497.3模塊共用的結(jié)構(gòu)體定義547.4Shield 模塊567.4.1殼程序中API和庫函數(shù)的處理597.4.2殼程序主體627.4.3加密殼程序637.4.4運行中修改自身代碼647.4.5代碼散列校驗647.4.6跳轉(zhuǎn)到客戶程序入口657.4.7載入并銷毀 Client 程序的 ImportTable667.4.8自毀殼程序代碼697.4.9編譯方法707.5Merge 模塊717.6Regist

12、er 模塊767.7Server 模塊777.8軟件授權(quán)協(xié)議的實現(xiàn)787.9Client的代碼(數(shù)據(jù))的加密/解密流程圖示828使用說明及演示8.1使用說明838.2演示及效果839限制、不足與展望9.1使用該軟件的限制869.2該軟件的不足869.3對該軟件的展望8710結(jié)束語10.1總結(jié)9110.2致謝91參考文獻92概述 我引用應(yīng)用密碼學(xué)作者Bruce Schneier的話: 世界上有兩種密碼:一種是防止你的小妹妹看你的文件;另一種是防止當(dāng)局者閱讀你的文件資料。 如果把一封信鎖在保險柜中,把保險柜藏在紐約的某個地方,然后告訴你去看這封信。這并不是安全,而是隱藏。相反,如果把一封信鎖在保險

13、柜中,然后把保險柜及其設(shè)計規(guī)范和許多同樣的保險柜給你,以便你和世界上最好的開保險柜的專家能夠研究鎖的裝置。而你還是無法打開保險柜去讀這封信,這樣才是安全的。 意思是說,一個密碼系統(tǒng)的安全性只在于密鑰的保密性,而不在算法的保密性。 對純數(shù)據(jù)的加密的確是這樣。對于你不愿意讓他看到這些數(shù)據(jù)(數(shù)據(jù)的明文)的人,用可靠的加密算法,只要破解者不知道被加密數(shù)據(jù)的密碼,他就不可解讀這些數(shù)據(jù)。 但是,軟件的加密不同于數(shù)據(jù)的加密,它只能是“隱藏”。不管你愿意不愿意讓他(合法用戶,或 Cracker)看見這些數(shù)據(jù)(軟件的明文),軟件最終總要在機器上運行,對機器,它就必須是明文。既然機器可以“看見”這些明文,那么 C

14、racker,通過一些技術(shù),也可以看到這些明文。 于是,從理論上,任何軟件加密技術(shù)都可以破解。只是破解的難度不同而已。有的要讓最高明的 Cracker 忙上幾個月,有的可能不費吹灰之力,就被破解了。 所以,反盜版的任務(wù)(技術(shù)上的反盜版,而非行政上的反盜版)就是增加 Cracker 的破解難度。讓他們花費在破解軟件上的成本,比他破解這個軟件的獲利還要高。這樣 Cracker 的破解變得毫無意義?誰會花比正版軟件更多的錢去買盜版軟件 ? 然而,要做到“難破解”,何嘗容易? Sony 曾宣稱的超強反盜版(Key 2 Audio音樂 CD反盜版),使用了很尖端的技術(shù),然而最近卻被一枝記號筆破解了,成為

15、人們的飯后笑料! 所以,很多看上去很好的技術(shù),可能在 Cracker 面前的確不堪一擊。就像馬其諾防線一樣,Cracker 不從你的防線入手,而是“繞道”。這樣,讓你的反盜版技術(shù)在你做夢也想不到的地方被 Crack 了。 為什么會這樣呢 ?歸根到底是因為軟件在機器上運行,并且軟件和機器是分離的?這一點是關(guān)鍵,如果軟件和硬件完全綁定,不能分離,是可以做到象 IDEA 之類幾乎不可破解的系統(tǒng)的。這將在后面談傳統(tǒng)軟件保護技術(shù)時詳細說明。 對我的這個解決方案,我不能保證Crack高手在幾天之內(nèi)不能破解它,我只能說:“在這個軟件中,我盡量堵住了當(dāng)前破解者普遍使用的方法以及“我想得到”的可能的缺口?!钡?/p>

16、我相信,傾注了我三個月心血的反盜版軟件,決不是一個“玩具式”的反盜版軟件。密碼學(xué)簡介概念1 發(fā)送者和接收者 假設(shè)發(fā)送者想發(fā)送消息給接收者,且想安全地發(fā)送信息:她想確信偷聽者不能閱讀發(fā)送的消息。2 消息和加密 消息被稱為明文。用某種方法偽裝消息以隱藏它的內(nèi)容的過程稱為加密,加了密的消息稱為密文,而把密文轉(zhuǎn)變?yōu)槊魑牡倪^程稱為解密。圖2-1表明了這個過程。圖2-1 加密和解密 明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位圖、數(shù)字化的語音流或數(shù)字化的視頻圖像)。至于涉及到計算機,P是簡單的二進制數(shù)據(jù)。明文可被傳送或存儲,無論在哪種情況,M指待加密的消息。 密文用C表示,它也是二進制數(shù)

17、據(jù),有時和M一樣大,有時稍大(通過壓縮和加密的結(jié)合,C有可能比P小些。然而,單單加密通常達不到這一點)。加密函數(shù)E作用于M得到密文C,用數(shù)學(xué)表示為: E(M)C.相反地,解密函數(shù)D作用于C產(chǎn)生M D(C)M.先加密后再解密消息,原始的明文將恢復(fù)出來,下面的等式必須成立:D(E(M)M3 鑒別、完整性和抗抵賴 除了提供機密性外,密碼學(xué)通常有其它的作用:a 鑒別 消息的接收者應(yīng)該能夠確認消息的來源;入侵者不可能偽裝成他人。b 完整性檢驗 消息的接收者應(yīng)該能夠驗證在傳送過程中消息沒有被修改;入侵者不可能用假消息代替合法消息。c 抗抵賴 發(fā)送者事后不可能虛假地否認他發(fā)送的消息。4 算法和密鑰 密碼算法

18、也叫密碼,是用于加密和解密的數(shù)學(xué)函數(shù)。(通常情況下,有兩個相關(guān)的函數(shù):一個用作加密,另一個用作解密) 如果算法的保密性是基于保持算法的秘密,這種算法稱為受限制的算法。受限制的算法具有歷史意義,但按現(xiàn)在的標準,它們的保密性已遠遠不夠。大的或經(jīng)常變換的用戶組織不能使用它們,因為每有一個用戶離開這個組織,其它的用戶就必須改換另外不同的算法。如果有人無意暴露了這個秘密,所有人都必須改變他們的算法。 更糟的是,受限制的密碼算法不可能進行質(zhì)量控制或標準化。每個用戶組織必須有他們自己的唯一算法。這樣的組織不可能采用流行的硬件或軟件產(chǎn)品。但竊聽者卻可以買到這些流行產(chǎn)品并學(xué)習(xí)算法,于是用戶不得不自己編寫算法并予

19、以實現(xiàn),如果這個組織中沒有好的密碼學(xué)家,那么他們就無法知道他們是否擁有安全的算法。 盡管有這些主要缺陷,受限制的算法對低密級的應(yīng)用來說還是很流行的,用戶或者沒有認識到或者不在乎他們系統(tǒng)中內(nèi)在的問題。 現(xiàn)代密碼學(xué)用密鑰解決了這個問題,密鑰用K表示。K可以是很多數(shù)值里的任意值。密鑰K的可能值的范圍叫做密鑰空間。加密和解密運算都使用這個密鑰(即運算都依賴于密鑰,并用K作為下標表示),這樣,加/解密函數(shù)現(xiàn)在變成: EKMC DKCM.這些函數(shù)具有下面的特性(見圖2-2):DK(EK(M)M.圖2-2 使用一個密鑰的加/解密圖2-3 使用兩個密鑰的加/解密 有些算法使用不同的加密密鑰和解密密鑰(見圖2-

20、3),也就是說加密密鑰K1與相應(yīng)的解密密鑰K2不同,在這種情況下:EK1MCDK2CMDK2 EK1MM 所有這些算法的安全性都基于密鑰的安全性;而不是基于算法的細節(jié)的安全性。這就意味著算法可以公開,也可以被分析,可以大量生產(chǎn)使用算法的產(chǎn)品,即使偷聽者知道你的算法也沒有關(guān)系;如果他不知道你使用的具體密鑰,他就不可能閱讀你的消息。密碼系統(tǒng)由算法、以及所有可能的明文、密文和密鑰組成的。 基于密鑰的算法通常有兩類:對稱算法和公開密鑰算法。下面將分別介紹:對稱密碼算法 對稱算法有時又叫傳統(tǒng)密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數(shù)對稱算法中,加/解密密鑰是相同的。這些算法也

21、叫秘密密鑰算法或單密鑰算法,它要求發(fā)送者和接收者在安全通信之前,商定一個密鑰。對稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都能對消息進行加/解密。只要通信需要保密,密鑰就必須保密。 對稱算法的加密和解密表示為:EK(M)CDK(C)M 對稱算法可分為兩類。一次只對明文中的單個比特(有時對字節(jié))運算的算法稱為序列算法或序列密碼。另一類算法是對明文的一組比特亞行運算,這些比特組稱為分組,相應(yīng)的算法稱為分組算法或分組密碼?,F(xiàn)代計算機密碼算法的典型分組長度為64比特?這個長度大到足以防止分析破譯,但又小到足以方便使用(在計算機出現(xiàn)前,算法普遍地每次只對明文的一個字符運算,可認為是序列密碼對字符序

22、列的運算)。公開密碼算法 公開密鑰算法(也叫非對稱算法)是這樣設(shè)計的:用作加密的密鑰不同于用作解密的密鑰,而且解密密鑰不能根據(jù)加密密鑰計算出來(至少在合理假定的長時間內(nèi))。之所以叫做公開密鑰算法,是因為加密密鑰能夠公開,即陌生者能用加密密鑰加密信息,但只有用相應(yīng)的解密密鑰才能解密信息。在這些系統(tǒng)中,加密密鑰叫做公開密鑰(簡稱公鑰),解密密鑰叫做私人密鑰(簡稱私鑰)。私人密鑰有時也叫秘密密鑰。為了避免與對稱算法混淆,此處不用秘密密鑰這個名字。 用公開密鑰K加密表示為EKMC. 雖然公開密鑰和私人密鑰是不同的,但用相應(yīng)的私人密鑰解密可表示為:DKCM 有時消息用私人密鑰加密而用公開密鑰解密,這用于

23、數(shù)字簽名(后面將詳細介紹),盡管可能產(chǎn)生混淆,但這些運算可分別表示為:EKMCDKCM 當(dāng)前的公開密碼算法的速度,比起對稱密碼算法,要慢的多,這使得公開密碼算法在大數(shù)據(jù)量的加密中應(yīng)用有限。單向散列函數(shù) 單向散列函數(shù) HM 作用于一個任意長度的消息 M,它返回一個固定長度的散列值 h,其中 h 的長度為 m 。 輸入為任意長度且輸出為固定長度的函數(shù)有很多種,但單向散列函數(shù)還有使其單向的其它特性:1 給定 M ,很容易計算 h ;2 給定 h ,根據(jù) HM h 計算 M 很難 ;3 給定 M ,要找到另一個消息 M 并滿足 HM HM 很難。在許多應(yīng)用中,僅有單向性是不夠的,還需要稱之為“抗碰撞”

24、的條件: 要找出兩個隨機的消息 M 和 M,使 HM HM 滿足很難。 由于散列函數(shù)的這些特性,由于公開密碼算法的計算速度往往很慢,所以,在一些密碼協(xié)議中,它可以作為一個消息 M 的摘要,代替原始消息 M,讓發(fā)送者為 HM 簽名而不是對 M 簽名 。 如 SHA 散列算法用于數(shù)字簽名協(xié)議 DSA中。數(shù)字簽名 提到數(shù)字簽名就離不開公開密碼系統(tǒng)和散列技術(shù)。 有幾種公鑰算法能用作數(shù)字簽名。在一些算法中,例如RSA,公鑰或者私鑰都可用作加密。用你的私鑰加密文件,你就擁有安全的數(shù)字簽名。在其它情況下,如DSA,算法便區(qū)分開來了數(shù)字簽名算法不能用于加密。這種思想首先由Diffie和Hellman提出 。

25、基本協(xié)議是簡單的 : 1 A 用她的私鑰對文件加密,從而對文件簽名。 2 A 將簽名的文件傳給B。 3 B用A的公鑰解密文件,從而驗證簽名。 這個協(xié)議中,只需要證明A的公鑰的確是她的。如果B不能完成第(3)步,那么他知道簽名是無效的。 這個協(xié)議也滿足以下特征:1 簽名是可信的。當(dāng)B用A的公鑰驗證信息時,他知道是由A簽名的。2 簽名是不可偽造的。只有A知道她的私鑰。3 簽名是不可重用的。簽名是文件的函數(shù),并且不可能轉(zhuǎn)換成另外的文件。4 被簽名的文件是不可改變的。如果文件有任何改變,文件就不可能用A的公鑰驗證。5 簽名是不可抵賴的。B不用A的幫助就能驗證A的簽名。 在實際應(yīng)用中,因為公共密碼算法的

26、速度太慢,簽名者往往是對消息的散列簽名而不是對消息本身簽名。這樣做并不會降低簽名的可信性。 本章僅對密碼學(xué)進行了一些簡要的介紹,更多的請參閱參考文獻1。Windows 環(huán)境下 PE 文件簡介WIN32 與 PE 基本概念 只要用過電腦的人都知道什么是 Windows,Windows95 已經(jīng)是過時的昨日黃花了,Windows98 也已推出將近四年了。2000 年又推出了Windows2000,今年又推出了 WindowsXP,微軟的操作系統(tǒng)更新速度是如此的快,以至于昨天還在使用的東西,在今天看來就已經(jīng)過時了。Windows98 以后,微軟傳言不在推出 9x 內(nèi)核的操作系統(tǒng),但是2000 年下半

27、年卻正式推出了 WindowsMillennium,簡稱 Win.Me 。然而從 WindowsXP 的推出,可以斷言,微軟不會在升級 Win9x 操作系統(tǒng)了。Windows2000 和 WindowsXP 都是基于 NT 內(nèi)核的。 所有這些操作系統(tǒng)都使用一種“可移植可執(zhí)行文件格式”(Portable Executable File Format),簡稱PE文件格式。 下面簡短介紹一下 PE 文件的一些概念。詳細內(nèi)容請參閱參考文獻14。 Windows NT 繼承了 VAX? VMS? 和 UNIX? 的傳統(tǒng)。許多 Windows NT 的創(chuàng)始人在進入微軟前都在這些平臺上進行設(shè)計和編碼。當(dāng)他們

28、開始設(shè)計 Windows NT 時,很自然的,為了最小化工程的啟動時間,他們會使用以前寫好的并且已經(jīng)測試過的工具。用這些工具生成并且工作的可執(zhí)行文件和 OBJ 文件格式叫做 COFF(Common Object File Format 的首字母縮寫)。COFF 的年齡不超過八年。 COFF 本身是一個很好的起點,但是需要擴展到一個現(xiàn)代操作系統(tǒng)如 Windows 95 和 Windows NT 就要進行一些更新。其結(jié)果就是產(chǎn)生了(PE格式)可移植可執(zhí)行文件格式。它被稱為“可移植的”是因為在所有平臺(如x86,Alpha,MIPS等等)上實現(xiàn)的WindowsNT 都使用相同的可執(zhí)行文件格式。當(dāng)然了

29、,也有許多不同的東西如二進制代碼的CPU指令。重要的是操作系統(tǒng)的裝入器和程序設(shè)計工具不需要為任何一種CPU完全重寫就能達到目的。 關(guān)于PE文件最重要的是,磁盤上的可執(zhí)行文件和它被WINDOWS載入內(nèi)存之后(PE文件載入內(nèi)存之后稱為PE映像)是非常相像的(如圖 3-1)。WINDOWS載入器不必為從磁盤上載入一個文件而辛辛苦苦創(chuàng)建一個進程。載入器使用內(nèi)存映射文件機制把文件中相似的塊映射到虛擬空間中。構(gòu)造式的進行分析,一個PE文件類似一個預(yù)制的屋子。它本質(zhì)上開始于這樣一個空間,這個空間后面有幾個把它連到其余空間的機件(就是說,把它聯(lián)系到它的DLL上,等等)。這對PE格式的DLL式一樣容易應(yīng)用的。一

30、旦這個模塊被載入,Windows 就可以有效的把它和其它內(nèi)存映射文件同等對待。圖 3-1 PE文件和PE映像的布局很相似 對Win32來講,模塊所使用的所有代碼,數(shù)據(jù),資源,導(dǎo)入表,和其它需要的模塊數(shù)據(jù)結(jié)構(gòu)都在一個連續(xù)的內(nèi)存塊中。在這種形勢下,你只需要知道載入器把可執(zhí)行文件映射到了什么地方就可以了。通過作為映像的一部分的指針,你可以很容易的找到這個模塊所有不同的塊。 另一個你需要知道的概念是相對虛擬地址(RVA)。PE文件中的許多域都用術(shù)語RVA來指定。一個RVA只是一些項目相對于文件映射到內(nèi)存的偏移。比如說,載入器把一個文件映射到虛擬地址0x10000開始的內(nèi)存塊。如果映像中一個實際的表的首

31、址是0x10464,那么它的RVA就是0x464。 (虛擬地址 0x10464)-(基地址 0x10000)=RVA 0x00464 為了把一個RVA轉(zhuǎn)化成一個有用的指針,只需要把RVA值加到模塊的基地址上即可。基地址是EXE和DLL內(nèi)存映射文件的基址,這個基址在Win32中這是一個很重要的概念。為了方便起見,WindowsNT 和 Windows9x用模塊的基址作為這個模塊的實例句柄(HINSTANCE)??梢詫θ魏蜠LL調(diào)用GetModuleHandledllname得到一個指針去訪問它的組件。如果 dllname 為 NULL,則得到執(zhí)行體自己的模塊句柄。這是非常有用的,如通常編譯器產(chǎn)生

32、的啟動代碼將取得這個句柄并將它作為一個參數(shù)hInstance傳給WinMain 。PE首部 和其它可執(zhí)行文件格式一樣,PE文件在眾所周知的地方有一些定義文件其余部分面貌的域。首部就包含這樣象代碼和數(shù)據(jù)的位置和尺寸的地方,操作系統(tǒng)要對它進行干預(yù),比如初始堆棧大小,和其它重要的塊的信息。和微軟其它執(zhí)行體的格式相比,PE格式的執(zhí)行體的主要的首部不是在文件的最開始。典型的PE文件最開始的數(shù)百個字節(jié)被DOS殘留部分占用。這個殘留部分是一個打印如“這個程序不能在DOS下運行!”這類信息的小程序。所以,你在一個不支持Win32的系統(tǒng)中運行這個程序,會得到這類錯誤信息。當(dāng)載入器把一個Win32程序映射到內(nèi)存,

33、這個映射文件的第一個字節(jié)對應(yīng)于DOS殘留部分的第一個字節(jié),這是無疑的。于是,和你啟動的任一個基于Win32 的程序一起,都有一個基于DOS的程序連帶被載入。 和微軟的其它可執(zhí)行格式一樣,你可以通過查找它的起始偏移來得到真實首部,這個偏移放在DOS殘留首部中。WINNT.H頭文件包含了DOS殘留程序的數(shù)據(jù)結(jié)構(gòu)定義(注),使得很容易找到PE首部的起始位置。e_lfanew 域是PE真實首部的偏移。為了得到PE首部在內(nèi)存中的指針,只需要把這個值加到映像的基址上即可。/ 忽略類型轉(zhuǎn)化和指針轉(zhuǎn)化pNTHeader dosHeader + dosHeader-e_lfanew; 注:為了不失簡潔,這里未列

34、出這些結(jié)構(gòu)體的完整定義就直接引用,這里直接引用的結(jié)構(gòu)體其定義都在winnt.h中,建議讀者在讀本章時參考Winnt.h 。 一旦你有了PE主首部的指針,游戲就可以開始了!PE主首部是一個IMAGE_NT_HEADERS的結(jié)構(gòu),在WINNT.H中定義。這個結(jié)構(gòu)由一個雙字(DWORD)和兩個子結(jié)構(gòu)組成,布局如下:DWORD Signature;/ 標志域IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER OptionalHeader; 標志域用ASCII表示就是“PE00”。 標志域之后的是結(jié)構(gòu) IMAGE_FILE_HEADER 。這個域只包含這

35、個文件最基本的信息。這個結(jié)構(gòu)看上去并未從它的原始COFF實現(xiàn)更改過。除了是PE首部的一部分,它還表現(xiàn)在微軟Win32編譯器生成的COFF OBJ 文件的最開始部分。 這個部分的詳細說明請參閱參考文獻14(本人已翻譯為中文)。 PE文件的導(dǎo)入表 因為導(dǎo)入表在該軟件的設(shè)計中很關(guān)鍵,后面殼程序?qū)氡淼臉?gòu)建,對客戶程序?qū)氡淼妮d入等,都牽涉到導(dǎo)入表 。所以,在這里有必要說明一下,更詳細的說明請參閱參考文獻141516。 導(dǎo)入表,簡單的說,導(dǎo)入表的作用相當(dāng)于 DOS 的系統(tǒng)中斷功能。兩者都是操作系統(tǒng) API 。只不過DOS中斷不需要操作系統(tǒng)在載入每個執(zhí)行體時填入 API 的實際地址,并且,導(dǎo)入表還可以導(dǎo)

36、入除操作系統(tǒng) API 之外的其它模塊中的函數(shù)。 在一個PE文件中,當(dāng)你調(diào)用另一模塊中的一個函數(shù)時(比如在USER32.DLL中的GetMessage ),編譯器產(chǎn)生的CALL 指令并不把控制直接轉(zhuǎn)移到在DLL中的這個函數(shù)。代替的,CALL 指令把把控制轉(zhuǎn)移到一個也在 .text 中的JMP DWORD PTR XXXXXXXX指令處(如圖3-2)。 這個 JMP 指令通過一個在導(dǎo)入表中的DWORD變量間接的轉(zhuǎn)移控制。 導(dǎo)入表的這個DWORD包含操作系統(tǒng)函數(shù)入口的實際地址。為什么DLL調(diào)用用這種方式來實現(xiàn)呢?原來,通過一個位置傳送所有的對一個給定的DLL函數(shù)的調(diào)用,載入器不需要改變每個調(diào)用DLL

37、的指令。所有的PE載入器必須做的是把目標函數(shù)的正確地址放到導(dǎo)入表的一個 DWORD 中。不需要改變?nèi)魏蝐all指令本身。 如果你想通過函數(shù)指針調(diào)用一個函數(shù),事情也會如你所預(yù)料的一樣。但是,如果你想讀取 GetMessage 開始的字節(jié),你將不能如愿。后面講到反 API 斷點時會詳細說明。 圖3-2 一個導(dǎo)入函數(shù)調(diào)用的圖示 前面描述了函數(shù)調(diào)用怎樣到一個外部DLL中而不直接調(diào)用這個DLL 。代替的,在執(zhí)行體中的 .text 塊中(如果你用Borland C+ 就是 .icode 塊),CALL指令到達一個 JMP DWORD PTR XXXXXXXX 指令處。 JMP指令尋找的地址把控制轉(zhuǎn)移到實際

38、的目標地址。PE文件的導(dǎo)入表會包含一些必要的信息,這些信息是載入器用來確定目標函數(shù)的地址以及在執(zhí)行體映像中修正他們的。 導(dǎo)入表開始于一個IMAGE_IMPORT_DESCRIPTOR數(shù)組。每個DLL都有一個PE文件隱含鏈接上的IMAGE_IMPORT_DESCRIPTOR 。沒有指定這個數(shù)組中結(jié)構(gòu)的數(shù)目的域。代替的,這個數(shù)組的最后一個元素是一個全NULL的IMAGE_IMPORT_DESCRIPTOR 。IMAGE_IMPORT_DESCRIPTOR的格式顯示在表3-1 。表 3-1 IMAGE_IMPORT_DESCRIPTOR 的格式DWORD Characteristics 在一個時刻,

39、這可能已是一個標志集。然而,微軟改變了它的涵義并不再糊涂地升級WINNT.H 。這個域?qū)嶋H上是一個指向指針數(shù)組的偏移(RVA)。其中每個指針都指向一個IMAGE_IMPORT_BY_NAME結(jié)構(gòu)?,F(xiàn)在這個域的涵義是 OriginalFirstThunk 。DWORD TimeDateStamp 表示這個文件的創(chuàng)建時間。 DWORD ForwarderChain 這個域聯(lián)系到前向鏈。前向鏈包括一個DLL函數(shù)向另一個DLL轉(zhuǎn)送引用。比如,在WindowsNT中,NTDLL.DLL就出現(xiàn)了的一些前向的它向KERNEL32.DLL導(dǎo)出的函數(shù)。應(yīng)用程序可能以為它調(diào)用的是NTDLL.DLL中的函數(shù),但它最

40、終調(diào)用的是KERNEL32.DLL中的函數(shù)。這個域還包含一個FirstThunk數(shù)組的索引(即刻描述)。用這個域索引的函數(shù)會前向引用到另一個DLL 。不幸的是,函數(shù)怎樣前向引用的格式?jīng)]有文檔,并且前向函數(shù)的例子也很難找。 DWORD Name 這是導(dǎo)入DLL的名字,指向以NULL結(jié)尾的ASCII字符串。通用例子是KERNEL32.DLL和USER32.DLL 。 PIMAGE_THUNK_DATA FirstThunk 這個域是指向IMAGE_THUNK_DATA聯(lián)合的偏移(RVA)。幾乎在任何情況下,這個域都解釋為一個指向的IMAGE_IMPORT_BY_NAME結(jié)構(gòu)的指針。如果這個域不是這

41、些指針中的一個,那它就被當(dāng)作一個將從這個被導(dǎo)入的DLL的導(dǎo)出序數(shù)值。如果你實際上可以從序數(shù)導(dǎo)入一個函數(shù)而不是從名字導(dǎo)入,從文檔看,這是很含糊的。 IMAGE_IMPORT_DESCRIPTOR 的一個重要部分是導(dǎo)入的DLL的名字和兩個IMAGE_IMPORT_BY_NAME指針數(shù)組。在EXE文件中,這兩個數(shù)組(由Characteristics域和FirstThunk域指向)是相互平行的,都是以NULL指針作為數(shù)組的最后一個元素。兩個數(shù)組中的指針都指向 IMAGE_IMPORT_BY_NAME 結(jié)構(gòu)。圖 3-3 顯示了這種布局。 圖 3-3 導(dǎo)入表中一個項的結(jié)構(gòu)圖示 PE文件導(dǎo)入表中的每一個函數(shù)

42、有一個 IMAGE_IMPORT_BY_NAME 結(jié)構(gòu)。IMAGE_IMPORT_BY_NAME結(jié)構(gòu)非常簡單,看上去是這樣:WORD Hint;BYTE Name?;第一個域是導(dǎo)入函數(shù)的導(dǎo)出序數(shù)的最佳猜測值。和NE文件不同,這個值不是必須正確的。于是,載入器指示把它當(dāng)作一個進行二分查找的建議開始值。下一個是導(dǎo)入函數(shù)的名字的ASCIIZ字符串。 為什么有兩個平行的指針數(shù)組指向結(jié)構(gòu)IMAGE_IMPORT_BY_NAME ?第一個數(shù)組(由Characteristics域指向的)單獨的留下來,并不被修改。經(jīng)常被稱作提名表。第二個數(shù)組(由FirstThunk域指向的)將被PE載入器覆蓋。載入器在這個數(shù)

43、組中迭代每個指針,并查找每個IMAGE_IMPORT_BY_NAME結(jié)構(gòu)指向的函數(shù)的地址。載入器然后用找到的函數(shù)地址覆蓋這個指向IMAGE_IMPORT_BY_NAME結(jié)構(gòu)的指針。 JMP DWORD PTR XXXXXXXX 中的 XXXXXXXX 指向 FirstThunk 數(shù)組的一個條目。因為由載入器覆蓋的這個指針數(shù)組實際上保持所有導(dǎo)入函數(shù)的地址,叫做“導(dǎo)入地址表”。 在優(yōu)化上無止境的探索中,微軟在WindowsNT中“優(yōu)化”了系統(tǒng)DLL(KERNEL32.DLL等等)的thunk數(shù)組。在這個優(yōu)化中,這個數(shù)組中的指針不再指向IMAGE_IMPORT_BY_NAME結(jié)構(gòu),它們已經(jīng)包含了導(dǎo)入

44、函數(shù)的地址。換句話說,載入器不需要去查找函數(shù)的地址并用導(dǎo)入函數(shù)的地址覆蓋thunk數(shù)組(譯注)。譯注:這就是 Bound Import,關(guān)于Bound Import,參考文獻1516,有詳細介紹。不過,在我的軟件中,忽略了對Bound Import 的處理,這樣會造成一些程序載入速度的減小。但使問題簡化了許多。 因為導(dǎo)入地址表在一個可寫的塊中,攔截一個EXE或DLL對另一個DLL的調(diào)用就相對容易。只需要修改適當(dāng)?shù)貙?dǎo)入地址條目去指向希望攔截的函數(shù)。不需要修改調(diào)用者或被調(diào)者的任何代碼。 注意微軟產(chǎn)生的PE文件的導(dǎo)入表并不是完全被連接器同步的,這一點很有趣。所有對另一個DLL中的函數(shù)的調(diào)用的指令都在

45、一個導(dǎo)入庫中。當(dāng)你連接一個DLL時,庫管理器(LIB32.EXE或LIB.EXE)掃描將要被連接的OBJ文件并且創(chuàng)建一個導(dǎo)入庫。這個導(dǎo)入庫完全不同于16位NE文件連接器使用的導(dǎo)入庫。32位庫管理器產(chǎn)生的導(dǎo)入庫有一個.text塊和幾個.idata$塊。導(dǎo)入庫中的.text塊包含 JMP XXXX 指令,這條指令的標號在OBJ文件的符號表中用一個符號名來存儲。這個符號名對將要從DLL中導(dǎo)出的所有函數(shù)名講都是唯一的(例如:_Dispatch_Message4)。導(dǎo)入庫中的一個.idata$塊包含一個從導(dǎo)入庫中引用的地址,即導(dǎo)入庫的 .text 中的指令: JMP XXXX 中的XXXX 。 另一個.

46、idata$塊有一個提示序號(hint ordinal)的空間。這兩個域就組成了IMAGE_IMPORT_BY_NAME結(jié)構(gòu)。當(dāng)你晚期連接一個使用導(dǎo)入庫的PE文件時,導(dǎo)入庫的塊被加到連接器需要處理的塊的列表中,這個列表在你的OBJ文件中。一旦導(dǎo)入庫中的這個xxxx的名字和和要導(dǎo)入的函數(shù)名相同,連接器就假定這條jmp xxxx指令就是這個導(dǎo)入函數(shù),并修正其中的xxxx ,使其指向這個.idata$中的一個存儲導(dǎo)入函數(shù)地址的空間。導(dǎo)入庫中的這條jmp xxxx指令在本質(zhì)上就被當(dāng)作這個導(dǎo)入函數(shù)本身了。 除了提供一個導(dǎo)入函數(shù)的指令jmp xxxx,導(dǎo)入庫還提供PE文件的.idata塊(或稱導(dǎo)入表)的片

47、斷。這些片斷來自于庫管理器放入導(dǎo)入庫中的不同的.idata$塊。簡而言之,連接器實際上不知道出現(xiàn)在不同的OBJ文件中的導(dǎo)入函數(shù)和普通函數(shù)之間的不同。連接器只是按照它的內(nèi)部規(guī)則去建立并結(jié)合塊,于是,所有的事情就自然順理成章了。 本文有關(guān)導(dǎo)入表的內(nèi)容,基本上就這么多,要得到更多的信息,請參閱參考文獻141516。 當(dāng)前流行的一些軟件保護技術(shù)序列號保護 數(shù)學(xué)算法一項都是密碼加密的核心,但在一般的軟件加密中,它似乎并不太為人們關(guān)心,因為大多數(shù)時候軟件加密本身實現(xiàn)的都是一種編程的技巧。但近幾年來隨著序列號加密程序的普及,數(shù)學(xué)算法在軟件加密中的比重似乎是越來越大了。 看看在網(wǎng)絡(luò)上大行其道的序列號加密的工作

48、原理。當(dāng)用戶從網(wǎng)絡(luò)上下載某個shareware?共享軟件后,一般都有使用時間上的限制,當(dāng)過了共享軟件的試用期后,你必須到這個軟件的公司去注冊后方能繼續(xù)使用。注冊過程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號碼告訴給軟件公司,軟件公司會根據(jù)用戶的信息計算出一個序列碼,在用戶得到這個序列碼后,按照注冊需要的步驟在軟件中輸入注冊信息和注冊碼,其注冊信息的合法性由軟件驗證通過后,軟件就會取消掉本身的各種限制,這種加密實現(xiàn)起來比較簡單,不需要額外的成本,用戶購買也非常方便,在互聯(lián)網(wǎng)上的軟件80%都是以這種方式來保護的。 軟件驗證序列號的合法性過程,其實就是驗證用戶名和序列號之間的換算關(guān)系是

49、否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名來生成注冊碼,再同用戶輸入的注冊碼比較,公式表示如下: 序列號 F(用戶名) 但這種方法等于在用戶軟件中再現(xiàn)了軟件公司生成注冊碼的過程,實際上是非常不安全的,不論其換算過程多么復(fù)雜,解密者只需把你的換算過程從程序中提取出來就可以編制一個通用的注冊程序。 另外一種是通過注冊碼來驗證用戶名的正確性,公式表示如下: 用戶名稱 F逆(序列號) (如ACDSEE) 這其實是軟件公司注冊碼計算過程的反算法,如果正向算法與反向算法不是對稱算法的話,對于解密者來說,的確有些困難,但這種算法相當(dāng)不好設(shè)計。 于是有人考慮到以下的算法: ? F1(用戶名稱)

50、 F2(序列號) F1、F2是兩種完全不同的的算法,但用戶名通過F1算法計算出的特征字等于序列號通過F2算法計算出的特征字,這種算法在設(shè)計上比較簡單,保密性相對以上兩種算法也要好的多。如果能夠把F1、F2算法設(shè)計成不可逆算法的話,保密性相當(dāng)?shù)暮?可一旦解密者找到其中之一的反算法的話,這種算法就不安全了。一元算法的設(shè)計看來再如何努力也很難有太大的突破,那么二元呢? 特定值 F(用戶名,序列號) 這個算法看上去相當(dāng)不錯,用戶名稱與序列號之間的關(guān)系不再那么清晰了,但同時也失去了用戶名于序列號的一一對應(yīng)關(guān)系,軟件開發(fā)者必須自己維護用戶名稱與序列號之間的唯一性,但這似乎不是難以辦到的事,建個數(shù)據(jù)庫就可以

51、了。當(dāng)然也可以把用戶名稱和序列號分為幾個部分來構(gòu)造多元的算法。 特定值 F(用戶名1,用戶名2,序列號1,序列號2) 現(xiàn)有的序列號加密算法大多是軟件開發(fā)者自行設(shè)計的,大部分相當(dāng)簡單。而且有些算法作者雖然下了很大的功夫,效果卻往往得不到它所希望的結(jié)果。時間限制 有些程序的試用版每次運行都有時間限制,例如運行10分鐘或20分鐘就停止工作,必須重新運行該程序才能正常工作。這些程序里面自然有個定時器來統(tǒng)計程序運行的時間。 這種方法使用的較少。Key File 保護 Key File(注冊文件)是一種利用文件來注冊軟件的保護方式。Key File一般是一個小文件,可以是純文本文件,也可以是包含不可顯示字

52、符的二進制文件,其內(nèi)容是一些加密過或未加密的數(shù)據(jù),其中可能有用戶名、注冊碼等信息。文件格式則由軟件作者自己定義。試用版軟件沒有注冊文件,當(dāng)用戶向作者付費注冊之后,會收到作者寄來的注冊文件,其中可能包含用戶的個人信息。用戶只要將該文件放入指定的目錄,就可以讓軟件成為正式版。該文件一般是放在軟件的安裝目錄中或系統(tǒng)目錄下。軟件每次啟動時,從該文件中讀取數(shù)據(jù),然后利用某種算法進行處理,根據(jù)處理的結(jié)果判斷是否為正確的注冊文件,如果正確則以注冊版模式來運行。 這種保護方法使用也不多,但是,我個人認為,比時間限制要好。CD-check 即光盤保護技術(shù)。程序在啟動時判斷光驅(qū)中的光盤上是否存在特定的文件,如果不

53、存在則認為用戶沒有正版光盤,拒絕運行。在程序運行的過程當(dāng)中一般不再檢查光盤的存在與否。Windows下的具體實現(xiàn)一般是這樣的:先用GetLogicalDriveStrings 或GetLogicalDrives 得到系統(tǒng)中安裝的所有驅(qū)動器的列表,然后再用GetDriveType 檢查每一個驅(qū)動器,如果是光驅(qū)則用CreateFileA 或FindFirstFileA 等函數(shù)檢查特定的文件存在與否,并可能進一步地檢查文件的屬性、大小、內(nèi)容等。反跟蹤技術(shù)(Anti-Debug) 好的軟件保護都要和反跟蹤技術(shù)結(jié)合在一起。如果沒有反跟蹤技術(shù),軟件等于直接裸露在 Cracker 面前。這里說的反跟蹤,指的

54、是反動態(tài)跟蹤。即防止 Cracker 用 SoftICE 之類的調(diào)試器動態(tài)跟蹤,分析軟件。當(dāng)前的這類軟件還有如 TRW 、ICEDUMP 等等。反跟蹤技術(shù)一般是具有針對性的,即針對某種調(diào)試器的反跟蹤,而不能防止所有的調(diào)試器跟蹤,如果有新的破解工具出現(xiàn),就需要相應(yīng)的反跟蹤技術(shù) 。 這種技術(shù)一般是檢測這些特定的調(diào)試器是否駐留內(nèi)存,如果駐留內(nèi)存,就認為被跟蹤,從而拒絕執(zhí)行,或進行一些懲罰性措施 。還有一些檢測方法,如假設(shè)這些調(diào)試器在內(nèi)存中,軟件和這些調(diào)試器通信,如果結(jié)果合乎這些調(diào)試器的輸出 。就認為被跟蹤 ?;蛘咴趦?nèi)存中搜尋這些調(diào)試器的特征串,如果找到,就認為被跟蹤 。有的甚至用中斷鉤子、SEH(S

55、tructural Exception Handle,即結(jié)構(gòu)化異常處理)檢測調(diào)試器。反-反匯編技術(shù)(Anti- Disassmbly) 即 Anti-Disassmbly ??舍槍iT的反匯編軟件設(shè)計的“陷阱”,讓反匯編器陷入死循環(huán),但這種方法沒有通用性。 一般是使用花指令 。這種方法有通用性,即所有的反匯編器都可以用這種方法來抵擋 。這種方法主要是利用不同的機器指令包含的字節(jié)數(shù)并不相同,有的是單字節(jié)指令,有的是多字節(jié)指令。對于多字節(jié)指令來說,反匯編軟件需要確定指令的第一個字節(jié)的起始位置,也就是操作碼的位置,這樣才能正確地反匯編這條指令,否則它就可能反匯編成另外一條指令了。并且,多字節(jié),指令長

56、度不定,使得反匯編器在錯誤譯碼一條指令后,接下來的許多條指令都會被錯誤譯碼 。所以,這種方法是很有效的 。 實施方法:在程序中加入一些無用的字節(jié)來干擾反匯編軟件的判斷,從而使得它錯誤地確定指令的起始位置,那么也就達到了干擾反匯編器工作的目的。一般形式如下: .jmp L1dd012344578h ;這里是一些隨機數(shù),用來干擾反匯編器 ;對指令的譯碼L1:軟件狗 軟件狗是一種智能型加密工具。它是一個安裝在并口、串口等接口上的硬件電路,同時有一套使用于各種語言的接口軟件和工具軟件。當(dāng)被狗保護的軟件運行時,程序向插在計算機上的軟件狗發(fā)出查詢命令,軟件狗迅速計算查詢并給出響應(yīng),正確的響應(yīng)保證軟件繼續(xù)運

57、行。如果沒有軟件狗,程序?qū)⒉荒苓\行,復(fù)雜的軟硬件技術(shù)結(jié)合在一起防止軟件盜版。真正有商業(yè)價值得軟件一般都用軟件狗來保護。 平時常見的狗主要有“洋狗”(國外狗)和“土狗”(國產(chǎn)狗)。這里“洋狗”主要指美國的彩虹和以色列的HASP,“土狗”主要有金天地(現(xiàn)在與美國彩虹合資,叫“彩虹天地”)、深思、尖石??偟恼f來,“洋狗”在軟件接口、加殼、反跟蹤等“軟”方面沒有“土狗”好,但在硬件上絕對無法破解(應(yīng)當(dāng)說破解難度非常大);而“土狗”在軟的方面做的很好,但在硬件上不如“洋狗”,稍有單片機功力的人,都可以復(fù)制。Vbox 保護技術(shù) Vbox 是一個軟件 。它是用來保護其它軟件的 。凡被 Vbox 保護的軟件,一旦過了試用期,就不能再使用了,刪了重裝也沒用,除非刪除整個操作系統(tǒng)再重裝。SalesAgent 保護技術(shù) SalesAgent 保護的軟件一般具有 x 天試用再購買的接口,是一種時間限制保護方式。才用這種保護方式的軟件主要有 Macromedia Flash 4 、DreameWaver 等等。SecuROM 保護技術(shù) SecuROM (/htt

展開閱讀全文
溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(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),我們立即給予刪除!