天天看點

《軟體加密與解密》第三版學習日志二

一 常見軟體保護技術

1.序列保護方式

注冊過程一般是使用者把自己的私人資訊,如使用者名、郵件位址、及其特征碼等,告訴軟體公司,軟體公司根據使用者的資訊利用預先寫好的一個計算注冊程式,稱為注冊機keygen,算出一個序列号後發給使用者,使用者得到序列号後,按照注冊需要的步驟在軟體中輸入注冊資訊和注冊碼,其注冊資訊的合法性由軟體驗證通過後,軟體就會取消各種限制,如時間限制、功能限制等而成為完全正式版本。

軟體驗證序列号的過程,其實就是驗證使用者名和序列号之間的數學映射關系,這個映射關系是由軟體設計者制定,是以各個軟體生成序列号算法是不同的。

2.警告Nag視窗

nag的本義是煩人的意思。Nag視窗是軟體設計者用來不時提醒使用者購買正式版本的視窗。去掉警告視窗常用的3種方法:修改程式的資源、靜态分析和動态分析。若要完全去除警告視窗,隻需找到建立此視窗的代碼。

3.時間限制

時間限制有兩類:一類是每次運作多少時間;另一類是每次運作時間不限,但是有個時間段限制,如試用期;

4.菜單功能限制

受限制的軟體,其菜單或視窗中部分選項是灰色,無法使用。

5.KeyFile保護

KeyFile是一種利用檔案來注冊軟體的保護方式。KeyFile一般是一個小檔案,可以是純文字檔案,也可以是包含不可顯示字元的二進制檔案。其内容是一些加密過或未加密的資料,其中可能有使用者名、注冊碼等資訊,檔案格式則由軟體作者自己定義。使用者隻要将該檔案放入指定的目錄,就可以讓軟體成為正式版。該檔案一般放在軟體的安裝目錄中或系統目錄下,軟體每次啟動時,從該檔案中讀取資料,然後利用某種算法進行處理,根據處理的結果判斷是否為正确的注冊檔案。

6.網絡驗證

網絡驗證是目前流行的一種保護技術,其優點是可以将一些關鍵資料放到伺服器上,軟體運作時,必須從伺服器取得這些資料才能正确運作。拆解的思路是攔截伺服器傳回的資料包,分析程式是如何處理資料包的。

7.CD-Check

  一些采用CD光牒形式發行的應用軟體或遊戲在使用時需要檢查CD光牒是否插在光驅中,如果沒有則拒絕運作。這是為了防止使用者将軟體或遊戲的一份正版拷貝安裝在多台機器上并同時使用。

二保密算法

  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等。