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

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

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

10 積分

下載資源

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

資源描述:

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

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

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

3、 Software Protection technique and its realization LEI 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 pro

4、fit of the software developer , they must encrypt their software 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 T

5、his thesis describes a perfect software encryption and protection 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 Po

6、rtable Executable File Format and its loading mechanism under 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 alg

7、orithm , RC2 and RC4 encryption algorithm , SHA hasing algorithm 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

8、used for easily contoling the bottom layer of the system and simplify 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 algori

9、thms guarantee the crypto strengthAs a result of online register , the retail users and the software developers get convenience Key wordsEncrypt ; Digital Signature ; Hashing ; Anti-Debug ; Electronic Register 目 錄 1 概述 1 2 密碼學(xué)簡介 2.1 概念 3 2.2 對稱密碼算法 6 2.3 公開密碼算法 6 2.4 單向散列函數(shù) 7

10、 2.5 數(shù)字簽名 8 3 Windows 環(huán)境下 PE 文件簡介 3.1 WIN32 與 PE 基本概念 10 3.2 PE首部 12 3.3 PE文件的導(dǎo)入表 14 4 當(dāng)前流行的一些軟件保護(hù)技術(shù) 4.1 序列號保護(hù) 21 4.2 時(shí)間限制 22 4.3 Key File 保護(hù) 23 4.4 CD-check 23 4.5 反跟蹤技術(shù)(Anti-Debug) 23 4.6 反-反匯編技術(shù)(Anti- Disassmbly) 24 4.7 軟件狗 25 4.8 Vbox 保護(hù)技術(shù) 25 4.9 SalesAgent 保護(hù)技術(shù) 26 4.10 SecuROM 保護(hù)

11、技術(shù) 26 4.11 軟盤加密 26 4.12 將軟件與機(jī)器硬件信息結(jié)合 26 4.13 加殼 27 5 該軟件的設(shè)計(jì)思想 5.1 傳統(tǒng)保護(hù)的不足 28 5.2 網(wǎng)絡(luò)的流行 29 5.3 我的方案 29 5.4 該方案的可行性分析 29 6 該軟件的整體構(gòu)架、開發(fā)工具及方法 6.1 需求分析 32 6.2 整體框架 35 6.3 各取所長(匯編與 C/C++ 各取所長) 35 6.4 C/C++ 與匯編語言混合編程時(shí)的互調(diào)協(xié)議 36 6.5 該軟件中各模塊對語言特性的限制及解決方法 40 6.6 C/C++ 和匯編語言的預(yù)編譯 45 7 該軟件的實(shí)現(xiàn)及技術(shù)細(xì)節(jié)

12、 7.1 CryptoAPI 簡介 47 7.2 幾個(gè)公共函數(shù)和宏 49 7.3 模塊共用的結(jié)構(gòu)體定義 54 7.4 Shield 模塊 56 7.4.1 殼程序中API和庫函數(shù)的處理 59 7.4.2 殼程序主體 62 7.4.3 加密殼程序 63 7.4.4 運(yùn)行中修改自身代碼 64 7.4.5 代碼散列校驗(yàn) 64 7.4.6 跳轉(zhuǎn)到客戶程序入口 65 7.4.7 載入并銷毀 Client 程序的 ImportTable 66 7.4.8 自毀殼程序代碼 69 7.4.9 編譯方法 70 7.5 Merge 模塊 71 7.6 Register 模塊 76 7

13、.7 Server 模塊 77 7.8 軟件授權(quán)協(xié)議的實(shí)現(xiàn) 78 7.9 Client的代碼(數(shù)據(jù))的加密/解密流程圖示 82 8 使用說明及演示 8.1 使用說明 83 8.2 演示及效果 83 9 限制、不足與展望 9.1 使用該軟件的限制 86 9.2 該軟件的不足 86 9.3 對該軟件的展望 87 10 結(jié)束語 10.1 總結(jié) 91 10.2 致謝 91 參考文獻(xiàn) 92 概述 我引用《應(yīng)用密碼學(xué)》作者Bruce Schneier的話: 世界上有兩種密碼:一種是防止你的小妹妹看你的文件;另一種是防止當(dāng)局者閱讀你的文件資料。 如果把一封信鎖在

14、保險(xiǎn)柜中,把保險(xiǎn)柜藏在紐約的某個(gè)地方…,然后告訴你去看這封信。這并不是安全,而是隱藏。相反,如果把一封信鎖在保險(xiǎn)柜中,然后把保險(xiǎn)柜及其設(shè)計(jì)規(guī)范和許多同樣的保險(xiǎn)柜給你,以便你和世界上最好的開保險(xiǎn)柜的專家能夠研究鎖的裝置。而你還是無法打開保險(xiǎn)柜去讀這封信,這樣才是安全的。 意思是說,一個(gè)密碼系統(tǒng)的安全性只在于密鑰的保密性,而不在算法的保密性。 對純數(shù)據(jù)的加密的確是這樣。對于你不愿意讓他看到這些數(shù)據(jù)(數(shù)據(jù)的明文)的人,用可靠的加密算法,只要破解者不知道被加密數(shù)據(jù)的密碼,他就不可解讀這些數(shù)據(jù)。 但是,軟件的加密不同于數(shù)據(jù)的加密,它只能是“隱藏”。不管你愿意不愿意讓他(合法用戶,或 C

15、racker)看見這些數(shù)據(jù)(軟件的明文),軟件最終總要在機(jī)器上運(yùn)行,對機(jī)器,它就必須是明文。既然機(jī)器可以“看見”這些明文,那么 Cracker,通過一些技術(shù),也可以看到這些明文。 于是,從理論上,任何軟件加密技術(shù)都可以破解。只是破解的難度不同而已。有的要讓最高明的 Cracker 忙上幾個(gè)月,有的可能不費(fèi)吹灰之力,就被破解了。 所以,反盜版的任務(wù)(技術(shù)上的反盜版,而非行政上的反盜版)就是增加 Cracker 的破解難度。讓他們花費(fèi)在破解軟件上的成本,比他破解這個(gè)軟件的獲利還要高。這樣 Cracker 的破解變得毫無意義??誰會花比正版軟件更多的錢去買盜版軟件 ? 然而,要做到

