摘要:本文針對加密軟件易于破解的問題,對普通加密軟件的加密方式和常用技術進行分析研究,找出了普通加密軟件加密方式的弊端,提出能加大破解難度的幾種小技巧。靈和使用這些技巧,能極大地提高加密軟件的破解難度,適用于大多數加密方式的改進與提高,對充分保護軟件編程者的合法權益和推動加密軟件和共享軟件的發展具有現實的意義。
關鍵詞:加密;解密;反跟蹤;偽隨機
中圖分類號: TP311.52 文獻標識碼:A 文章編號:1672-9129(2020)08-0154-02
付費軟件或者共享軟件都需要對目標程序進行加密來保護版權,為了防止軟件被解密,通常采用很多防止軟件被跟蹤分析的技術,如防靜態分析和防動態分析等等,軟件的加密解密技術一直是一對矛與盾的關系,作為加密者和解密者,如果技術水平基本相當,那加密軟件通常會被解密。本課題提出一種新型的加密方式,使加密相對簡單,解密相對困難,甚至超出編寫新程序的程度,充分保護軟件編程者的合法權益。
1 軟件加密方式簡介
軟件加密是為了保護軟件不被跟蹤破解,目前流行的軟件加密技術主要有以下幾種:
1.1軟件注冊?,F有的有兩種免費的軟件可以使用,一種是自由軟件(freeware),是完全免費的,沒有任何使用限制。當然,為了尊重作者的勞動,這些軟件不允許修改或者跟蹤得到核心算法另作它用。一種是共享軟件(shareware),可以免費試用,如果要得到完全的功能或者服務的話,一般情況下需要注冊?,F在網上有很多免費軟件,其中共享軟件相對來說更多一些,由于軟件注冊一般不產生新的硬軟件費用,注冊過程也不復雜,成為目前最流行的加密方式之一。
1.2磁盤或者光盤保護。一般是利用特殊格式化的軟磁盤或者光盤作為鑰匙盤,在軟件安裝或者運行時會去檢驗軟盤或者光盤中的特殊數據是否正確,來判定是否被非法使用。軟磁盤這種載體現在基本淘汰,但光盤加密方式還較常見,一般隨光盤發行軟件的情況下通常采用這種方式。
1.3軟件狗。所謂軟件狗是插在電腦并行接口或者串行接口上的一種硬件,軟件通過對計算機相應接口的讀取或者修改,得到相應的加密信息,只有正確的狗才能使軟件正常運行,從而達到保護軟件防止盜版的目的。早期的軟件狗都是簡單的數字邏輯電路,然后發展成存儲器、MCU等等,破解難度一步一步提高。但不管是何種軟件狗,從原理上來說,都可以在軟件狗與電腦相應接口之間加入監測接口來得到分析結果,然后利用MCU仿真來破解。
1.4硬件加密。通常利用唯一的網卡MAC地址、硬盤序列號、CMOS序列號等進行加密運算,不同的程序只能運行在唯一的硬件環境。或者結合軟件注冊碼方式,利用不同的硬件識別碼生產不同的注冊碼,來達到保護版權的目的。
1.5 PCI卡加密。有些大型軟件通常采用自帶PCI加密卡插入電腦相應擴展槽中運行的方式。早期加密只是在卡中寫入簡單的數據,運行時依照固定的物理地址讀取數據來加密,如WPS1.0、巨人漢字系統、瑞星漢字系統等。以后也加入了MCU電路,先由軟件發出初始化指令,然后在極短時間內得到軟件運行時必須的關鍵代碼段和關鍵數據來加密,如清華文通OCR系統等。
1.6 USB key。USB Key是一種USB接口的硬件設備。它內置單片機或智能卡芯片,有一定的存儲空間,可以存儲用戶的私鑰以及數字證書,利用USB Key內置的公鑰算法實現對用戶身份的認證。由于用戶私鑰保存在密碼鎖中,理論上使用任何方式都無法讀取,因此保證了用戶認證的安全性?,F有的網銀系統都是采用這種方式。
1.7網絡服務器方式。還有一些必須聯網使用的軟件,通過遠程發送請求數據,服務器發送授權數據來達到加密的目的。如果授權數據只是簡易的許可指令,可以通過偽造許可指令的方式達到非法使用的目的;如果授權數據是軟件運行時所需的大量實時數據,則只能通過黑客技術破解服務器端軟件獲取授權才能運行。一些證券期貨類軟件、網游軟件等通常采用這種加密方式。
2 軟件解密方式簡介
對于軟件解密方式而已,通常有以下幾種方式:
2.1仿制硬件或者加密載體。從仿制硬件的載體來說,有仿制軟件狗或者PCI卡、USB設備,有仿制特殊格式化的光盤,都是從仿制軟件運行需要的條件入手。從解密方式來說,有硬件跟蹤和軟件模擬兩種方式,相對于解密入手點來說,有跟蹤軟件和硬件監控兩種方式??偟膩碚f,就是知道硬件加密和加密載體的特殊信息的情況下,不修改原始程序,仿制硬件和載體的特殊信息,從而達到非法獲利的目的。這種方式需要仿制的硬件(如軟件狗、PCI卡、特殊格式化的光盤等),成本相對較高。
2.2全解密。從原理上來說,軟件運行是脫離加密環境運行的。一個軟件需要運行,除了必須的硬件環境之外,是不需要特殊的硬件或者載體的,這些硬件和載體是為了加密誕生的,非正常軟件運行必須的環境。所以去掉加密判斷部分,還原最初的運行環境,使程序正常運行,就是全解密。這時候軟件在不需要外部軟件狗、USBKey、特殊光盤等的支持下,能正常全功能運行,就是全解密。在這種方式下,解密的程序跟加密過的程序一樣,在不需要配合加密程序的硬件的基礎上達到原始程序所有的功能。
2.3算碼程序。有些加密軟件,需要讀取硬件的序列號等信息,依照特殊的算法得到注冊碼,解密時只要找到檢測子程序,依照正常方式讀取特定的序列號信息,依據系統特殊的算法,就能得到相應的注冊碼。使用者得到依據自己的硬件環境生產的注冊碼,就能正常使用加密軟件。
2.4軟件模擬加密軟件運行環境。針對特殊的加密軟件,利用加密硬件和軟件的信息,模擬軟件運行環境,通過在正常運行的系統調用中加上加密軟件需要的環境,仿真有正常的加密信息,來欺騙加密程序,使之能正常運行。這種情況很少見,通常是在加密軟件調用系統中斷或者讀取注冊表等特殊情況下使用。
3 普通軟件加密方法的弊端
軟件加密方法有很多種,不管是軟件狗加密、光盤加密、硬件序列號加密、PCI卡加密等等,也不管是安裝加密和運行加密,采用了何種反靜態分析和反動態跟蹤的技巧,就總體結構而言,采用的方法無非是外殼式和內嵌式兩種,下面具體分析一下兩種方法的實現步驟:
3.1外殼式加密方法。通過在主程序前面添加代碼,阻止解密者進入核心程序,稱為外殼式加密。只要解密者技術足夠高,跟蹤到主程序入口,就知道了原始程序的加密方法,在不更改原程序的基礎上寫出對應的加密程序,就能合法拷貝使用被加密的程序了。不管是磁盤加密也好,序列號對應也好,都能合法拷貝。如果是PCI卡加密或者軟件狗、USB key加密等等,寫一條跳轉指令,從程序入口直接跳轉到正常的主程序入口,加密程序就成了普通程序,也就能被正常使用了。即使主程序有核心子程序或者關鍵數據被寫入PCI卡、軟件狗、USB key中,也是讀入內存才執行的,只要正確跟蹤到正常主程序入口,PCI卡中的子程序或者關鍵數據已經寫入到內存,利用TR2000軟件的MAKEPE指令可以輕易讀出內存中的代碼生成新的可執行文件,程序一樣被解密。
這種方法最主要的弊端在于,被動式的防止解密跟蹤,程序一旦被在跟蹤狀態下正確執行,就等于被解密了。
3.2內嵌式加密方法。通過在主程序中內嵌式加密中,只要檢測到被非法使用,就出錯退出或者死機等等。由于檢測判斷的關鍵點只有一個判斷跳轉,解密者嘗試進入出錯的跳轉就出錯退出,嘗試進入另一個跳轉就進入正常運行,很容易就找到加密檢測子程序,進入加密檢測子程序跟蹤加密算法就能得到對應的加密方式,可以寫成算碼器等解密程序;修改原程序跳轉指令就能得到相應的已解密程序。
3.3普通加密方式的弊端。通過以上分析,普通加密方式主要有兩個弊端,造成加密軟件可以輕易被解密:
(1)隱藏檢測子程序強度不夠,隱藏檢測子程序主要依靠反靜態跟蹤和反動態跟蹤代碼來達到阻止加密者發現檢測子程序的目的,不管反靜態跟蹤和反動態跟蹤的代碼多么難跟蹤,只要解密者技術水平足夠高,總是有方法避免進入陷阱、跟蹤到檢測子程序的。跟蹤與反跟蹤是一對矛與盾的關系,由于軟件在正常的環境下必定是能正常執行的,所以相對來說加密難度相對解密難度來說更大。由于檢測子程序調用在主程序中,只要正常跟蹤進入主程序的真正入口,就能輕易找到檢測子程序,從而更改跳轉指令或者寫出相應的解密程序,達到破解加密程序的目的;
(2)加密方法不夠隱蔽,硬性退出或者出錯、限制部分功能等等,造成解密者能輕易判斷跟蹤方法正確與否,從而找到檢測關鍵點。
4 新型加密方法
4.1針對普通加密方式的弊端,本文提出一種新型的加密方法,完全克服了這些問題:
(1)加密檢測點放在程序內部常用子程序中,以一個或者數個計數器來決定是否進入檢測子程序進行檢測,這樣即使在程序被正常跟蹤執行的過程中,也很難找到檢測子程序代碼,也就沒辦法知道加密軟件的加密方法,更無法仿制硬件或者寫出相應的解密算法;對于一個被軟件反復調用的子程序,十次八次的調用并沒有觸發加密檢測,通常被解密者當成普通子程序調用而忽視。即使進入子程序進行跟蹤,由于多次跟蹤都無法接觸到檢測子程序,通常解密者會判斷檢測子程序不在其中。即使能準確判斷檢測子程序在這個子程序中,由于跟蹤分析耗時太多,很難接觸到檢測子程序,耗費的時間和精力過大,解密者通常也會放棄破解。多次使用多個計數器會提升隱藏效果,如果計數器設定為一萬次或者更多次才進入一次檢測子程序,那解密的難度就可想而知了。這種方式的優點是極大地提高了解密難度,使解密的難度比加密的難度大很多倍。
(2)當檢測到程序被非法使用時,不是出錯退出或者死機等,而是將核心算法中的部分功能減弱或者出錯,造成一些"軟故障",比方說一個輸入法程序,一小部分漢字輸入成錯誤碼,這樣的程序基本就失去了使用價值;一個計算器程序,計算結果一百次錯一次,這樣的計算器也無法正常使用。這樣做的好處是,即使程序已經檢測到被非法使用并設置了軟故障,解密者在跟蹤過程中也發現不了,即使后期跟蹤發現了錯誤。也無法判斷是什么時候在什么地方出現錯誤的,加大了判斷難度。
4.2對于以上方法,關鍵點是如何隱藏檢測子程序和制造軟故障,下面談談具體實施方法:
(1)解密者在跟蹤過程中,為了快速找到檢測子程序部分,通常使用P指令(大多數匯編級調試軟件如softice、trw2000中的單步跟蹤指令,但遇到call、int等指令時不進入跟蹤)跟蹤所有的call指令,然后判斷程序是否處于正常狀態。當通過反復跟蹤在主程序段無法找到檢測子程序主體,才可能用T指令(單步跟蹤指令,遇到call、int等指令時進入跟蹤子程序和中斷調用跟蹤)進入子程序跟蹤。由于在主程序段中被調用的子程序很多,很難判斷到底是在哪個子程序中調用了檢測子程序。即使進入每個子程序跟蹤,由于嵌套調用子程序的運用,在每個下級子程序中也難找到檢測子程序調用。如果主程序調用了10個子程序,這10個被調用的子程序總共調用下級子程序共100個,被下級子程序調用的第三級子程序為1000個,這樣在第三級子程序中調用檢測子程序時,其破解難度幾乎等于破解普通加密方式的100倍(1000/10)。
(2)制造軟故障可以是修改程序部分關鍵數據(如漢字輸入法的編碼表、運算轉換程序中的修正值等等),屏蔽系統關鍵子程序入口等等,只要是影響解密者正常確認出錯判斷的都可以。
制造軟故障的要點是:第一、在故障發生以后解密者不能馬上知道故障已經發生,在以后的跟蹤過程中即使發現錯誤,也無法判斷是什么時候出現了錯誤,從而無法判斷加密檢測子程序什么時候發生了調用。如果制造的軟故障太過明顯,解密者很快就知道出現故障的小范圍了,從而失去了隱藏檢測子程序的作用。第二、軟故障必須是引起加密軟件失去使用價值的關鍵。加密的目的是為了防止軟件被非法使用,假設一個加密軟件即使被非法使用還基本具有使用價值,那加密就沒有意義了。如美圖秀秀等軟件,假設制造的軟故障為在圖像上加上一個點,根本不影響軟件的使用,這種加密也就失去了意思。
(3)進入檢測子程序的計數器可以是嵌套的多個計數器,有的只是循環加一判斷,有的是依照時鐘的偽隨機判斷,有的是系統工作時正常數據的偽隨機判斷等等。只要各種方法隨心運用得當,就會給解密者跟蹤造成極大的障礙,從而造成無法破解的事實。如果簡單使用循環加一計數的方式,解密者可以依據軟故障發生的頻度和調用子程序的頻度兩方面來大致判斷計數器的值,造成軟件相對偽隨機更好破解一點。如果在跟蹤運行的環境中,出現軟故障的時間在1小時到1小時零1分之間,那么解密者只需要等機器運行1小時再開始跟蹤判斷,大大減輕了解密的難度。偽隨機判斷是造成解密者最大障礙的地方,對于一個加密軟件,也許使用5分鐘不會出錯,也許1秒就會出錯,這樣解密者根本無法預料錯誤會在何時發生,也就更難判斷加密監測子程序在哪里被調用了。
偽隨機可以使用各種方法,直接調用編程語言的隨機數函數(如C語言的rand函數)或者自定義方法都行,只要出現軟故障的時刻越無規律越好??梢韵胍?,如果解密者無法預料軟故障出現的時刻,每一步跟蹤都得認真仔細,其解密難度會多么大。
5 應用前景
現今社會已經發展成為網絡社會,各種軟件開發運用都在蓬勃發展,為了保護軟件作者的合法利益,加密技術幾乎無所不在,特別是共享軟件的注冊方式,占了免費半免費軟件的百分之八十以上。軟件本課題提出一項針對加密解密技術的新方法,使加密相對簡單,解密相對困難,極大地提升了加密軟件的安全度。針對不同的環境,依據普通的軟件加密算法,適當結合本課題闡述的技巧,都能在原有的軟件加密強度上有很大提高,對加密軟件應用有普遍的意義。
參考文獻:
[1]段剛.加密與解密(第三版)電子工業出版社.2008.7.
[2]看雪學院創作團隊.論壇精華三.電子工業出版社.2001.9書號:5053-6923-7/TP.3948.
[3]看雪學院創作團隊.論壇精華四.
[4]看雪學院創作團隊.論壇精華五.
[5]看雪學院創作團隊.論壇精華八.
[6]看雪學院創作團隊.論壇精華九.
[7]軟件加密技術內幕.網絡資源出版社.
作者簡介:張少雄(1964.9-),男,漢,湖北仙桃人,職稱:工程師,學歷:本科,研究方向:通信技術、軟件編程。