專(zhuān)利名稱(chēng):變換指令存儲(chǔ)加密技術(shù)的制作方法
技術(shù)領(lǐng)域:
本方法發(fā)明用于計(jì)算機(jī)軟件的安全保護(hù),是一種新的加密保護(hù)技術(shù)。該技術(shù)針對(duì)軟件的破解,能極大的提高軟件的抗破解能力。通過(guò)程序的方式實(shí)現(xiàn),可以在單獨(dú)的計(jì)算機(jī)上使用。目前在所有使用Intel 80×86指令集的各種平臺(tái)上都可使用,與操作系統(tǒng)和硬件無(wú)關(guān)。
背景技術(shù):
軟件開(kāi)發(fā)者為了保護(hù)自己的權(quán)益,對(duì)軟件會(huì)施加一些保護(hù)措施,如使用注冊(cè)碼,加密光盤(pán)等。但破解者則能通過(guò)對(duì)軟件的分析,非正當(dāng)?shù)慕獬@些保護(hù)措施。因此如何防止被破解,就形成了軟件的加密保護(hù)技術(shù)。
破解軟件通過(guò)對(duì)軟件的調(diào)試實(shí)現(xiàn),需使用調(diào)試器。一般將破解分成兩類(lèi)方法1.靜態(tài)分析。先將軟件的機(jī)器碼全部反匯編成匯編代碼,再分析匯編碼,找出加密的原理。
2.動(dòng)態(tài)跟蹤。在軟件的運(yùn)行過(guò)程制造中斷,以觀察其運(yùn)行到不同的指令時(shí)寄存器、內(nèi)存內(nèi)容等環(huán)境值的變化。
兩種方法一般配合使用,對(duì)代碼的分析能指導(dǎo)如何跟蹤軟件,而跟蹤則加快對(duì)軟件的分析。而目前的加密保護(hù)技術(shù)也主要分成兩種1.防范破解所用的技術(shù)。破解時(shí)會(huì)使用調(diào)試、跟蹤技術(shù),因此根據(jù)目前主要調(diào)試器的特征,和被調(diào)試、跟蹤狀態(tài)的特征來(lái)防范,即反調(diào)試、反跟蹤技術(shù)。
2.防范破解的原理。破解的主要步驟為取得代碼、分析代碼、解除保護(hù)。針對(duì)每個(gè)步驟現(xiàn)在都有保護(hù)技術(shù),防止取得代碼主要是對(duì)代碼加密和反DUMP技術(shù);防止分析代碼主要是花指令技術(shù)和運(yùn)行時(shí)間檢驗(yàn)技術(shù);防止解除保護(hù)主要是完整性校驗(yàn)和對(duì)代碼加密技術(shù)。
不論多復(fù)雜的加密,只要破解者能慢慢的分析,就總有破解的一天。因此防止對(duì)軟件的分析,是加密保護(hù)的一個(gè)重要部分。前面講到分析需先將機(jī)器碼進(jìn)行反匯編。因此防止軟件分析主要就是破壞對(duì)機(jī)器碼的反匯編,使破解者得不到完整的匯編碼,從而無(wú)法分析。現(xiàn)在主要通過(guò)花指令法來(lái)實(shí)現(xiàn)?;ㄖ噶畹脑砣缦路磪R編最重要的是能準(zhǔn)確得到指令的開(kāi)始位置,因?yàn)橹噶瞵F(xiàn)在都是順序存儲(chǔ)的,所以前一個(gè)指令的結(jié)束就是下一個(gè)指令的開(kāi)始,還有一些特殊指令中(主要是轉(zhuǎn)跳指令),也包含有指令的開(kāi)始處。反匯編程序依靠這兩點(diǎn)得到指令開(kāi)始位置。
花指令通過(guò)混淆指令的開(kāi)始位置來(lái)干攏反匯編,其主要原理為在被干攏指令前加入一些干攏字節(jié)。干攏字節(jié)有兩種一種是不完整指令,它會(huì)與后面指令的前部分組成一個(gè)指令,從而混淆了后面指令的開(kāi)始位置。因?yàn)榧尤氲母蓴n字節(jié)必須永遠(yuǎn)不會(huì)被執(zhí)行,所以一般在其前面先使用一個(gè)轉(zhuǎn)跳指令,使程序跳過(guò)干攏指令繼續(xù)執(zhí)行。
另一種是使用轉(zhuǎn)跳指令本身作為干攏,一般使用條件轉(zhuǎn)跳,此轉(zhuǎn)跳指向一個(gè)錯(cuò)誤的指令開(kāi)始處(一般就指向后面1、2個(gè)字節(jié)偏移處),根據(jù)此轉(zhuǎn)跳得到一個(gè)開(kāi)始位置就會(huì)引起混淆。這種轉(zhuǎn)跳指令的轉(zhuǎn)跳條件必須永遠(yuǎn)得不會(huì)滿足。
兩種方式配合使用,反匯編程序就無(wú)法分清到底是轉(zhuǎn)跳指令為花指令呢,還是轉(zhuǎn)跳指令后的字節(jié)為花指令。在實(shí)際應(yīng)用中還有一些使用其它轉(zhuǎn)跳方式,指令替換之類(lèi)的花指令,但其原理都是基于此。
雖然花指令原理上都是可分析出來(lái)的,但因?yàn)榛ㄖ噶顚?shí)際實(shí)現(xiàn)時(shí)做得千變?nèi)f化用各種各樣的方式來(lái)實(shí)現(xiàn)轉(zhuǎn)跳,使條件轉(zhuǎn)跳成立/不成立的方法也五花八門(mén),所以實(shí)際中并沒(méi)有好的分析方法。
雖然花指令不能完全分析出,但在指令順序存儲(chǔ)的條件下,它對(duì)反匯編的影響效果有限,并不能影響到后面指令的反匯編。因?yàn)闄C(jī)器碼可見(jiàn),導(dǎo)致兩點(diǎn)不利1.開(kāi)始位置雖然很重要,但并不能成為決定性因素。對(duì)于錯(cuò)誤的代碼開(kāi)始位置,通過(guò)從此位置開(kāi)始往下反匯編,后面必然會(huì)出現(xiàn)機(jī)器碼找不到對(duì)應(yīng)的指令碼錯(cuò)誤,或出現(xiàn)很多不常見(jiàn)的指令。從而使反匯編程序可判斷出一個(gè)開(kāi)始位置是否正確。
2.前后指令段間不存在絕對(duì)的信賴(lài)關(guān)系?;ㄖ噶羁偸菚?huì)產(chǎn)生一些沖突,使反匯編程序知道指令被混淆了。如果前面的指令被混淆,反匯編程序可不絕對(duì)信任前面產(chǎn)生的指令開(kāi)始位置,而主要根據(jù)本段的機(jī)器碼來(lái)反匯編出正確的指令。這也還是因?yàn)殚_(kāi)始位置并不是決定性因素造成的。
因?yàn)橹噶畹拈_(kāi)始位置不能徹底影響反匯編,所以反匯編程序能將花指令影響的范圍局限到最小。破解者還是可見(jiàn)到后面的指令,從而從整體上分析加密的原理。
針對(duì)花指令的不足,我創(chuàng)新出了“變換指令存儲(chǔ)加密技術(shù)”,與花指令結(jié)合使用。對(duì)要加密的代碼段使用此技術(shù)后,能夠徹底破壞對(duì)機(jī)器碼的反匯編,將能反匯編的范圍限制到極小。另外此技術(shù)還可防范對(duì)軟件運(yùn)行的動(dòng)態(tài)跟蹤。使破解者無(wú)法對(duì)軟件進(jìn)行分析,從而達(dá)到保護(hù)的目的。
發(fā)明內(nèi)容
因?yàn)樵陧樞虻拇鎯?chǔ)方式下,指令的開(kāi)始位置并不能成為反匯編的決定因素,以致花指令并不能破壞對(duì)機(jī)器碼的反匯編。所以變換指令存儲(chǔ)加密技術(shù)改變了指令的存儲(chǔ)方式。
首先在指令中插入大量不影響程序運(yùn)行的花指令,增加需執(zhí)行的指令數(shù)量。然后打亂指令原來(lái)的順序存儲(chǔ)方式,將它們雜亂的存儲(chǔ)起來(lái)各指令的前后順序是隨機(jī)的,指令不再相互緊挨著、而是可以有空隙,空隙使用生成的指令或隨機(jī)數(shù)填充。
改變指令的存儲(chǔ)后,指令的開(kāi)始地址就不等于它的存儲(chǔ)地址了。因此建立一個(gè)開(kāi)始地址與存儲(chǔ)位置的映射表,根據(jù)指令的開(kāi)始地址可映射到它的存儲(chǔ)地址。此表并不只對(duì)正確的開(kāi)始地址才做映射,而是對(duì)加密范圍內(nèi)的每一個(gè)地址都作映射。例如某指令開(kāi)始地址為A,長(zhǎng)度為3,則地址A可映射到此指令的存儲(chǔ)地址,但A+1,A+2也各能映射到一條指令的存儲(chǔ)地址,且這2條指令與指令A(yù)毫無(wú)聯(lián)系,完全是隨機(jī)生成的。因此即使兩個(gè)輸入地址值只相差1,映射得到的指令也是完全不同。這是我這項(xiàng)技術(shù)的關(guān)鍵。附圖1是對(duì)此映射的畫(huà)圖描述。
改變了指令的存儲(chǔ)順序,建立好映射表后,對(duì)指令的加密結(jié)束。軟件運(yùn)行時(shí)則對(duì)加密后的代碼使用專(zhuān)門(mén)的處理程序。處理程序從第一條指令開(kāi)始根據(jù)開(kāi)始地址,映射出存儲(chǔ)地址,提取出指令,進(jìn)行指令的運(yùn)行。運(yùn)行完后可得下一條指令的開(kāi)始地址,再提取下一條指令再運(yùn)行。
改變了指令的存儲(chǔ)方式后,因?yàn)闄C(jī)器碼已不再可見(jiàn),后面的指令必須通過(guò)反匯編前面指令時(shí)產(chǎn)生的開(kāi)始位置得出(即使開(kāi)始位置相差只是1,查出的指令也都徹底不同了),從而使得指令的開(kāi)始位置已成為決定性因素。前后指令段間出現(xiàn)了絕對(duì)的信賴(lài)關(guān)系。
而對(duì)于前面”背景技術(shù)”中提到的檢驗(yàn)開(kāi)始位置是否正確的方法,因?yàn)槊總€(gè)地址值都對(duì)應(yīng)了一條指令,所以從錯(cuò)誤的地址開(kāi)始反匯編也一直能得到正常指令,從而此檢測(cè)方法無(wú)效。這樣導(dǎo)致反匯編程序雖然仍能使用花指令所引起的沖突發(fā)現(xiàn)指令被混淆,但已無(wú)法分析出相互沖突的開(kāi)始位置中哪些是錯(cuò)誤的。也就是說(shuō)已無(wú)法為后面指令的反匯編提供準(zhǔn)確的開(kāi)始位置,從而使得后面指令的反匯編成為不可能。
因此使用此技術(shù)與花指令配合,就可彌補(bǔ)花指令的不足,使花指令能從根本上破壞反匯編,影響的范圍就將不再能被局限到一小段,而是所有后面的指令都將無(wú)法反匯編出。因此對(duì)后面的指令,破解者最多只能看到一小段。這樣就無(wú)法進(jìn)行分析了,起到了保護(hù)原碼的作用。
破解的另一種方法就是跟蹤指令的執(zhí)行。因?yàn)榉磪R編被干擾后,后面能見(jiàn)的指令很少,因此跟蹤時(shí)每步前進(jìn)的距離也只能很小。而因?yàn)橐獔?zhí)行的指令數(shù)量已通過(guò)加入大量的花指令被極大擴(kuò)充了,2、3條的指令可以將它擴(kuò)充到2、3M。這樣破解者跟來(lái)跟去跟的都是些無(wú)用的指令。一個(gè)破解者再怎么有耐心,也不可能一點(diǎn)點(diǎn)的跟蹤數(shù)量級(jí)上M,甚至上G的指令,從而防范了對(duì)代碼的跟蹤。
因此,此技術(shù)防止了對(duì)代碼的分析和跟蹤,從而實(shí)現(xiàn)了對(duì)代碼的保護(hù)。
附圖是對(duì)三條示例指令做改變存儲(chǔ)順序處理后,原來(lái)的地址與改變后地址的映射圖。
具體實(shí)施例方式此技術(shù)可通過(guò)各種方式來(lái)編碼實(shí)現(xiàn)。最直接的方式是做成工具的形式供用戶使用用戶做好其軟件EXE程序后,在工具中指定所要加密的代碼區(qū)間,然后用此工具對(duì)軟件加密即可。工具將對(duì)指定的代碼區(qū)間進(jìn)行加密,然后增大原EXE程序的空間,以將生成的加密數(shù)據(jù)和處理程序?qū)懭耄⒓用艿膮^(qū)間清零,然后寫(xiě)上轉(zhuǎn)跳到解密處理程序中去的代碼。運(yùn)行時(shí)到達(dá)此代碼區(qū)間后,將進(jìn)入處理程序,對(duì)程序解密運(yùn)行,直至運(yùn)行出此區(qū)間為止。
下面詳細(xì)描述其加密和解密的具體操作過(guò)程
對(duì)于用戶指定的要加密的代碼段,首先匯編出其中所有的指令,然后在指令在中間加入大量不影響程序運(yùn)行的花指令,使指令的數(shù)量迅速膨脹。加入花指令后,即可建立映射表,此表為一個(gè)數(shù)組,每個(gè)單元存儲(chǔ)兩種信息指令的存儲(chǔ)地址和指令的長(zhǎng)度,數(shù)組單元個(gè)數(shù)為所加密代碼段加入花指令后的長(zhǎng)度。查表時(shí),指令的地址與加密區(qū)間開(kāi)始處地址的差值,即指令的偏移作為索引值,取出數(shù)組中相應(yīng)的元素即可。
然后對(duì)所有的指令進(jìn)行隨機(jī)的移動(dòng),使指令不再按原來(lái)順序的方式存儲(chǔ)。指令的移動(dòng)范圍不局限在原范圍內(nèi),可另分配空間來(lái)存儲(chǔ)指令,移動(dòng)后指令也不需再緊挨著,指令間可有空隙,空隙使用隨機(jī)生成的指令或隨機(jī)數(shù)填充。移動(dòng)后將指令新的存儲(chǔ)位置和指令的長(zhǎng)度填入映射表中。
現(xiàn)在映射表中各指令開(kāi)始地址所對(duì)應(yīng)的單元都已填好了,對(duì)于其它的單元也要填入正確指令的存儲(chǔ)地址。對(duì)每個(gè)單元,在移動(dòng)后的指令范圍內(nèi)、從任意位置開(kāi)始搜索,如果找到一條常見(jiàn)指令,則將此指令的存儲(chǔ)位置和長(zhǎng)度填入。這樣映射表內(nèi)每個(gè)單元都指向存儲(chǔ)指令空間內(nèi)的一條指令。
在軟件運(yùn)行時(shí),需對(duì)代碼進(jìn)行解密運(yùn)行。解密過(guò)程為事先在所加密的區(qū)間開(kāi)始處寫(xiě)上進(jìn)入處理程序的指令。在軟件運(yùn)行時(shí),到達(dá)所加密的區(qū)間時(shí),就會(huì)進(jìn)入處理程序,在處理程序中會(huì)使用一個(gè)全局變量存儲(chǔ)指令的開(kāi)始地址,初始值為變換前的第一條指令的開(kāi)始位置。
處理程序的運(yùn)行過(guò)程為先保護(hù)運(yùn)行環(huán)境,再分析開(kāi)始地址,如開(kāi)始地址不在加密區(qū)間內(nèi),則恢復(fù)運(yùn)行環(huán)境后,轉(zhuǎn)跳到相應(yīng)指令處,解密過(guò)程結(jié)束;如在加密區(qū)間內(nèi),則根據(jù)開(kāi)始地址取出指令的存儲(chǔ)地址和長(zhǎng)度,進(jìn)而取出指令。然后分析此指令,計(jì)算出下一個(gè)指令的開(kāi)始地址。分析過(guò)程需針對(duì)三種不同的指令分別處理1,普通指令,開(kāi)始地址+指令的長(zhǎng)度=下一個(gè)開(kāi)始地址;2,轉(zhuǎn)跳指令,如為條件轉(zhuǎn)跳先根據(jù)保存的運(yùn)行環(huán)境判斷是否要轉(zhuǎn)跳,如需轉(zhuǎn)跳則根據(jù)指令中的信息計(jì)算出下一個(gè)開(kāi)始地址;3,其它使用相對(duì)地址的指令(在Intel 80×86指令系統(tǒng)中只有CALL指令),改變指令中的相對(duì)地址,使其能正確運(yùn)行。
分析完指令后,進(jìn)行指令的運(yùn)行先恢復(fù)保存的運(yùn)行環(huán)境,再運(yùn)行指令。如果指令為轉(zhuǎn)跳指令,則不運(yùn)行此指令,而是直接轉(zhuǎn)入下一條指令的處理,因?yàn)檗D(zhuǎn)跳指令的意義就是指定后面所要運(yùn)行的指令。
如此循環(huán),直至運(yùn)行到加密區(qū)間范圍外,解密過(guò)程結(jié)束。
權(quán)利要求
1.變換指令存儲(chǔ)加密技術(shù)通過(guò)對(duì)軟件的機(jī)器碼進(jìn)行加密處理達(dá)到對(duì)軟件代碼的安全保護(hù),其特征是先在要加密的指令中加入干攏反匯編的指令,再將原來(lái)順序存儲(chǔ)的指令改用雜亂隨機(jī)的方式存儲(chǔ),并建立用于得到指令位置的映射表,執(zhí)行這些指令時(shí)使用專(zhuān)門(mén)的處理程序來(lái)執(zhí)行。
2.根據(jù)權(quán)利要求1所述的加入的干攏反匯編的指令,其特征是這些指令不會(huì)影響程序運(yùn)行,代碼所實(shí)現(xiàn)的功能與加入干擾指令前相同。
3.根據(jù)權(quán)利要求1所述的加入的干攏反匯編的指令,其特征是加入指令的數(shù)量可以人為的指定。
4.根據(jù)權(quán)利要求1所述的雜亂隨機(jī)的存儲(chǔ)方式,其特征是各指令的前后順序是隨機(jī)的,指令不用相互緊挨著、而是可以有空隙。
5.根據(jù)權(quán)利要求1所述的建立的用于得到指令位置的映射表,其特征是此表并不只對(duì)正確的指令開(kāi)始地址才做映射,而是對(duì)加密范圍內(nèi)的每一個(gè)地址都作映射。
6.根據(jù)權(quán)利要求1所述的用于執(zhí)行指令的處理程序,其特征是此程序一次只處理一條指令,并得到下一條指令。
全文摘要
一種新的計(jì)算機(jī)軟件的安全保護(hù)技術(shù),主要通過(guò)改變現(xiàn)有軟件順序存儲(chǔ)指令的方式,使指令的存儲(chǔ)變得雜亂而無(wú)規(guī)律,從而使對(duì)軟件的破解難以進(jìn)行,因此是一項(xiàng)反破解的技術(shù)。由于在改變指令順序前,在指令中加入了花指令,而這種雜亂的存儲(chǔ)方式能與花指令配合得極好,使花指令破壞反匯編的范圍極大增大,破解者已無(wú)法再對(duì)軟件的機(jī)器碼進(jìn)行反匯編,因此無(wú)法靜態(tài)分析;對(duì)于通過(guò)跟蹤軟件運(yùn)行來(lái)實(shí)現(xiàn)的動(dòng)態(tài)分析,在無(wú)法反匯編的情況下已只能單步跟蹤,而因?yàn)榧尤氲幕ㄖ噶顢?shù)量極多,通過(guò)單步跟蹤來(lái)分析的工作量將過(guò)于巨大,根本無(wú)法完成。所以使用此技術(shù)后破解者再無(wú)法分析軟件,從而達(dá)到反破解目的。
文檔編號(hào)G06F1/00GK1797263SQ20041007349
公開(kāi)日2006年7月5日 申請(qǐng)日期2004年12月27日 優(yōu)先權(quán)日2004年12月27日
發(fā)明者胡敏 申請(qǐng)人:胡敏