16、“難破解”,何嘗容易? Sony 曾宣稱的超強(qiáng)反盜版(Key 2 Audio音樂 CD反盜版),使用了很尖端的技術(shù),然而最近卻被一枝記號筆破解了,成為人們的飯后笑料! 所以,很多看上去很好的技術(shù),可能在 Cracker 面前的確不堪一擊。就像馬其諾防線一樣,Cracker 不從你的防線入手,而是“繞道”。這樣,讓你的反盜版技術(shù)在你做夢也想不到的地方被 Crack 了。 為什么會這樣呢 ?歸根到底是因?yàn)檐浖跈C(jī)器上運(yùn)行,并且軟件和機(jī)器是分離的??這一點(diǎn)是關(guān)鍵,如果軟件和硬件完全綁定,不能分離,是可以做到象 IDEA 之類幾乎不可破解的系統(tǒng)的。這將在后面談傳統(tǒng)軟件保護(hù)技術(shù)時(shí)詳細(xì)說明。

17、 對我的這個(gè)解決方案,我不能保證Crack高手在幾天之內(nèi)不能破解它,我只能說:“在這個(gè)軟件中,我盡量堵住了當(dāng)前破解者普遍使用的方法以及“我想得到”的可能的缺口?!钡俏蚁嘈?傾注了我三個(gè)月心血的反盜版軟件,決不是一個(gè)“玩具式”的反盜版軟件。 密碼學(xué)簡介 概念 1 發(fā)送者和接收者 假設(shè)發(fā)送者想發(fā)送消息給接收者,且想安全地發(fā)送信息:她想確信偷聽者不能閱讀發(fā)送的消息。 2 消息和加密 消息被稱為明文。用某種方法偽裝消息以隱藏它的內(nèi)容的過程稱為加密,加了密的消息稱為密文,而把密文轉(zhuǎn)變?yōu)槊魑牡倪^程稱為解密。圖2-1表明了這個(gè)過程。 圖2-1 加密和解密 明文用M(消息)

18、或P(明文)表示,它可能是比特流(文本文件、位圖、數(shù)字化的語音流或數(shù)字化的視頻圖像)。至于涉及到計(jì)算機(jī),P是簡單的二進(jìn)制數(shù)據(jù)。明文可被傳送或存儲,無論在哪種情況,M指待加密的消息。 密文用C表示,它也是二進(jìn)制數(shù)據(jù),有時(shí)和M一樣大,有時(shí)稍大(通過壓縮和加密的結(jié)合,C有可能比P小些。然而,單單加密通常達(dá)不到這一點(diǎn))。加密函數(shù)E作用于M得到密文C,用數(shù)學(xué)表示為: E(M)C. 相反地,解密函數(shù)D作用于C產(chǎn)生M D(C)M. 先加密后再解密消息,原始的明文將恢復(fù)出來,下面的等式必須成立: D(E(M))M 3 鑒

19、別、完整性和抗抵賴 除了提供機(jī)密性外,密碼學(xué)通常有其它的作用:a 鑒別 消息的接收者應(yīng)該能夠確認(rèn)消息的來源;入侵者不可能偽裝成他人。 b 完整性檢驗(yàn) 消息的接收者應(yīng)該能夠驗(yàn)證在傳送過程中消息沒有被修改;入侵者不可能用假消息代替合法消息。 c 抗抵賴 發(fā)送者事后不可能虛假地否認(rèn)他發(fā)送的消息。 4 算法和密鑰 密碼算法也叫密碼,是用于加密和解密的數(shù)學(xué)函數(shù)。(通常情況下,有兩個(gè)相關(guān)的函數(shù):一個(gè)用作加密,另一個(gè)用作解密) 如果算法的保密性是基于保持算法的秘密,這種算法稱為受限制的算法。受限制的算法具有歷史意義,但按現(xiàn)在的標(biāo)準(zhǔn),它們的保密性已遠(yuǎn)遠(yuǎn)不夠。大的或經(jīng)

