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