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

歡迎來(lái)到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁(yè) 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

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

  • 資源ID:30687125       資源大小:63.50KB        全文頁(yè)數(shù):29頁(yè)
  • 資源格式: DOC        下載積分:15積分
快捷下載 游客一鍵下載
會(huì)員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺(tái)登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要15積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號(hào),方便查詢和重復(fù)下載(系統(tǒng)自動(dòng)生成)
支付方式: 支付寶    微信支付   
驗(yàn)證碼:   換一換

 
賬號(hào):
密碼:
驗(yàn)證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開,此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁(yè)到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無(wú)水印,預(yù)覽文檔經(jīng)過(guò)壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說(shuō)明有答案則都視為沒有答案,請(qǐng)知曉。

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

軟件加密技術(shù)及實(shí)現(xiàn)雷 鵬( 桂林電子工業(yè)學(xué)院 計(jì)算機(jī)系 ) 摘 要 當(dāng)今盜版軟件的泛濫成災(zāi)幾乎已經(jīng)成為了我們中國(guó)民族軟件的災(zāi)難,為了防止軟件的非法復(fù)制、盜版,保護(hù)軟件開發(fā)商的利益,就必須對(duì)軟件進(jìn)行加密保護(hù)?,F(xiàn)在市面上有許多反盜版軟件,但這類軟件多是單機(jī)處理,并且只使用簡(jiǎn)單的加密手段,很容易被解密者破解。 本文描述了一個(gè)通過(guò)Internet,集加密和電子注冊(cè)于一身的完善的軟件保護(hù)方案。該方案基于多種密碼學(xué)意義上可靠的算法,如對(duì)稱加密算法,散列算法,數(shù)字簽名,密鑰交換等等。通過(guò)對(duì)Windows下PE可執(zhí)行文件的結(jié)構(gòu)及載入機(jī)制進(jìn)行深刻的剖析, 巧妙的使用這些密碼學(xué)算法及多種反破解方案對(duì)PE文件進(jìn)行加密保護(hù)。 在該方案的實(shí)現(xiàn)中,使用CryptoAPI中的數(shù)字簽名算法RSA,加密算法RC2和RC4,散列算法SHA,同時(shí)自己編寫了使用了MD5算法用于快速計(jì)算大量數(shù)據(jù)的摘要;網(wǎng)絡(luò)接口使用WinSocket;編程語(yǔ)言選用匯編語(yǔ)言和C+混合編程方式;反破解方案有檢測(cè)文件完整性、檢測(cè)代碼完整性、反跟蹤、反-反匯編、反Dump、代碼變形等等。 由于使用了可靠的密碼學(xué)算法,使軟件加密的強(qiáng)度大大提高;由于使用了Internet在線注冊(cè)方式,用戶使用也非常方便。 關(guān)鍵詞 加密 ;數(shù)字簽名 ;散列;反跟蹤 ;電子注冊(cè) Software Protection technique and its realizationLEI 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 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 This 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 Portable 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 algorithm , 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 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 algorithms 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概述12密碼學(xué)簡(jiǎn)介2.1概念32.2對(duì)稱密碼算法62.3公開密碼算法62.4單向散列函數(shù)72.5數(shù)字簽名83Windows 環(huán)境下 PE 文件簡(jiǎn)介3.1WIN32 與 PE 基本概念103.2PE首部123.3PE文件的導(dǎo)入表144當(dāng)前流行的一些軟件保護(hù)技術(shù)4.1序列號(hào)保護(hù)214.2時(shí)間限制224.3Key File 保護(hù)234.4CD-check234.5反跟蹤技術(shù)(Anti-Debug)234.6反-反匯編技術(shù)(Anti- Disassmbly)244.7軟件狗254.8Vbox 保護(hù)技術(shù)254.9SalesAgent 保護(hù)技術(shù)264.10SecuROM 保護(hù)技術(shù)264.11軟盤加密264.12將軟件與機(jī)器硬件信息結(jié)合264.13加殼275該軟件的設(shè)計(jì)思想5.1傳統(tǒng)保護(hù)的不足285.2網(wǎng)絡(luò)的流行295.3我的方案295.4該方案的可行性分析296該軟件的整體構(gòu)架、開發(fā)工具及方法6.1需求分析326.2整體框架356.3各取所長(zhǎng)(匯編與 C/C+ 各取所長(zhǎng))356.4C/C+ 與匯編語(yǔ)言混合編程時(shí)的互調(diào)協(xié)議366.5該軟件中各模塊對(duì)語(yǔ)言特性的限制及解決方法406.6C/C+ 和匯編語(yǔ)言的預(yù)編譯457該軟件的實(shí)現(xiàn)及技術(shù)細(xì)節(jié)7.1CryptoAPI 簡(jiǎn)介477.2幾個(gè)公共函數(shù)和宏497.3模塊共用的結(jié)構(gòu)體定義547.4Shield 模塊567.4.1殼程序中API和庫(kù)函數(shù)的處理597.4.2殼程序主體627.4.3加密殼程序637.4.4運(yùn)行中修改自身代碼647.4.5代碼散列校驗(yàn)647.4.6跳轉(zhuǎn)到客戶程序入口657.4.7載入并銷毀 Client 程序的 ImportTable667.4.8自毀殼程序代碼697.4.9編譯方法707.5Merge 模塊717.6Register 模塊767.7Server 模塊777.8軟件授權(quán)協(xié)議的實(shí)現(xiàn)787.9Client的代碼(數(shù)據(jù))的加密/解密流程圖示828使用說(shuō)明及演示8.1使用說(shuō)明838.2演示及效果839限制、不足與展望9.1使用該軟件的限制869.2該軟件的不足869.3對(duì)該軟件的展望8710結(jié)束語(yǔ)10.1總結(jié)9110.2致謝91參考文獻(xiàn)92概述 我引用應(yīng)用密碼學(xué)作者Bruce Schneier的話: 世界上有兩種密碼:一種是防止你的小妹妹看你的文件;另一種是防止當(dāng)局者閱讀你的文件資料。 如果把一封信鎖在保險(xiǎn)柜中,把保險(xiǎn)柜藏在紐約的某個(gè)地方,然后告訴你去看這封信。這并不是安全,而是隱藏。相反,如果把一封信鎖在保險(xiǎn)柜中,然后把保險(xiǎn)柜及其設(shè)計(jì)規(guī)范和許多同樣的保險(xiǎn)柜給你,以便你和世界上最好的開保險(xiǎn)柜的專家能夠研究鎖的裝置。而你還是無(wú)法打開保險(xiǎn)柜去讀這封信,這樣才是安全的。 意思是說(shuō),一個(gè)密碼系統(tǒng)的安全性只在于密鑰的保密性,而不在算法的保密性。 對(duì)純數(shù)據(jù)的加密的確是這樣。對(duì)于你不愿意讓他看到這些數(shù)據(jù)(數(shù)據(jù)的明文)的人,用可靠的加密算法,只要破解者不知道被加密數(shù)據(jù)的密碼,他就不可解讀這些數(shù)據(jù)。 但是,軟件的加密不同于數(shù)據(jù)的加密,它只能是“隱藏”。不管你愿意不愿意讓他(合法用戶,或 Cracker)看見這些數(shù)據(jù)(軟件的明文),軟件最終總要在機(jī)器上運(yùn)行,對(duì)機(jī)器,它就必須是明文。既然機(jī)器可以“看見”這些明文,那么 Cracker,通過(guò)一些技術(shù),也可以看到這些明文。 于是,從理論上,任何軟件加密技術(shù)都可以破解。只是破解的難度不同而已。有的要讓最高明的 Cracker 忙上幾個(gè)月,有的可能不費(fèi)吹灰之力,就被破解了。 所以,反盜版的任務(wù)(技術(shù)上的反盜版,而非行政上的反盜版)就是增加 Cracker 的破解難度。讓他們花費(fèi)在破解軟件上的成本,比他破解這個(gè)軟件的獲利還要高。這樣 Cracker 的破解變得毫無(wú)意義?誰(shuí)會(huì)花比正版軟件更多的錢去買盜版軟件 ? 然而,要做到“難破解”,何嘗容易? Sony 曾宣稱的超強(qiáng)反盜版(Key 2 Audio音樂(lè) CD反盜版),使用了很尖端的技術(shù),然而最近卻被一枝記號(hào)筆破解了,成為人們的飯后笑料! 所以,很多看上去很好的技術(shù),可能在 Cracker 面前的確不堪一擊。就像馬其諾防線一樣,Cracker 不從你的防線入手,而是“繞道”。這樣,讓你的反盜版技術(shù)在你做夢(mèng)也想不到的地方被 Crack 了。 為什么會(huì)這樣呢 ?歸根到底是因?yàn)檐浖跈C(jī)器上運(yùn)行,并且軟件和機(jī)器是分離的?這一點(diǎn)是關(guān)鍵,如果軟件和硬件完全綁定,不能分離,是可以做到象 IDEA 之類幾乎不可破解的系統(tǒng)的。這將在后面談傳統(tǒng)軟件保護(hù)技術(shù)時(shí)詳細(xì)說(shuō)明。 對(duì)我的這個(gè)解決方案,我不能保證Crack高手在幾天之內(nèi)不能破解它,我只能說(shuō):“在這個(gè)軟件中,我盡量堵住了當(dāng)前破解者普遍使用的方法以及“我想得到”的可能的缺口?!钡俏蚁嘈?傾注了我三個(gè)月心血的反盜版軟件,決不是一個(gè)“玩具式”的反盜版軟件。密碼學(xué)簡(jiǎn)介概念1 發(fā)送者和接收者 假設(shè)發(fā)送者想發(fā)送消息給接收者,且想安全地發(fā)送信息:她想確信偷聽者不能閱讀發(fā)送的消息。2 消息和加密 消息被稱為明文。用某種方法偽裝消息以隱藏它的內(nèi)容的過(guò)程稱為加密,加了密的消息稱為密文,而把密文轉(zhuǎn)變?yōu)槊魑牡倪^(guò)程稱為解密。圖2-1表明了這個(gè)過(guò)程。圖2-1 加密和解密 明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位圖、數(shù)字化的語(yǔ)音流或數(shù)字化的視頻圖像)。至于涉及到計(jì)算機(jī),P是簡(jiǎn)單的二進(jìn)制數(shù)據(jù)。明文可被傳送或存儲(chǔ),無(wú)論在哪種情況,M指待加密的消息。 密文用C表示,它也是二進(jìn)制數(shù)據(jù),有時(shí)和M一樣大,有時(shí)稍大(通過(guò)壓縮和加密的結(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ù)出來(lái),下面的等式必須成立:D(E(M)M3 鑒別、完整性和抗抵賴 除了提供機(jī)密性外,密碼學(xué)通常有其它的作用:a 鑒別 消息的接收者應(yīng)該能夠確認(rèn)消息的來(lái)源;入侵者不可能偽裝成他人。b 完整性檢驗(yàn) 消息的接收者應(yīng)該能夠驗(yàn)證在傳送過(guò)程中消息沒有被修改;入侵者不可能用假消息代替合法消息。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)常變換的用戶組織不能使用它們,因?yàn)槊坑幸粋€(gè)用戶離開這個(gè)組織,其它的用戶就必須改換另外不同的算法。如果有人無(wú)意暴露了這個(gè)秘密,所有人都必須改變他們的算法。 更糟的是,受限制的密碼算法不可能進(jìn)行質(zhì)量控制或標(biāo)準(zhǔn)化。每個(gè)用戶組織必須有他們自己的唯一算法。這樣的組織不可能采用流行的硬件或軟件產(chǎn)品。但竊聽者卻可以買到這些流行產(chǎn)品并學(xué)習(xí)算法,于是用戶不得不自己編寫算法并予以實(shí)現(xiàn),如果這個(gè)組織中沒有好的密碼學(xué)家,那么他們就無(wú)法知道他們是否擁有安全的算法。 盡管有這些主要缺陷,受限制的算法對(duì)低密級(jí)的應(yīng)用來(lái)說(shuō)還是很流行的,用戶或者沒有認(rèn)識(shí)到或者不在乎他們系統(tǒng)中內(nèi)在的問(wèn)題。 現(xiàn)代密碼學(xué)用密鑰解決了這個(gè)問(wèn)題,密鑰用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),也就是說(shuō)加密密鑰K1與相應(yīng)的解密密鑰K2不同,在這種情況下:EK1MCDK2CMDK2 EK1MM 所有這些算法的安全性都基于密鑰的安全性;而不是基于算法的細(xì)節(jié)的安全性。這就意味著算法可以公開,也可以被分析,可以大量生產(chǎn)使用算法的產(chǎn)品,即使偷聽者知道你的算法也沒有關(guān)系;如果他不知道你使用的具體密鑰,他就不可能閱讀你的消息。密碼系統(tǒng)由算法、以及所有可能的明文、密文和密鑰組成的。 基于密鑰的算法通常有兩類:對(duì)稱算法和公開密鑰算法。下面將分別介紹:對(duì)稱密碼算法 對(duì)稱算法有時(shí)又叫傳統(tǒng)密碼算法,就是加密密鑰能夠從解密密鑰中推算出來(lái),反過(guò)來(lái)也成立。在大多數(shù)對(duì)稱算法中,加/解密密鑰是相同的。這些算法也叫秘密密鑰算法或單密鑰算法,它要求發(fā)送者和接收者在安全通信之前,商定一個(gè)密鑰。對(duì)稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都能對(duì)消息進(jìn)行加/解密。只要通信需要保密,密鑰就必須保密。 對(duì)稱算法的加密和解密表示為:EK(M)CDK(C)M 對(duì)稱算法可分為兩類。一次只對(duì)明文中的單個(gè)比特(有時(shí)對(duì)字節(jié))運(yùn)算的算法稱為序列算法或序列密碼。另一類算法是對(duì)明文的一組比特亞行運(yùn)算,這些比特組稱為分組,相應(yīng)的算法稱為分組算法或分組密碼?,F(xiàn)代計(jì)算機(jī)密碼算法的典型分組長(zhǎng)度為64比特?這個(gè)長(zhǎng)度大到足以防止分析破譯,但又小到足以方便使用(在計(jì)算機(jī)出現(xiàn)前,算法普遍地每次只對(duì)明文的一個(gè)字符運(yùn)算,可認(rèn)為是序列密碼對(duì)字符序列的運(yùn)算)。公開密碼算法 公開密鑰算法(也叫非對(duì)稱算法)是這樣設(shè)計(jì)的:用作加密的密鑰不同于用作解密的密鑰,而且解密密鑰不能根據(jù)加密密鑰計(jì)算出來(lái)(至少在合理假定的長(zhǎng)時(shí)間內(nèi))。之所以叫做公開密鑰算法,是因?yàn)榧用苊荑€能夠公開,即陌生者能用加密密鑰加密信息,但只有用相應(yīng)的解密密鑰才能解密信息。在這些系統(tǒng)中,加密密鑰叫做公開密鑰(簡(jiǎn)稱公鑰),解密密鑰叫做私人密鑰(簡(jiǎn)稱私鑰)。私人密鑰有時(shí)也叫秘密密鑰。為了避免與對(duì)稱算法混淆,此處不用秘密密鑰這個(gè)名字。 用公開密鑰K加密表示為EKMC. 雖然公開密鑰和私人密鑰是不同的,但用相應(yīng)的私人密鑰解密可表示為:DKCM 有時(shí)消息用私人密鑰加密而用公開密鑰解密,這用于數(shù)字簽名(后面將詳細(xì)介紹),盡管可能產(chǎn)生混淆,但這些運(yùn)算可分別表示為:EKMCDKCM 當(dāng)前的公開密碼算法的速度,比起對(duì)稱密碼算法,要慢的多,這使得公開密碼算法在大數(shù)據(jù)量的加密中應(yīng)用有限。單向散列函數(shù) 單向散列函數(shù) HM 作用于一個(gè)任意長(zhǎng)度的消息 M,它返回一個(gè)固定長(zhǎng)度的散列值 h,其中 h 的長(zhǎng)度為 m 。 輸入為任意長(zhǎng)度且輸出為固定長(zhǎng)度的函數(shù)有很多種,但單向散列函數(shù)還有使其單向的其它特性:1 給定 M ,很容易計(jì)算 h ;2 給定 h ,根據(jù) HM h 計(jì)算 M 很難 ;3 給定 M ,要找到另一個(gè)消息 M 并滿足 HM HM 很難。在許多應(yīng)用中,僅有單向性是不夠的,還需要稱之為“抗碰撞”的條件: 要找出兩個(gè)隨機(jī)的消息 M 和 M,使 HM HM 滿足很難。 由于散列函數(shù)的這些特性,由于公開密碼算法的計(jì)算速度往往很慢,所以,在一些密碼協(xié)議中,它可以作為一個(gè)消息 M 的摘要,代替原始消息 M,讓發(fā)送者為 HM 簽名而不是對(duì) M 簽名 。 如 SHA 散列算法用于數(shù)字簽名協(xié)議 DSA中。數(shù)字簽名 提到數(shù)字簽名就離不開公開密碼系統(tǒng)和散列技術(shù)。 有幾種公鑰算法能用作數(shù)字簽名。在一些算法中,例如RSA,公鑰或者私鑰都可用作加密。用你的私鑰加密文件,你就擁有安全的數(shù)字簽名。在其它情況下,如DSA,算法便區(qū)分開來(lái)了數(shù)字簽名算法不能用于加密。這種思想首先由Diffie和Hellman提出 。 基本協(xié)議是簡(jiǎn)單的 : 1 A 用她的私鑰對(duì)文件加密,從而對(duì)文件簽名。 2 A 將簽名的文件傳給B。 3 B用A的公鑰解密文件,從而驗(yàn)證簽名。 這個(gè)協(xié)議中,只需要證明A的公鑰的確是她的。如果B不能完成第(3)步,那么他知道簽名是無(wú)效的。 這個(gè)協(xié)議也滿足以下特征:1 簽名是可信的。當(dāng)B用A的公鑰驗(yàn)證信息時(shí),他知道是由A簽名的。2 簽名是不可偽造的。只有A知道她的私鑰。3 簽名是不可重用的。簽名是文件的函數(shù),并且不可能轉(zhuǎn)換成另外的文件。4 被簽名的文件是不可改變的。如果文件有任何改變,文件就不可能用A的公鑰驗(yàn)證。5 簽名是不可抵賴的。B不用A的幫助就能驗(yàn)證A的簽名。 在實(shí)際應(yīng)用中,因?yàn)楣裁艽a算法的速度太慢,簽名者往往是對(duì)消息的散列簽名而不是對(duì)消息本身簽名。這樣做并不會(huì)降低簽名的可信性。 本章僅對(duì)密碼學(xué)進(jìn)行了一些簡(jiǎn)要的介紹,更多的請(qǐng)參閱參考文獻(xiàn)1。Windows 環(huán)境下 PE 文件簡(jiǎn)介WIN32 與 PE 基本概念 只要用過(guò)電腦的人都知道什么是 Windows,Windows95 已經(jīng)是過(guò)時(shí)的昨日黃花了,Windows98 也已推出將近四年了。2000 年又推出了Windows2000,今年又推出了 WindowsXP,微軟的操作系統(tǒng)更新速度是如此的快,以至于昨天還在使用的東西,在今天看來(lái)就已經(jīng)過(guò)時(shí)了。Windows98 以后,微軟傳言不在推出 9x 內(nèi)核的操作系統(tǒng),但是2000 年下半年卻正式推出了 WindowsMillennium,簡(jiǎn)稱 Win.Me 。然而從 WindowsXP 的推出,可以斷言,微軟不會(huì)在升級(jí) Win9x 操作系統(tǒng)了。Windows2000 和 WindowsXP 都是基于 NT 內(nèi)核的。 所有這些操作系統(tǒng)都使用一種“可移植可執(zhí)行文件格式”(Portable Executable File Format),簡(jiǎn)稱PE文件格式。 下面簡(jiǎn)短介紹一下 PE 文件的一些概念。詳細(xì)內(nèi)容請(qǐng)參閱參考文獻(xiàn)14。 Windows NT 繼承了 VAX? VMS? 和 UNIX? 的傳統(tǒng)。許多 Windows NT 的創(chuàng)始人在進(jìn)入微軟前都在這些平臺(tái)上進(jìn)行設(shè)計(jì)和編碼。當(dāng)他們開始設(shè)計(jì) Windows NT 時(shí),很自然的,為了最小化工程的啟動(dòng)時(shí)間,他們會(huì)使用以前寫好的并且已經(jīng)測(cè)試過(guò)的工具。用這些工具生成并且工作的可執(zhí)行文件和 OBJ 文件格式叫做 COFF(Common Object File Format 的首字母縮寫)。COFF 的年齡不超過(guò)八年。 COFF 本身是一個(gè)很好的起點(diǎn),但是需要擴(kuò)展到一個(gè)現(xiàn)代操作系統(tǒng)如 Windows 95 和 Windows NT 就要進(jìn)行一些更新。其結(jié)果就是產(chǎn)生了(PE格式)可移植可執(zhí)行文件格式。它被稱為“可移植的”是因?yàn)樵谒衅脚_(tái)(如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è)空間,這個(gè)空間后面有幾個(gè)把它連到其余空間的機(jī)件(就是說(shuō),把它聯(lián)系到它的DLL上,等等)。這對(duì)PE格式的DLL式一樣容易應(yīng)用的。一旦這個(gè)模塊被載入,Windows 就可以有效的把它和其它內(nèi)存映射文件同等對(duì)待。圖 3-1 PE文件和PE映像的布局很相似 對(duì)Win32來(lái)講,模塊所使用的所有代碼,數(shù)據(jù),資源,導(dǎo)入表,和其它需要的模塊數(shù)據(jù)結(jié)構(gòu)都在一個(gè)連續(xù)的內(nèi)存塊中。在這種形勢(shì)下,你只需要知道載入器把可執(zhí)行文件映射到了什么地方就可以了。通過(guò)作為映像的一部分的指針,你可以很容易的找到這個(gè)模塊所有不同的塊。 另一個(gè)你需要知道的概念是相對(duì)虛擬地址(RVA)。PE文件中的許多域都用術(shù)語(yǔ)RVA來(lái)指定。一個(gè)RVA只是一些項(xiàng)目相對(duì)于文件映射到內(nèi)存的偏移。比如說(shuō),載入器把一個(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)??梢詫?duì)任何DLL調(diào)用GetModuleHandledllname得到一個(gè)指針去訪問(wèn)它的組件。如果 dllname 為 NULL,則得到執(zhí)行體自己的模塊句柄。這是非常有用的,如通常編譯器產(chǎn)生的啟動(dòng)代碼將取得這個(gè)句柄并將它作為一個(gè)參數(shù)hInstance傳給WinMain 。PE首部 和其它可執(zhí)行文件格式一樣,PE文件在眾所周知的地方有一些定義文件其余部分面貌的域。首部就包含這樣象代碼和數(shù)據(jù)的位置和尺寸的地方,操作系統(tǒng)要對(duì)它進(jìn)行干預(yù),比如初始堆棧大小,和其它重要的塊的信息。和微軟其它執(zhí)行體的格式相比,PE格式的執(zhí)行體的主要的首部不是在文件的最開始。典型的PE文件最開始的數(shù)百個(gè)字節(jié)被DOS殘留部分占用。這個(gè)殘留部分是一個(gè)打印如“這個(gè)程序不能在DOS下運(yùn)行!”這類信息的小程序。所以,你在一個(gè)不支持Win32的系統(tǒng)中運(yùn)行這個(gè)程序,會(huì)得到這類錯(cuò)誤信息。當(dāng)載入器把一個(gè)Win32程序映射到內(nèi)存,這個(gè)映射文件的第一個(gè)字節(jié)對(duì)應(yīng)于DOS殘留部分的第一個(gè)字節(jié),這是無(wú)疑的。于是,和你啟動(dòng)的任一個(gè)基于Win32 的程序一起,都有一個(gè)基于DOS的程序連帶被載入。 和微軟的其它可執(zhí)行格式一樣,你可以通過(guò)查找它的起始偏移來(lái)得到真實(shí)首部,這個(gè)偏移放在DOS殘留首部中。WINNT.H頭文件包含了DOS殘留程序的數(shù)據(jù)結(jié)構(gòu)定義(注),使得很容易找到PE首部的起始位置。e_lfanew 域是PE真實(shí)首部的偏移。為了得到PE首部在內(nèi)存中的指針,只需要把這個(gè)值加到映像的基址上即可。/ 忽略類型轉(zhuǎn)化和指針轉(zhuǎn)化pNTHeader dosHeader + dosHeader-e_lfanew; 注:為了不失簡(jiǎn)潔,這里未列出這些結(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 FileHeader;IMAGE_OPTIONAL_HEADER OptionalHeader; 標(biāo)志域用ASCII表示就是“PE00”。 標(biāo)志域之后的是結(jié)構(gòu) IMAGE_FILE_HEADER 。這個(gè)域只包含這個(gè)文件最基本的信息。這個(gè)結(jié)構(gòu)看上去并未從它的原始COFF實(shí)現(xiàn)更改過(guò)。除了是PE首部的一部分,它還表現(xiàn)在微軟Win32編譯器生成的COFF OBJ 文件的最開始部分。 這個(gè)部分的詳細(xì)說(shuō)明請(qǐng)參閱參考文獻(xiàn)14(本人已翻譯為中文)。 PE文件的導(dǎo)入表 因?yàn)閷?dǎo)入表在該軟件的設(shè)計(jì)中很關(guān)鍵,后面殼程序?qū)氡淼臉?gòu)建,對(duì)客戶程序?qū)氡淼妮d入等,都牽涉到導(dǎo)入表 。所以,在這里有必要說(shuō)明一下,更詳細(xì)的說(shuō)明請(qǐng)參閱參考文獻(xiàn)141516。 導(dǎo)入表,簡(jiǎn)單的說(shuō),導(dǎo)入表的作用相當(dāng)于 DOS 的系統(tǒng)中斷功能。兩者都是操作系統(tǒng) API 。只不過(guò)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 XXXXXXXX指令處(如圖3-2)。 這個(gè) JMP 指令通過(guò)一個(gè)在導(dǎo)入表中的DWORD變量間接的轉(zhuǎn)移控制。 導(dǎo)入表的這個(gè)DWORD包含操作系統(tǒng)函數(shù)入口的實(shí)際地址。為什么DLL調(diào)用用這種方式來(lái)實(shí)現(xiàn)呢?原來(lái),通過(guò)一個(gè)位置傳送所有的對(duì)一個(gè)給定的DLL函數(shù)的調(diào)用,載入器不需要改變每個(gè)調(diào)用DLL的指令。所有的PE載入器必須做的是把目標(biāo)函數(shù)的正確地址放到導(dǎo)入表的一個(gè) DWORD 中。不需要改變?nèi)魏蝐all指令本身。 如果你想通過(guò)函數(shù)指針調(diào)用一個(gè)函數(shù),事情也會(huì)如你所預(yù)料的一樣。但是,如果你想讀取 GetMessage 開始的字節(jié),你將不能如愿。后面講到反 API 斷點(diǎn)時(shí)會(huì)詳細(xì)說(shuō)明。 圖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)入表會(huì)包含一些必要的信息,這些信息是載入器用來(lái)確定目標(biāo)函數(shù)的地址以及在執(zhí)行體映像中修正他們的。 導(dǎo)入表開始于一個(gè)IMAGE_IMPORT_DESCRIPTOR數(shù)組。每個(gè)DLL都有一個(gè)PE文件隱含鏈接上的IMAGE_IMPORT_DESCRIPTOR 。沒有指定這個(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)志集。然而,微軟改變了它的涵義并不再糊涂地升級(jí)WINNT.H 。這個(gè)域?qū)嶋H上是一個(gè)指向指針數(shù)組的偏移(RVA)。其中每個(gè)指針都指向一個(gè)IMAGE_IMPORT_BY_NAME結(jié)構(gòu)?,F(xiàn)在這個(gè)域的涵義是 OriginalFirstThunk 。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ù)會(huì)前向引用到另一個(gè)DLL 。不幸的是,函數(shù)怎樣前向引用的格式?jīng)]有文檔,并且前向函數(shù)的例子也很難找。 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_IMPORT_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)非常簡(jiǎn)單,看上去是這樣:WORD Hint;BYTE Name?;第一個(gè)域是導(dǎo)入函數(shù)的導(dǎo)出序數(shù)的最佳猜測(cè)值。和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ú)的留下來(lái),并不被修改。經(jīng)常被稱作提名表。第二個(gè)數(shù)組(由FirstThunk域指向的)將被PE載入器覆蓋。載入器在這個(gè)數(shù)組中迭代每個(gè)指針,并查找每個(gè)IMAGE_IMPORT_BY_NAME結(jié)構(gòu)指向的函數(shù)的地址。載入器然后用找到的函數(shù)地址覆蓋這個(gè)指向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)化上無(wú)止境的探索中,微軟在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ù)的地址。換句話說(shuō),載入器不需要去查找函數(shù)的地址并用導(dǎo)入函數(shù)的地址覆蓋thunk數(shù)組(譯注)。譯注:這就是 Bound Import,關(guān)于Bound Import,參考文獻(xiàn)1516,有詳細(xì)介紹。不過(guò),在我的軟件中,忽略了對(duì)Bound Import 的處理,這樣會(huì)造成一些程序載入速度的減小。但使問(wèn)題簡(jiǎn)化了許多。 因?yàn)閷?dǎo)入地址表在一個(gè)可寫的塊中,攔截一個(gè)EXE或DLL對(duì)另一個(gè)DLL的調(diào)用就相對(duì)容易。只需要修改適當(dāng)?shù)貙?dǎo)入地址條目去指向希望攔截的函數(shù)。不需要修改調(diào)用者或被調(diào)者的任何代碼。 注意微軟產(chǎn)生的PE文件的導(dǎo)入表并不是完全被連接器同步的,這一點(diǎn)很有趣。所有對(duì)另一個(gè)DLL中的函數(shù)的調(diào)用的指令都在一個(gè)導(dǎo)入庫(kù)中。當(dāng)你連接一個(gè)DLL時(shí),庫(kù)管理器(LIB32.EXE或LIB.EXE)掃描將要被連接的OBJ文件并且創(chuàng)建一個(gè)導(dǎo)入庫(kù)。這個(gè)導(dǎo)入庫(kù)完全不同于16位NE文件連接器使用的導(dǎo)入庫(kù)。32位庫(kù)管理器產(chǎn)生的導(dǎo)入庫(kù)有一個(gè).text塊和幾個(gè).idata$塊。導(dǎo)入庫(kù)中的.text塊包含 JMP XXXX 指令,這條指令的標(biāo)號(hào)在OBJ文件的符號(hào)表中用一個(gè)符號(hào)名來(lái)存儲(chǔ)。這個(gè)符號(hào)名對(duì)將要從DLL中導(dǎo)出的所有函數(shù)名講都是唯一的(例如:_Dispatch_Message4)。導(dǎo)入庫(kù)中的一個(gè).idata$塊包含一個(gè)從導(dǎo)入庫(kù)中引用的地址,即導(dǎo)入庫(kù)的 .text 中的指令: JMP XXXX 中的XXXX 。 另一個(gè).idata$塊有一個(gè)提示序號(hào)(hint ordinal)的空間。這兩個(gè)域就組成了IMAGE_IMPORT_BY_NAME結(jié)構(gòu)。當(dāng)你晚期連接一個(gè)使用導(dǎo)入庫(kù)的PE文件時(shí),導(dǎo)入庫(kù)的塊被加到連接器需要處理的塊的列表中,這個(gè)列表在你的OBJ文件中。一旦導(dǎo)入庫(kù)中的這個(gè)xxxx的名字和和要導(dǎo)入的函數(shù)名相同,連接器就假定這條jmp xxxx指令就是這個(gè)導(dǎo)入函數(shù),并修正其中的xxxx ,使其指向這個(gè).idata$中的一個(gè)存儲(chǔ)導(dǎo)入函數(shù)地址的空間。導(dǎo)入庫(kù)中的這條jmp xxxx指令在本質(zhì)上就被當(dāng)作這個(gè)導(dǎo)入函數(shù)本身了。 除了提供一個(gè)導(dǎo)入函數(shù)的指令jmp xxxx,導(dǎo)入庫(kù)還提供PE文件的.idata塊(或稱導(dǎo)入表)的片斷。這些片斷來(lái)自于庫(kù)管理器放入導(dǎo)入庫(kù)中的不同的.idata$塊。簡(jiǎn)而言之,連接器實(shí)際上不知道出現(xiàn)在不同的OBJ文件中的導(dǎo)入函數(shù)和普通函數(shù)之間的不同。連接器只是按照它的內(nèi)部規(guī)則去建立并結(jié)合塊,于是,所有的事情就自然順理成章了。 本文有關(guān)導(dǎo)入表的內(nèi)容,基本上就這么多,要得到更多的信息,請(qǐng)參閱參考文獻(xiàn)141516。 當(dāng)前流行的一些軟件保護(hù)技術(shù)序列號(hào)保護(hù) 數(shù)學(xué)算法一項(xiàng)都是密碼加密的核心,但在一般的軟件加密中,它似乎并不太為人們關(guān)心,因?yàn)榇蠖鄶?shù)時(shí)候軟件加密本身實(shí)現(xiàn)的都是一種編程的技巧。但近幾年來(lái)隨著序列號(hào)加密程序的普及,數(shù)學(xué)算法在軟件加密中的比重似乎是越來(lái)越大了。 看看在網(wǎng)絡(luò)上大行其道的序列號(hào)加密的工作原理。當(dāng)用戶從網(wǎng)絡(luò)上下載某個(gè)shareware?共享軟件后,一般都有使用時(shí)間上的限制,當(dāng)過(guò)了共享軟件的試用期后,你必須到這個(gè)軟件的公司去注冊(cè)后方能繼續(xù)使用。注冊(cè)過(guò)程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號(hào)碼告訴給軟件公司,軟件公司會(huì)根據(jù)用戶的信息計(jì)算出一個(gè)序列碼,在用戶得到這個(gè)序列碼后,按照注冊(cè)需要的步驟在軟件中輸入注冊(cè)信息和注冊(cè)碼,其注冊(cè)信息的合法性由軟件驗(yàn)證通過(guò)后,軟件就會(huì)取消掉本身的各種限制,這種加密實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,不需要額外的成本,用戶購(gòu)買也非常方便,在互聯(lián)網(wǎng)上的軟件80%都是以這種方式來(lái)保護(hù)的。 軟件驗(yàn)證序列號(hào)的合法性過(guò)程,其實(shí)就是驗(yàn)證用戶名和序列號(hào)之間的換算關(guān)系是否正確的過(guò)程。其驗(yàn)證最基本的有兩種,一種是按用戶輸入的姓名來(lái)生成注冊(cè)碼,再同用戶輸入的注冊(cè)碼比較,公式表示如下: 序列號(hào) F(用戶名) 但這種方法等于在用戶軟件中再現(xiàn)了軟件公司生成注冊(cè)碼的過(guò)程,實(shí)際上是非常不安全的,不論其換算過(guò)程多么復(fù)雜,解密者只需把你的換算過(guò)程從程序中提取出來(lái)就可以編制一個(gè)通用的注冊(cè)程序。 另外一種是通過(guò)注冊(cè)碼來(lái)驗(yàn)證用戶名的正確性,公式表示如下: 用戶名稱 F逆(序列號(hào)) (如ACDSEE) 這其實(shí)是軟件公司注冊(cè)碼計(jì)算過(guò)程的反算法,如果正向算法與反向算法不是對(duì)稱算法的話,對(duì)于解密者來(lái)說(shuō),的確有些困難,但這種算法相當(dāng)不好設(shè)計(jì)。 于是有人考慮到以下的算法: ? F1(用戶名稱) F2(序列號(hào)) F1、F2是兩種完全不同的的算法,但用戶名通過(guò)F1算法計(jì)算出的特征字等于序列號(hào)通過(guò)F2算法計(jì)算出的特征字,這種算法在設(shè)計(jì)上比較簡(jiǎn)單,保密性相對(duì)以上兩種算法也要好的多。如果能夠把F1、F2算法設(shè)計(jì)成不可逆算法的話,保密性相當(dāng)?shù)暮?可一旦解密者找到其中之一的反算法的話,這種算法就不安全了。一元算法的設(shè)計(jì)看來(lái)再如何努力也很難有太大的突破,那么二元呢? 特定值 F(用戶名,序列號(hào)) 這個(gè)算法看上去相當(dāng)不錯(cuò),用戶名稱與序列號(hào)之間的關(guān)系不再那么清晰了,但同時(shí)也失去了用戶名于序列號(hào)的一一對(duì)應(yīng)關(guān)系,軟件開發(fā)者必須自己維護(hù)用戶名稱與序列號(hào)之間的唯一性,但這似乎不是難以辦到的事,建個(gè)數(shù)據(jù)庫(kù)就可以了。當(dāng)然也可以把用戶名稱和序列號(hào)分為幾個(gè)部分來(lái)構(gòu)造多元的算法。 特定值 F(用戶名1,用戶名2,序列號(hào)1,序列號(hào)2) 現(xiàn)有的序列號(hào)加密算法大多是軟件開發(fā)者自行設(shè)計(jì)的,大部分相當(dāng)簡(jiǎn)單。而且有些算法作者雖然下了很大的功夫,效果卻往往得不到它所希望的結(jié)果。時(shí)間限制 有些程序的試用版每次運(yùn)行都有時(shí)間限制,例如運(yùn)行10分鐘或20分鐘就停止工作,必須重新運(yùn)行該程序才能正常工作。這些程序里面自然有個(gè)定時(shí)器來(lái)統(tǒng)計(jì)程序運(yùn)行的時(shí)間。 這種方法使用的較少。Key File 保護(hù) Key File(注冊(cè)文件)是一種利用文件來(lái)注冊(cè)軟件的保護(hù)方式。Key File一般是一個(gè)小文件,可以是純文本文件,也可以是包含不可顯示字符的二進(jìn)制文件,其內(nèi)容是一些加密過(guò)或未加密的數(shù)據(jù),其中可能有用戶名、注冊(cè)碼等信息。文件格式則由軟件作者自己定義。試用版軟件沒有注冊(cè)文件,當(dāng)用戶向作者付費(fèi)注冊(cè)之后,會(huì)收到作者寄來(lái)的注冊(cè)文件,其中可能包含用戶的個(gè)人信息。用戶只要將該文件放入指定的目錄,就可以讓軟件成為正式版。該文件一般是放在軟件的安裝目錄中或系統(tǒng)目錄下。軟件每次啟動(dòng)時(shí),從該文件中讀取數(shù)據(jù),然后利用某種算法進(jìn)行處理,根據(jù)處理的結(jié)果判斷是否為正確的注冊(cè)文件,如果正確則以注冊(cè)版模式來(lái)運(yùn)行。 這種保護(hù)方法使用也不多,但是,我個(gè)人認(rèn)為,比時(shí)間限制要好。CD-check 即光盤保護(hù)技術(shù)。程序在啟動(dòng)時(shí)判斷光驅(qū)中的光盤上是否存在特定的文件,如果不存在則認(rèn)為用戶沒有正版光盤,拒絕運(yùn)行。在程序運(yùn)行的過(guò)程當(dāng)中一般不再檢查光盤的存在與否。Windows下的具體實(shí)現(xiàn)一般是這樣的:先用GetLogicalDriveStrings 或GetLogicalDrives 得到系統(tǒng)中安裝的所有驅(qū)動(dòng)器的列表,然后再用GetDriveType 檢查每一個(gè)驅(qū)動(dòng)器,如果是光驅(qū)則用CreateFileA 或FindFirstFileA 等函數(shù)檢查特定的文件存在與否,并可能進(jìn)一步地檢查文件的屬性、大小、內(nèi)容等。反跟蹤技術(shù)(Anti-Debug) 好的軟件保護(hù)都要和反跟蹤技術(shù)結(jié)合在一起。如果沒有反跟蹤技術(shù),軟件等于直接裸露在 Cracker 面前。這里說(shuō)的反跟蹤,指的是反動(dòng)態(tài)跟蹤。即防止 Cracker 用 SoftICE 之類的調(diào)試器動(dòng)態(tài)跟蹤,分析軟件。當(dāng)前的這類軟件還有如 TRW 、ICEDUMP 等等。反跟蹤技術(shù)一般是具有針對(duì)性的,即針對(duì)某種調(diào)試器的反跟蹤,而不能防止所有的調(diào)試器跟蹤,如果有新的破解工具出現(xiàn),就需要相應(yīng)的反跟蹤技術(shù) 。 這種技術(shù)一般是檢測(cè)這些特定的調(diào)試器是否駐留內(nèi)存,如果駐留內(nèi)存,就認(rèn)為被跟蹤,從而拒絕執(zhí)行,或進(jìn)行一些懲罰性措施 。還有一些檢測(cè)方法,如假設(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)化異常處理)檢測(cè)調(diào)試器。反-反匯編技術(shù)(Anti- Disassmbly) 即 Anti-Disassmbly ??舍槍?duì)專門的反匯編軟件設(shè)計(jì)的“陷阱”,讓反匯編器陷入死循環(huán),但這種方法沒有通用性。 一般是使用花指令 。這種方法有通用性,即所有的反匯編器都可以用這種方法來(lái)抵擋 。這種方法主要是利用不同的機(jī)器指令包含的字節(jié)數(shù)并不相同,有的是單字節(jié)指令,有的是多字節(jié)指令。對(duì)于多字節(jié)指令來(lái)說(shuō),反匯編軟件需要確定指令的第一個(gè)字節(jié)的起始位置,也就是操作碼的位置,這樣才能正確地反匯編這條指令,否則它就可能反匯編成另外一條指令了。并且,多字節(jié),指令長(zhǎng)度不定,使得反匯編器在錯(cuò)誤譯碼一條指令后,接下來(lái)的許多條指令都會(huì)被錯(cuò)誤譯碼 。所以,這種方法是很有效的 。 實(shí)施方法:在程序中加入一些無(wú)用的字節(jié)來(lái)干擾反匯編軟件的判斷,從而使得它錯(cuò)誤地確定指令的起始位置,那么也就達(dá)到了干擾反匯編器工作的目的。一般形式如下: .jmp L1dd012344578h ;這里是一些隨機(jī)數(shù),用來(lái)干擾反匯編器 ;對(duì)指令的譯碼L1:軟件狗 軟件狗是一種智能型加密工具。它是一個(gè)安裝在并口、串口等接口上的硬件電路,同時(shí)有一套使用于各種語(yǔ)言的接口軟件和工具軟件。當(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à)值得軟件一般都用軟件狗來(lái)保護(hù)。 平時(shí)常見的狗主要有“洋狗”(國(guó)外狗)和“土狗”(國(guó)產(chǎn)狗)。這里“洋狗”主要指美國(guó)的彩虹和以色列的HASP,“土狗”主要有金天地(現(xiàn)在與美國(guó)彩虹合資,叫“彩虹天地”)、深思、尖石。總的說(shuō)來(lái),“洋狗”在軟件接口、加殼、反跟蹤等“軟”方面沒有“土狗”好,但在硬件上絕對(duì)無(wú)法破解(應(yīng)當(dāng)說(shuō)破解難度非常大);而“土狗”在軟的方面做的很好,但在硬件上不如“洋狗”,稍有單片機(jī)功力的人,都可以復(fù)制。Vbox 保護(hù)技術(shù) Vbox 是一個(gè)軟件 。它是用來(lái)保護(hù)其它軟件的 。凡被 Vbox 保護(hù)的軟件,一旦過(guò)了試用期,就不能再使用了,刪了重裝也沒用,除非刪除整個(gè)操作系統(tǒng)再重裝。SalesAgent 保護(hù)技術(shù) SalesAgent 保護(hù)的軟件一般具有 x 天試用再購(gòu)買的接口,是一種時(shí)間限制保護(hù)方式。才用這種保護(hù)方式的軟件主要有 Macromedia Flash 4 、DreameWaver 等等。SecuROM 保護(hù)技術(shù) SecuROM (/htt

注意事項(xiàng)

本文(軟件加密技術(shù)及實(shí)現(xiàn)畢業(yè)論文(可編輯))為本站會(huì)員(仙***)主動(dòng)上傳,裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng)(點(diǎn)擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因?yàn)榫W(wǎng)速或其他原因下載失敗請(qǐng)重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

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

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


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