20、常變換的用戶組織不能使用它們,因?yàn)槊坑幸粋€(gè)用戶離開這個(gè)組織,其它的用戶就必須改換另外不同的算法。如果有人無意暴露了這個(gè)秘密,所有人都必須改變他們的算法。 更糟的是,受限制的密碼算法不可能進(jìn)行質(zhì)量控制或標(biāo)準(zhǔn)化。每個(gè)用戶組織必須有他們自己的唯一算法。這樣的組織不可能采用流行的硬件或軟件產(chǎn)品。但竊聽者卻可以買到這些流行產(chǎn)品并學(xué)習(xí)算法,于是用戶不得不自己編寫算法并予以實(shí)現(xiàn),如果這個(gè)組織中沒有好的密碼學(xué)家,那么他們就無法知道他們是否擁有安全的算法。 盡管有這些主要缺陷,受限制的算法對低密級的應(yīng)用來說還是很流行的,用戶或者沒有認(rèn)識到或者不在乎他們系統(tǒng)中內(nèi)在的問題。 現(xiàn)代密碼學(xué)用密鑰解決了

21、這個(gè)問題,密鑰用K表示。K可以是很多數(shù)值里的任意值。密鑰K的可能值的范圍叫做密鑰空間。加密和解密運(yùn)算都使用這個(gè)密鑰(即運(yùn)算都依賴于密鑰,并用K作為下標(biāo)表示),這樣,加/解密函數(shù)現(xiàn)在變成: EKMC DKCM. 這些函數(shù)具有下面的特性(見圖2-2): DK(EK(M))M. 圖2-2 使用一個(gè)密鑰的加/解密 圖2-3 使用兩個(gè)密鑰的加/解密 有些算法使用不同的加密密鑰和解密密鑰(見圖2-3),也就是說加密密鑰K1與相應(yīng)的解密密鑰K2不同,在這種情況下: EK1MC DK2CM DK2 EK1MM 所有這些算法的安全性都基于密鑰的安全性;而不是基于算法的細(xì)

22、節(jié)的安全性。這就意味著算法可以公開,也可以被分析,可以大量生產(chǎn)使用算法的產(chǎn)品,即使偷聽者知道你的算法也沒有關(guān)系;如果他不知道你使用的具體密鑰,他就不可能閱讀你的消息。 密碼系統(tǒng)由算法、以及所有可能的明文、密文和密鑰組成的。 基于密鑰的算法通常有兩類:對稱算法和公開密鑰算法。下面將分別介紹: 對稱密碼算法 對稱算法有時(shí)又叫傳統(tǒng)密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數(shù)對稱算法中,加/解密密鑰是相同的。這些算法也叫秘密密鑰算法或單密鑰算法,它要求發(fā)送者和接收者在安全通信之前,商定一個(gè)密鑰。對稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都能對消息進(jìn)行加

23、/解密。只要通信需要保密,密鑰就必須保密。 對稱算法的加密和解密表示為: EK(M)C DK(C)M 對稱算法可分為兩類。一次只對明文中的單個(gè)比特(有時(shí)對字節(jié))運(yùn)算的算法稱為序列算法或序列密碼。另一類算法是對明文的一組比特亞行運(yùn)算,這些比特組稱為分組,相應(yīng)的算法稱為分組算法或分組密碼?,F(xiàn)代計(jì)算機(jī)密碼算法的典型分組長度為64比特??這個(gè)長度大到足以防止分析破譯,但又小到足以方便使用(在計(jì)算機(jī)出現(xiàn)前,算法普遍地每次只對明文的一個(gè)字符運(yùn)算,可認(rèn)為是序列密碼對字符序列的運(yùn)算)。 公開密碼算法 公開密鑰算法(也叫非對稱算法)是這樣設(shè)計(jì)的:用作加密的密鑰不同于用作解密的密鑰,而且解

24、密密鑰不能根據(jù)加密密鑰計(jì)算出來(至少在合理假定的長時(shí)間內(nèi))。之所以叫做公開密鑰算法,是因?yàn)榧用苊荑€能夠公開,即陌生者能用加密密鑰加密信息,但只有用相應(yīng)的解密密鑰才能解密信息。在這些系統(tǒng)中,加密密鑰叫做公開密鑰(簡稱公鑰),解密密鑰叫做私人密鑰(簡稱私鑰)。私人密鑰有時(shí)也叫秘密密鑰。為了避免與對稱算法混淆,此處不用秘密密鑰這個(gè)名字。 用公開密鑰K加密表示為 EKMC. 雖然公開密鑰和私人密鑰是不同的,但用相應(yīng)的私人密鑰解密可表示為: DKCM 有時(shí)消息用私人密鑰加密而用公開密鑰解密,這用于數(shù)字簽名(后面將詳細(xì)介紹),盡管可能產(chǎn)生混淆,但這些運(yùn)算可分別表示為: EKMC DK

25、CM 當(dāng)前的公開密碼算法的速度,比起對稱密碼算法,要慢的多,這使得公開密碼算法在大數(shù)據(jù)量的加密中應(yīng)用有限。 單向散列函數(shù) 單向散列函數(shù) HM 作用于一個(gè)任意長度的消息 M,它返回一個(gè)固定長度的散列值 h,其中 h 的長度為 m 。 輸入為任意長度且輸出為固定長度的函數(shù)有很多種,但單向散列函數(shù)還有使其單向的其它特性: 1 給定 M ,很容易計(jì)算 h ; 2 給定 h ,根據(jù) HM h 計(jì)算 M 很難 ; 3 給定 M ,要找到另一個(gè)消息 M’ 并滿足 HM HM’ 很難。 在許多應(yīng)用中,僅有單向性是不夠的,還需要稱之為“抗碰撞”的條件: 要找出兩個(gè)隨機(jī)的消

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

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

