《软件加密与解密》第三版学习日志二
一 常見軟件保護技術
1.序列保護方式
注冊過程一般是用戶把自己的私人信息,如用戶名、郵件地址、及其特征碼等,告訴軟件公司,軟件公司根據用戶的信息利用預先寫好的一個計算注冊程序,稱為注冊機keygen,算出一個序列號后發給用戶,用戶得到序列號后,按照注冊需要的步驟在軟件中輸入注冊信息和注冊碼,其注冊信息的合法性由軟件驗證通過后,軟件就會取消各種限制,如時間限制、功能限制等而成為完全正式版本。
軟件驗證序列號的過程,其實就是驗證用戶名和序列號之間的數學映射關系,這個映射關系是由軟件設計者制定,所以各個軟件生成序列號算法是不同的。
2.警告Nag窗口
nag的本義是煩人的意思。Nag窗口是軟件設計者用來不時提醒用戶購買正式版本的窗口。去掉警告窗口常用的3種方法:修改程序的資源、靜態分析和動態分析。若要完全去除警告窗口,只需找到創建此窗口的代碼。
3.時間限制
時間限制有兩類:一類是每次運行多少時間;另一類是每次運行時間不限,但是有個時間段限制,如試用期;
4.菜單功能限制
受限制的軟件,其菜單或窗口中部分選項是灰色,無法使用。
5.KeyFile保護
KeyFile是一種利用文件來注冊軟件的保護方式。KeyFile一般是一個小文件,可以是純文本文件,也可以是包含不可顯示字符的二進制文件。其內容是一些加密過或未加密的數據,其中可能有用戶名、注冊碼等信息,文件格式則由軟件作者自己定義。用戶只要將該文件放入指定的目錄,就可以讓軟件成為正式版。該文件一般放在軟件的安裝目錄中或系統目錄下,軟件每次啟動時,從該文件中讀取數據,然后利用某種算法進行處理,根據處理的結果判斷是否為正確的注冊文件。
6.網絡驗證
網絡驗證是目前流行的一種保護技術,其優點是可以將一些關鍵數據放到服務器上,軟件運行時,必須從服務器取得這些數據才能正確運行。拆解的思路是攔截服務器返回的數據包,分析程序是如何處理數據包的。
7.CD-Check
? 一些采用光盤形式發行的應用軟件或游戲在使用時需要檢查光盤是否插在光驅中,如果沒有則拒絕運行。這是為了防止用戶將軟件或游戲的一份正版拷貝安裝在多臺機器上并同時使用。
?
二保密算法
? 1.單向散列算法
??? 單向散列算法也稱Hash(哈希)算法,是一種將任意長度的消息壓縮到某一固定長度(消息摘要)的函數(該過程不可逆)。Hash函數可用于數字簽名、消息的完整性檢測、消息起源的認證檢測等。常見的散列算法由MD5、SHA、RIPE-MD、HAVAL、N-Hash等。
??? 在軟件的加密保護中,Hash函數是經常用到的加密算法。但是,由于Hash函數為不可逆算法,所以軟件只能使用Hash函數作為一個假面的中間步驟。例如,對用戶名做一個Hash變換,將這個結果再進行一個可逆的加密變換(如對稱密碼),變換結果為注冊碼。從解密角度來說,一般不必了解Hash函數的具體內容(變種算法除外),只要能識別出是何種Hash函數就可以了,然后直接套用相關算法源碼實現。
??? 軟件保護人員在使用散列算法進行保護時,建議選擇SHA-256/384/512,或者使用Whirlpool。如果在解密時碰到Hash算法,一般只要根據每種Hash算法的特征搞清楚是哪一種Hash算法以及該算法是否變形,繼而通過該Hash的源代碼即可作出注冊機。
? 2.對稱加密算法
??? 對稱加密算法的加密密鑰和解密密鑰是完全相同的。其安全性依賴于以下兩個因素:第一,加密算法必須是足夠強的,僅僅基于密文本身去解密信息在實踐是不可能的,可以抵抗現有的各種密碼分析方法的攻擊;第二,加密安全性依賴于密鑰的秘密性,而不是算法的保密性。若要采用對稱算法檢驗注冊碼,正確的使用方法是把用戶輸入的注冊碼(或者注冊碼的一部分,注冊的散列值)作為加密算法或者解密算法的密鑰。這樣,解密者要找到一個正確的注冊碼,只能采用窮舉法。
?????? 為了增大窮舉的難度,自然要求注冊碼由一定的位置。如果在檢查注冊碼時,把用戶輸入的注冊碼作為算法的輸入或者輸出,則無論使用加密算法還是解密算法檢查注冊碼,解密者都可利用調試器在內存中找到所用的密鑰,從而可以將算法求逆,寫出注冊機來。常見的對稱分組加密算法由DES(Data Encryption Standard)、IDEA(International DataEncryption Algorithm)、AES(Advanced Encryption Standard)、BlosFish、Twofish、流密碼RC4等。如果軟件中使用了對稱加密算法,那么一般來說,只要知道了算法的類型及密鑰,那么就可以做出注冊機來。可以用如下方法識別軟件中所使用的對稱加密算法。
??? 1)使用PEiD的Kcrypto ANALyzer(Kanal)插件進行識別,一般的對稱加密算法都可以識別出來,但也有例外(如IEDA)。需要注意的是,不能依賴于工具。使用工具只是一種輔助,還需要進一步的跟蹤以確定到底是何種算法。
??? 2)通過每種加密算法的獨特的加解密處理過程,如是否為Feistel網絡,加密輪數,密鑰長度,子密鑰生成過程,S-box的值等一系列信息區分和確定軟件中所使用的算法。
??? 3)為了進一步確定是否為某種對稱加密算法,以及此種算法采用何種工作模式(ECB\CBC\CFB\CTR等)?往往還需要自己寫一個此種算法的加解密程序來和軟件中的算法進行對比檢驗。
? 3.公開密鑰加密算法
??? 公鑰算法加密和解密使用不同的密鑰,加密所使用的叫做公鑰,而解密所使用的叫做私鑰,故而公鑰加密算法又稱為非對稱加密算法(Asymmetric Key Cryptography)。任何人可以都可以使用密鑰分配者所分發的公鑰對信息進行加密,而只有私鑰者的所有者才可以解密。公開密鑰的設計是基于NP完全問題。如果軟件作者在生成注冊碼時采用界面算法(私鑰),而在軟件中檢查注冊碼時使用加密算法(公鑰),即使解密者能夠用調試器在自己的機器上對軟件進行跟蹤分析從而找到公鑰,他也不一定能夠計算出私鑰,自然也就無法得到爭取的注冊碼,更無法寫出注冊機來。
??? 常見算法有:RSA算法、ELGamal公鑰算法、DSA數字簽名算法。
? 4.其他算法
??? 除以上算法,平時還接觸的由CRC32算法、Base64編碼等算法。
??? 1)CRC全稱Cyclic Redundancy Checksum或者Cyclic Redundancy Check,是對數據的校驗值,中文名師循環冗余校驗碼,常用于檢驗數據的完整性。最常見的CRC是CRC32,即數據校驗值為32位;
??? 2)Base64編碼是將二進制數據編碼為可顯示的字母和數字,用于傳送圖形、聲音和傳真?等非文本數據。常用于MIME電子郵件格式中。其使用含有65個自己的ASCII字符集(第65個字符為=,用于對字符串的特殊處理過程),并用6個進制位表示一個可顯示字符。
?? 5.常見的加密庫接口及其識別
???? 程序員在自己的程序中實現加密算法時,往往需要借助于一些加密算法庫來實現。逆向分析時必須?能識別出常見的加密算法庫,識別加密算法庫,最直接也是最精確的方法,便是掌握算法庫的使用方法,另外,也可以使用IDA的Flair工具制作出算法庫的signature。
??? 1)Miracl大數運算庫
???? Miracl全稱為Multiprecision Integer and Rational Arithmetic C/C++ Library,即多精度整數和有理數算術運算C/C++庫。它是一個大數庫,實現了設計使用大數的加密技術的?最基本的函數。支持RSA公鑰系統、Diffie-Hellman密鑰交換、DSA數字簽名系統及基于GF(p)和GF(2M)的橢圓曲線加密系統。Miracl提供了C和C++兩種接口,而且使用起來方便,且?是開源的。
???? 官方網站是www.shamus.ie,下載后,參考readme.txt將其安裝。
??? 2)FGInt
???? FGInt為Fast Gigantic Integers,是用于Delphi的一種常見公鑰加密系統的庫。官方網站www.submanifold.be。
??? 3)其他加密算法庫
???? freeLIP、Crypto++、LibTomCrypt、GMP、OpenSSL、DCP和DEC、Mcirosoft Crypto API、NTL等。
總結
以上是生活随笔為你收集整理的《软件加密与解密》第三版学习日志二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《软件加密与解密》第三版学习日志一
- 下一篇: 味“文”两点