28、用A的幫助就能驗(yàn)證A的簽名。 在實(shí)際應(yīng)用中,因?yàn)楣裁艽a算法的速度太慢,簽名者往往是對消息的散列簽名而不是對消息本身簽名。這樣做并不會降低簽名的可信性。 本章僅對密碼學(xué)進(jìn)行了一些簡要的介紹,更多的請參閱參考文獻(xiàn)[1]。 Windows 環(huán)境下 PE 文件簡介 WIN32 與 PE 基本概念 只要用過電腦的人都知道什么是 Windows,Windows95 已經(jīng)是過時(shí)的昨日黃花了,Windows98 也已推出將近四年了。2000 年又推出了Windows2000,今年又推出了 WindowsXP,微軟的操作系統(tǒng)更新速度是如此的快,以至于昨天還在使用的東西,在今天看來就已經(jīng)

29、過時(shí)了。Windows98 以后,微軟傳言不在推出 9x 內(nèi)核的操作系統(tǒng),但是2000 年下半年卻正式推出了 WindowsMillennium,簡稱 Win.Me 。然而從 WindowsXP 的推出,可以斷言,微軟不會在升級 Win9x 操作系統(tǒng)了。Windows2000 和 WindowsXP 都是基于 NT 內(nèi)核的。 所有這些操作系統(tǒng)都使用一種“可移植可執(zhí)行文件格式”(Portable Executable File Format),簡稱PE文件格式。 下面簡短介紹一下 PE 文件的一些概念。詳細(xì)內(nèi)容請參閱參考文獻(xiàn)[14]。 Windows NT 繼承了 VAX? V

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

31、植的”是因?yàn)樵谒衅脚_(如x86,Alpha,MIPS等等)上實(shí)現(xiàn)的WindowsNT 都使用相同的可執(zhí)行文件格式。當(dāng)然了,也有許多不同的東西如二進(jìn)制代碼的CPU指令。重要的是操作系統(tǒng)的裝入器和程序設(shè)計(jì)工具不需要為任何一種CPU完全重寫就能達(dá)到目的。 關(guān)于PE文件最重要的是,磁盤上的可執(zhí)行文件和它被WINDOWS載入內(nèi)存之后(PE文件載入內(nèi)存之后稱為PE映像)是非常相像的(如圖 3-1)。WINDOWS載入器不必為從磁盤上載入一個(gè)文件而辛辛苦苦創(chuàng)建一個(gè)進(jìn)程。載入器使用內(nèi)存映射文件機(jī)制把文件中相似的塊映射到虛擬空間中。構(gòu)造式的進(jìn)行分析,一個(gè)PE文件類似一個(gè)預(yù)制的屋子。它本質(zhì)上開始于這樣一個(gè)

32、空間,這個(gè)空間后面有幾個(gè)把它連到其余空間的機(jī)件(就是說,把它聯(lián)系到它的DLL上,等等)。這對PE格式的DLL式一樣容易應(yīng)用的。一旦這個(gè)模塊被載入,Windows 就可以有效的把它和其它內(nèi)存映射文件同等對待。 圖 3-1 PE文件和PE映像的布局很相似 對Win32來講,模塊所使用的所有代碼,數(shù)據(jù),資源,導(dǎo)入表,和其它需要的模塊數(shù)據(jù)結(jié)構(gòu)都在一個(gè)連續(xù)的內(nèi)存塊中。在這種形勢下,你只需要知道載入器把可執(zhí)行文件映射到了什么地方就可以了。通過作為映像的一部分的指針,你可以很容易的找到這個(gè)模塊所有不同的塊。 另一個(gè)你需要知道的概念是相對虛擬地址(RVA)。PE文件中的許多域都用術(shù)語RV

33、A來指定。一個(gè)RVA只是一些項(xiàng)目相對于文件映射到內(nèi)存的偏移。比如說,載入器把一個(gè)文件映射到虛擬地址0x10000開始的內(nèi)存塊。如果映像中一個(gè)實(shí)際的表的首址是0x10464,那么它的RVA就是0x464。 (虛擬地址 0x10464)-(基地址 0x10000)=RVA 0x00464 為了把一個(gè)RVA轉(zhuǎn)化成一個(gè)有用的指針,只需要把RVA值加到模塊的基地址上即可?;刂肥荅XE和DLL內(nèi)存映射文件的基址,這個(gè)基址在Win32中這是一個(gè)很重要的概念。為了方便起見,WindowsNT 和 Windows9x用模塊的基址作為這個(gè)模塊的實(shí)例句柄(HINSTANCE)。可以對任何DLL調(diào)用Ge

34、tModuleHandledllname得到一個(gè)指針去訪問它的組件。如果 dllname 為 NULL,則得到執(zhí)行體自己的模塊句柄。這是非常有用的,如通常編譯器產(chǎn)生的啟動代碼將取得這個(gè)句柄并將它作為一個(gè)參數(shù)hInstance傳給WinMain 。 PE首部 和其它可執(zhí)行文件格式一樣,PE文件在眾所周知的地方有一些定義文件其余部分面貌的域。首部就包含這樣象代碼和數(shù)據(jù)的位置和尺寸的地方,操作系統(tǒng)要對它進(jìn)行干預(yù),比如初始堆棧大小,和其它重要的塊的信息。和微軟其它執(zhí)行體的格式相比,PE格式的執(zhí)行體的主要的首部不是在文件的最開始。典型的PE文件最開始的數(shù)百個(gè)字節(jié)被DOS殘留部分占用。這個(gè)殘留部分

35、是一個(gè)打印如“這個(gè)程序不能在DOS下運(yùn)行!”這類信息的小程序。所以,你在一個(gè)不支持Win32的系統(tǒng)中運(yùn)行這個(gè)程序,會得到這類錯(cuò)誤信息。當(dāng)載入器把一個(gè)Win32程序映射到內(nèi)存,這個(gè)映射文件的第一個(gè)字節(jié)對應(yīng)于DOS殘留部分的第一個(gè)字節(jié),這是無疑的。于是,和你啟動的任一個(gè)基于Win32 的程序一起,都有一個(gè)基于DOS的程序連帶被載入。 和微軟的其它可執(zhí)行格式一樣,你可以通過查找它的起始偏移來得到真實(shí)首部,這個(gè)偏移放在DOS殘留首部中。WINNT.H頭文件包含了DOS殘留程序的數(shù)據(jù)結(jié)構(gòu)定義(注),使得很容易找到PE首部的起始位置。e_lfanew 域是PE真實(shí)首部的偏移。為了得到PE首部在內(nèi)存中

36、的指針,只需要把這個(gè)值加到映像的基址上即可。 // 忽略類型轉(zhuǎn)化和指針轉(zhuǎn)化 pNTHeader dosHeader + dosHeader-e_lfanew; 注:為了不失簡潔,這里未列出這些結(jié)構(gòu)體的完整定義就直接引用,這里直接引用的結(jié)構(gòu)體其定義都在winnt.h中,建議讀者在讀本章時(shí)參考Winnt.h 。 一旦你有了PE主首部的指針,游戲就可以開始了!PE主首部是一個(gè)IMAGE_NT_HEADERS的結(jié)構(gòu),在WINNT.H中定義。這個(gè)結(jié)構(gòu)由一個(gè)雙字(DWORD)和兩個(gè)子結(jié)構(gòu)組成,布局如下: DWORD Signature;// 標(biāo)志域 IMAGE_FILE_HEADER

37、 FileHeader; IMAGE_OPTIONAL_HEADER OptionalHeader; 標(biāo)志域用ASCII表示就是“PE\0\0”。 標(biāo)志域之后的是結(jié)構(gòu) IMAGE_FILE_HEADER 。這個(gè)域只包含這個(gè)文件最基本的信息。這個(gè)結(jié)構(gòu)看上去并未從它的原始COFF實(shí)現(xiàn)更改過。除了是PE首部的一部分,它還表現(xiàn)在微軟Win32編譯器生成的COFF OBJ 文件的最開始部分。 這個(gè)部分的詳細(xì)說明請參閱參考文獻(xiàn)[14](本人已翻譯為中文)。 PE文件的導(dǎo)入表 因?yàn)閷?dǎo)入表在該軟件的設(shè)計(jì)中很關(guān)鍵,后面殼程序?qū)氡淼臉?gòu)建,對客戶程序?qū)氡淼妮d入等,都牽涉到導(dǎo)入

38、表 。所以,在這里有必要說明一下,更詳細(xì)的說明請參閱參考文獻(xiàn)[14][15][16]。 導(dǎo)入表,簡單的說,導(dǎo)入表的作用相當(dāng)于 DOS 的系統(tǒng)中斷功能。兩者都是操作系統(tǒng) API 。只不過DOS中斷不需要操作系統(tǒng)在載入每個(gè)執(zhí)行體時(shí)填入 API 的實(shí)際地址,并且,導(dǎo)入表還可以導(dǎo)入除操作系統(tǒng) API 之外的其它模塊中的函數(shù)。 在一個(gè)PE文件中,當(dāng)你調(diào)用另一模塊中的一個(gè)函數(shù)時(shí)(比如在USER32.DLL中的GetMessage ),編譯器產(chǎn)生的CALL 指令并不把控制直接轉(zhuǎn)移到在DLL中的這個(gè)函數(shù)。代替的,CALL 指令把把控制轉(zhuǎn)移到一個(gè)也在 .text 中的 JMP DWORD PTR

39、[XXXXXXXX] 指令處(如圖3-2)。 這個(gè) JMP 指令通過一個(gè)在導(dǎo)入表中的DWORD變量間接的轉(zhuǎn)移控制。 導(dǎo)入表的這個(gè)DWORD包含操作系統(tǒng)函數(shù)入口的實(shí)際地址。為什么DLL調(diào)用用這種方式來實(shí)現(xiàn)呢?原來,通過一個(gè)位置傳送所有的對一個(gè)給定的DLL函數(shù)的調(diào)用,載入器不需要改變每個(gè)調(diào)用DLL的指令。所有的PE載入器必須做的是把目標(biāo)函數(shù)的正確地址放到導(dǎo)入表的一個(gè) DWORD 中。不需要改變?nèi)魏蝐all指令本身。 如果你想通過函數(shù)指針調(diào)用一個(gè)函數(shù),事情也會如你所預(yù)料的一樣。但是,如果你想讀取 GetMessage 開始的字節(jié),你將不能如愿。后面講到反 API 斷點(diǎn)時(shí)會詳細(xì)說明。 圖

40、3-2 一個(gè)導(dǎo)入函數(shù)調(diào)用的圖示 前面描述了函數(shù)調(diào)用怎樣到一個(gè)外部DLL中而不直接調(diào)用這個(gè)DLL 。代替的,在執(zhí)行體中的 .text 塊中(如果你用Borland C++ 就是 .icode 塊),CALL指令到達(dá)一個(gè) JMP DWORD PTR [XXXXXXXX] 指令處。 JMP指令尋找的地址把控制轉(zhuǎn)移到實(shí)際的目標(biāo)地址。PE文件的導(dǎo)入表會包含一些必要的信息,這些信息是載入器用來確定目標(biāo)函數(shù)的地址以及在執(zhí)行體映像中修正他們的。 導(dǎo)入表開始于一個(gè)IMAGE_IMPORT_DESCRIPTOR數(shù)組。每個(gè)DLL都有一個(gè)PE文件隱含鏈接上的IMAGE_IMPORT_DESC

41、RIPTOR 。沒有指定這個(gè)數(shù)組中結(jié)構(gòu)的數(shù)目的域。代替的,這個(gè)數(shù)組的最后一個(gè)元素是一個(gè)全NULL的IMAGE_IMPORT_DESCRIPTOR 。IMAGE_IMPORT_DESCRIPTOR的格式顯示在表3-1 。 表 3-1 IMAGE_IMPORT_DESCRIPTOR 的格式 DWORD Characteristics 在一個(gè)時(shí)刻,這可能已是一個(gè)標(biāo)志集。然而,微軟改變了它的涵義并不再糊涂地升級WINNT.H 。這個(gè)域?qū)嶋H上是一個(gè)指向指針數(shù)組的偏移(RVA)。其中每個(gè)指針都指向一個(gè)IMAGE_IMPORT_BY_NAME結(jié)構(gòu)。現(xiàn)在這個(gè)域的涵義是 OriginalFirstTh

42、unk 。 DWORD TimeDateStamp 表示這個(gè)文件的創(chuàng)建時(shí)間。 DWORD ForwarderChain 這個(gè)域聯(lián)系到前向鏈。前向鏈包括一個(gè)DLL函數(shù)向另一個(gè)DLL轉(zhuǎn)送引用。比如,在WindowsNT中,NTDLL.DLL就出現(xiàn)了的一些前向的它向KERNEL32.DLL導(dǎo)出的函數(shù)。應(yīng)用程序可能以為它調(diào)用的是NTDLL.DLL中的函數(shù),但它最終調(diào)用的是KERNEL32.DLL中的函數(shù)。這個(gè)域還包含一個(gè)FirstThunk數(shù)組的索引(即刻描述)。用這個(gè)域索引的函數(shù)會前向引用到另一個(gè)DLL 。不幸的是,函數(shù)怎樣前向引用的格式?jīng)]有文檔,并且前向函數(shù)的例子也很難找。

43、 DWORD Name 這是導(dǎo)入DLL的名字,指向以NULL結(jié)尾的ASCII字符串。通用例子是KERNEL32.DLL和USER32.DLL 。 PIMAGE_THUNK_DATA FirstThunk 這個(gè)域是指向IMAGE_THUNK_DATA聯(lián)合的偏移(RVA)。幾乎在任何情況下,這個(gè)域都解釋為一個(gè)指向的IMAGE_IMPORT_BY_NAME結(jié)構(gòu)的指針。如果這個(gè)域不是這些指針中的一個(gè),那它就被當(dāng)作一個(gè)將從這個(gè)被導(dǎo)入的DLL的導(dǎo)出序數(shù)值。如果你實(shí)際上可以從序數(shù)導(dǎo)入一個(gè)函數(shù)而不是從名字導(dǎo)入,從文檔看,這是很含糊的。 IMAGE_IMPOR

44、T_DESCRIPTOR 的一個(gè)重要部分是導(dǎo)入的DLL的名字和兩個(gè)IMAGE_IMPORT_BY_NAME指針數(shù)組。在EXE文件中,這兩個(gè)數(shù)組(由Characteristics域和FirstThunk域指向)是相互平行的,都是以NULL指針作為數(shù)組的最后一個(gè)元素。兩個(gè)數(shù)組中的指針都指向 IMAGE_IMPORT_BY_NAME 結(jié)構(gòu)。圖 3-3 顯示了這種布局。 圖 3-3 導(dǎo)入表中一個(gè)項(xiàng)的結(jié)構(gòu)圖示 PE文件導(dǎo)入表中的每一個(gè)函數(shù)有一個(gè) IMAGE_IMPORT_BY_NAME 結(jié)構(gòu)。IMAGE_IMPORT_BY_NAME結(jié)構(gòu)非常簡單,看上去是這樣: WORD Hint;

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

46、向IMAGE_IMPORT_BY_NAME結(jié)構(gòu)的指針。 JMP DWORD PTR [XXXXXXXX] 中的 [XXXXXXXX] 指向 FirstThunk 數(shù)組的一個(gè)條目。因?yàn)橛奢d入器覆蓋的這個(gè)指針數(shù)組實(shí)際上保持所有導(dǎo)入函數(shù)的地址,叫做“導(dǎo)入地址表”。 在優(yōu)化上無止境的探索中,微軟在WindowsNT中“優(yōu)化”了系統(tǒng)DLL(KERNEL32.DLL等等)的thunk數(shù)組。在這個(gè)優(yōu)化中,這個(gè)數(shù)組中的指針不再指向IMAGE_IMPORT_BY_NAME結(jié)構(gòu),它們已經(jīng)包含了導(dǎo)入函數(shù)的地址。換句話說,載入器不需要去查找函數(shù)的地址并用導(dǎo)入函數(shù)的地址覆蓋thunk數(shù)組(譯注)。 譯注:

47、這就是 Bound Import,關(guān)于Bound Import,參考文獻(xiàn)[15][16],有詳細(xì)介紹。不過,在我的軟件中,忽略了對Bound Import 的處理,這樣會造成一些程序載入速度的減小。但使問題簡化了許多。 因?yàn)閷?dǎo)入地址表在一個(gè)可寫的塊中,攔截一個(gè)EXE或DLL對另一個(gè)DLL的調(diào)用就相對容易。只需要修改適當(dāng)?shù)貙?dǎo)入地址條目去指向希望攔截的函數(shù)。不需要修改調(diào)用者或被調(diào)者的任何代碼。 注意微軟產(chǎn)生的PE文件的導(dǎo)入表并不是完全被連接器同步的,這一點(diǎn)很有趣。所有對另一個(gè)DLL中的函數(shù)的調(diào)用的指令都在一個(gè)導(dǎo)入庫中。當(dāng)你連接一個(gè)DLL時(shí),庫管理器(LIB32.EXE或LIB.EXE)

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

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

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

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

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

53、法相當(dāng)不好設(shè)計(jì)。 于是有人考慮到以下的算法: ? F1(用戶名稱) F2(序列號) F1、F2是兩種完全不同的的算法,但用戶名通過F1算法計(jì)算出的特征字等于序列號通過F2算法計(jì)算出的特征字,這種算法在設(shè)計(jì)上比較簡單,保密性相對以上兩種算法也要好的多。如果能夠把F1、F2算法設(shè)計(jì)成不可逆算法的話,保密性相當(dāng)?shù)暮?可一旦解密者找到其中之一的反算法的話,這種算法就不安全了。一元算法的設(shè)計(jì)看來再如何努力也很難有太大的突破,那么二元呢? 特定值 F(用戶名,序列號) 這個(gè)算法看上去相當(dāng)不錯(cuò),用戶名稱與序列號之間的關(guān)系不再那么清晰了,但同時(shí)也失去了用戶名于序列號

54、的一一對應(yīng)關(guān)系,軟件開發(fā)者必須自己維護(hù)用戶名稱與序列號之間的唯一性,但這似乎不是難以辦到的事,建個(gè)數(shù)據(jù)庫就可以了。當(dāng)然也可以把用戶名稱和序列號分為幾個(gè)部分來構(gòu)造多元的算法。 特定值 F(用戶名1,用戶名2,序列號1,序列號2) 現(xiàn)有的序列號加密算法大多是軟件開發(fā)者自行設(shè)計(jì)的,大部分相當(dāng)簡單。而且有些算法作者雖然下了很大的功夫,效果卻往往得不到它所希望的結(jié)果。 時(shí)間限制 有些程序的試用版每次運(yùn)行都有時(shí)間限制,例如運(yùn)行10分鐘或20分鐘就停止工作,必須重新運(yùn)行該程序才能正常工作。這些程序里面自然有個(gè)定時(shí)器來統(tǒng)計(jì)程序運(yùn)行的時(shí)間。 這種方法使用的較少。 Key Fil

55、e 保護(hù) Key File(注冊文件)是一種利用文件來注冊軟件的保護(hù)方式。Key File一般是一個(gè)小文件,可以是純文本文件,也可以是包含不可顯示字符的二進(jìn)制文件,其內(nèi)容是一些加密過或未加密的數(shù)據(jù),其中可能有用戶名、注冊碼等信息。文件格式則由軟件作者自己定義。試用版軟件沒有注冊文件,當(dāng)用戶向作者付費(fèi)注冊之后,會收到作者寄來的注冊文件,其中可能包含用戶的個(gè)人信息。用戶只要將該文件放入指定的目錄,就可以讓軟件成為正式版。該文件一般是放在軟件的安裝目錄中或系統(tǒng)目錄下。軟件每次啟動時(shí),從該文件中讀取數(shù)據(jù),然后利用某種算法進(jìn)行處理,根據(jù)處理的結(jié)果判斷是否為正確的注冊文件,如果正確則以注冊版模式來運(yùn)

56、行。 這種保護(hù)方法使用也不多,但是,我個(gè)人認(rèn)為,比時(shí)間限制要好。 CD-check 即光盤保護(hù)技術(shù)。程序在啟動時(shí)判斷光驅(qū)中的光盤上是否存在特定的文件,如果不存在則認(rèn)為用戶沒有正版光盤,拒絕運(yùn)行。在程序運(yùn)行的過程當(dāng)中一般不再檢查光盤的存在與否。Windows下的具體實(shí)現(xiàn)一般是這樣的:先用GetLogicalDriveStrings 或GetLogicalDrives 得到系統(tǒng)中安裝的所有驅(qū)動器的列表,然后再用GetDriveType 檢查每一個(gè)驅(qū)動器,如果是光驅(qū)則用CreateFileA 或FindFirstFileA 等函數(shù)檢查特定的文件存在與否,并可能進(jìn)一步地檢查文件的屬性、大

57、小、內(nèi)容等。 反跟蹤技術(shù)(Anti-Debug) 好的軟件保護(hù)都要和反跟蹤技術(shù)結(jié)合在一起。如果沒有反跟蹤技術(shù),軟件等于直接裸露在 Cracker 面前。這里說的反跟蹤,指的是反動態(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)存,就認(rèn)為被跟蹤,從而拒絕執(zhí)行,或進(jìn)行一些懲罰性措施 。還有一些檢測方法,如

58、假設(shè)這些調(diào)試器在內(nèi)存中,軟件和這些調(diào)試器通信,如果結(jié)果合乎這些調(diào)試器的輸出 。就認(rèn)為被跟蹤 ?;蛘咴趦?nèi)存中搜尋這些調(diào)試器的特征串,如果找到,就認(rèn)為被跟蹤 。有的甚至用中斷鉤子、SEH(Structural Exception Handle,即結(jié)構(gòu)化異常處理)檢測調(diào)試器。 反-反匯編技術(shù)(Anti- Disassmbly) 即 Anti-Disassmbly ??舍槍iT的反匯編軟件設(shè)計(jì)的“陷阱”,讓反匯編器陷入死循環(huán),但這種方法沒有通用性。 一般是使用花指令 。這種方法有通用性,即所有的反匯編器都可以用這種方法來抵擋 。這種方法主要是利用不同的機(jī)器指令包含的字節(jié)數(shù)并不相同,有的是

59、單字節(jié)指令,有的是多字節(jié)指令。對于多字節(jié)指令來說,反匯編軟件需要確定指令的第一個(gè)字節(jié)的起始位置,也就是操作碼的位置,這樣才能正確地反匯編這條指令,否則它就可能反匯編成另外一條指令了。并且,多字節(jié),指令長度不定,使得反匯編器在錯(cuò)誤譯碼一條指令后,接下來的許多條指令都會被錯(cuò)誤譯碼 。所以,這種方法是很有效的 。 實(shí)施方法:在程序中加入一些無用的字節(jié)來干擾反匯編軟件的判斷,從而使得它錯(cuò)誤地確定指令的起始位置,那么也就達(dá)到了干擾反匯編器工作的目的。一般形式如下: . jmp L1 dd012344578h ;這里是一些隨機(jī)數(shù),用來干擾反匯編器 ;對指令的譯碼 L1: 軟

60、件狗 軟件狗是一種智能型加密工具。它是一個(gè)安裝在并口、串口等接口上的硬件電路,同時(shí)有一套使用于各種語言的接口軟件和工具軟件。當(dāng)被狗保護(hù)的軟件運(yùn)行時(shí),程序向插在計(jì)算機(jī)上的軟件狗發(fā)出查詢命令,軟件狗迅速計(jì)算查詢并給出響應(yīng),正確的響應(yīng)保證軟件繼續(xù)運(yùn)行。如果沒有軟件狗,程序?qū)⒉荒苓\(yùn)行,復(fù)雜的軟硬件技術(shù)結(jié)合在一起防止軟件盜版。真正有商業(yè)價(jià)值得軟件一般都用軟件狗來保護(hù)。 平時(shí)常見的狗主要有“洋狗”(國外狗)和“土狗”(國產(chǎn)狗)。這里“洋狗”主要指美國的彩虹和以色列的HASP,“土狗”主要有金天地(現(xiàn)在與美國彩虹合資,叫“彩虹天地”)、深思、尖石??偟恼f來,“洋狗”在軟件接口、加殼、反跟蹤等“軟

61、”方面沒有“土狗”好,但在硬件上絕對無法破解(應(yīng)當(dāng)說破解難度非常大);而“土狗”在軟的方面做的很好,但在硬件上不如“洋狗”,稍有單片機(jī)功力的人,都可以復(fù)制。 Vbox 保護(hù)技術(shù) Vbox 是一個(gè)軟件 。它是用來保護(hù)其它軟件的 。凡被 Vbox 保護(hù)的軟件,一旦過了試用期,就不能再使用了,刪了重裝也沒用,除非刪除整個(gè)操作系統(tǒng)再重裝。 SalesAgent 保護(hù)技術(shù) SalesAgent 保護(hù)的軟件一般具有 x 天試用再購買的接口,是一種時(shí)間限制保護(hù)方式。才用這種保護(hù)方式的軟件主要有 Macromedia Flash 4 、DreameWaver 等等。 SecuROM 保護(hù)技術(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(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)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!