電腦軟件為什么那么容易被破解?
????理論上不存在無法破解的軟件,但并不是說破解軟件比開發(fā)容易一萬倍,防破解的目的不是要做一個(gè)無法破解的軟件,而是:
? ??讓破解軟件的成本遠(yuǎn)大于購(gòu)買軟件的成本话原,知名軟件大多都有實(shí)力讓軟件破解難度大大加大,但出于市場(chǎng)需求和爭(zhēng)取用戶的角度考慮牢撼,會(huì)放水!
我們先來一個(gè)最最簡(jiǎn)單的軟件破解,假設(shè)我們寫了一個(gè)軟件,它的注冊(cè)手段代碼如下
? ? 就算是今天,仍然有一大堆軟件采用這種軟件保護(hù)機(jī)制,不過這類軟件要不大多不怎么值錢比如xx管理系統(tǒng),計(jì)算器之類的,要不就是軟件作者別有用心防君子不防小人。
????問題出在那了呢,這類保護(hù)機(jī)制的問題是,目前大部分的編譯器都會(huì)將字符串常量直接存儲(chǔ)在可執(zhí)行文件結(jié)構(gòu)中,所以你要是硬編碼key,那么上面這種破解方法幾乎是屢試不爽甚至不需要什么逆向破解知識(shí)就能搞定。
????讓我們進(jìn)入防破解V2.0時(shí)代,為了與時(shí)俱進(jìn),我們稍微把上面的代碼改一下值骇。
????怎么樣,這種保護(hù)手段是不是熟悉的味道熟悉的配方,這個(gè)機(jī)器碼可以從網(wǎng)卡MAC,CPU型號(hào),內(nèi)存大小等等等等去生成,當(dāng)然,key的算法也可以拉上MD5,SHA等等等等手段來弄而不是簡(jiǎn)簡(jiǎn)單單的乘一個(gè)8再加上123456,總之從機(jī)器碼到注冊(cè)碼的算法你能玩出花。
? ??然并軟移国!? 打開ollydbg,對(duì)MessageBoxA下斷點(diǎn)(也就是彈窗的函數(shù))
????然后輸入一個(gè)錯(cuò)誤的注冊(cè)碼,命中斷點(diǎn),很快,我們來到了判斷注冊(cè)碼是否正確的邏輯處理代碼吱瘩。
????你會(huì)發(fā)現(xiàn),握草,不管我輸入什么,都是注冊(cè)成功
????那么問題出在哪了呢,你發(fā)現(xiàn),萬惡之源都始于那個(gè)MessageBox函數(shù),正是這個(gè)函數(shù),讓我們順藤摸瓜找到了注冊(cè)碼判斷代碼,時(shí)至今日,仍然有非常非常大的一部分軟件使用著這個(gè)二三十年前就在用的保護(hù)手段,每年死于MessageBox被破解的軟件,圍起來可以繞地球三圈.也就是這個(gè)保護(hù)機(jī)制,成就了所謂軟件發(fā)布后十分鐘就被破解的悲慘結(jié)局。
????這個(gè)時(shí)候,你痛定思痛,mmp,有內(nèi)鬼,既然MessageBox不好用,那我不用就是了,于是你把代碼改成下面這樣迹缀。
????可惜,內(nèi)鬼年年有,"注冊(cè)成功"幾個(gè)字還是出賣了你,打開ollydbg,查找字符串參考,然后雙擊搅裙。
????哦豁,完蛋,換湯不換藥,還是給逮住了。
????你察覺到這樣一個(gè)地方判斷注冊(cè)碼實(shí)在不靠譜,所以,你改變了策略,把檢查注冊(cè)碼的代碼復(fù)制了n遍,或者逐字符檢查注冊(cè)碼的準(zhǔn)確性裹芝,還有人將注冊(cè)成功等字樣進(jìn)行加密或混淆部逮,等到要用的時(shí)候再取出來。
????你放心,不管你復(fù)制多少次,要找出來都是時(shí)間問題,遲早是會(huì)被破解的.同時(shí)只要你要用到明文字符串你遲早還是要解密的嫂易,這種手段類似于加upx壓縮殼兄朋,只需要等待數(shù)據(jù)解壓完成,所有的東西又都是明文的了。因此比較聰明的做法是颅和,要用時(shí)解密傅事,用完后馬上把明文抹掉,這樣說不定能拖延更長(zhǎng)的時(shí)間峡扩。但這仍然也是時(shí)間問題蹭越。
????你開始發(fā)現(xiàn),與其揪出內(nèi)鬼,不如主動(dòng)出擊,也就是我們著名的與其解決問題不如解決提出問題的人,終于,你開始對(duì)調(diào)試器下手了,然后你成功進(jìn)化到防破解V2.5時(shí)代.
????這個(gè)時(shí)候,不得不介紹一個(gè)老掉牙的但非常有名的函數(shù)
IsDebugPresent
????你可能有點(diǎn)懵,這個(gè)函數(shù)是干啥子用的?,簡(jiǎn)單來說,當(dāng)我們破解一個(gè)程序的時(shí)候,大部分情況下我們會(huì)打開一個(gè)叫調(diào)試器的東西來對(duì)軟件進(jìn)行反編譯分析,誒,重點(diǎn)就在這,IsDebugPresent這個(gè)函數(shù),就能檢測(cè)我們的程序有沒有被一個(gè)調(diào)試器附加,你想啊,正常情況我們用軟件誰會(huì)吃飽撐著附加一個(gè)調(diào)試器來用,你要是用調(diào)試器附加我,你肯定就是想干壞事.
于是,你開始把代碼寫成這樣:
????于是,當(dāng)下次再ollydbg加載調(diào)試你的程序的時(shí)候,就會(huì)出現(xiàn)下面的情景。
????曾經(jīng)很長(zhǎng)一段時(shí)間(包括現(xiàn)在),很多軟件或加密殼都會(huì)檢查是否有調(diào)試器正在調(diào)試自己,比如tls段會(huì)在加載時(shí)被執(zhí)行,如果檢查到自己正在被人調(diào)試破解,就會(huì)設(shè)置一個(gè)tag讓程序跑到?jīng)]啥用的地方去或者直接退出重新,也有利用變形的PE頭讓調(diào)試器無法加載,總之手段很多教届。
????可惜這還是沒什么卵用,比如IsDebugPresent可以通過修改FS寄存器的標(biāo)志位來讓它徹底啞火,同樣的手段包括但不限于檢查int 3軟中斷,Raw Call,Query PEB,檢查Debug Privilege和父進(jìn)程等等等等,都有繞過的方式响鹃。
????暗樁嘛,只要你插,一個(gè)一個(gè)拔總是拔的完的。
????好了,還有啥法子不,放心道高一尺魔高一丈,現(xiàn)在我們來到了現(xiàn)在最流行的,防破解V3.0 VMP時(shí)代案训。
????先澄清一下,這里的VMP并不是VMP殼,它全程叫Virtual Machine Protection,簡(jiǎn)單來說,為啥我們破解軟件那么輕車熟路,還不是因?yàn)閤86 x64 arm的那堆匯編指令集我們太熟悉了唄.要是我們自己發(fā)明一套指令集,然后用這個(gè)指令集寫程序并運(yùn)行在我們自己的虛擬機(jī)上,那么,破解者一進(jìn)來,看到的不就是一臉懵逼了么买置。
????可惜的是,VM的運(yùn)行機(jī)制決定了它可能造成幾十倍乃至幾百倍的性能損失,所以,VMP必須用于保護(hù)那種關(guān)鍵且不是性能瓶頸的代碼,否者你的軟件跑起來就會(huì)像。
????那么,VMP保護(hù)機(jī)制是完美的么,當(dāng)然不是,VMP說白了,也只能做到延長(zhǎng)分析時(shí)間,你要是把VMP做的足夠復(fù)雜,足夠讓一個(gè)Cracker醉生夢(mèng)死了,但是如果這個(gè)時(shí)間足夠久,你的軟件足夠的值錢讓人有欲望來破解, 他們?nèi)匀豢梢猿浞值胤治瞿鉜M機(jī)的運(yùn)行機(jī)制,當(dāng)你的VM機(jī)運(yùn)行機(jī)制被摸清了,軟件就離淪陷不遠(yuǎn)了.
? 不過你可以放心,分析VM機(jī)執(zhí)行機(jī)理,可比自己寫VM機(jī)要頭疼多了,畢竟一個(gè)是你需要通過代碼來揣測(cè)別人的思路,而另一個(gè)本身是自己的思路轉(zhuǎn)為代碼,因此基于這點(diǎn)可以說:
? 破解軟件比制作軟件簡(jiǎn)單,在很多情況下,不存在的!
????你可能會(huì)問了,為什么現(xiàn)在市面上那么多軟件,那么多游戲,購(gòu)買了那么多聽起來那么牛逼的保護(hù)軟件,結(jié)果還是被破解了.而且剛發(fā)出來一天就被破解了强霎。
? ? ???? 其實(shí)很大的問題就出在這個(gè)商業(yè)保護(hù)軟件(比如保護(hù)殼)上,因?yàn)檫@類保護(hù)殼大多都會(huì)被賣給一大票的軟件開發(fā)商,有一句話叫樹大招風(fēng),就像現(xiàn)在流行的VMP保護(hù)機(jī)制,之所以能保護(hù),是因?yàn)槠溥\(yùn)行機(jī)理破解者不明確,如果你這個(gè)軟件就給自己用,而且你這軟件還不怎么值錢,除非大佬空虛寂寞冷,不然誰會(huì)有那閑工夫去分析你的虛擬機(jī)是怎么跑的,但商業(yè)保護(hù)殼不同,不論其采用什么樣的保護(hù)機(jī)制,只要分析過一遍搞清楚了,幾乎所有使用這類保護(hù)機(jī)制的軟件都會(huì)淪陷,而且在灰色產(chǎn)業(yè)上.這種破解甚至還頗有利可圖,只要這個(gè)保護(hù)機(jī)制不更新,一次投入,長(zhǎng)期回報(bào).于是只有說在第一次分析時(shí)會(huì)花上很長(zhǎng)的時(shí)間,之后就都只是玩套路了忿项。
? ? 因此,購(gòu)買商業(yè)保護(hù)殼,其實(shí)其保護(hù)效果并沒有想象中的那么強(qiáng),很可能在灰色產(chǎn)業(yè)中形同虛設(shè),甚至一個(gè)具有反逆向基礎(chǔ)的碼農(nóng)自己寫的說不定還更有效果.當(dāng)然一個(gè)軟件是被破解概率高不高,仍然是我之前提到的那句話:防破解不是讓軟件無法破解,而是讓破解軟件的成本遠(yuǎn)大于購(gòu)買軟件的成本。
畢竟你說你一個(gè)軟件拿來開源都沒人愛用,你還整天琢磨著怎么才不會(huì)被破解,寒摻不老鐵.
? 那么你會(huì)開始問了,有沒有更給力點(diǎn)的防破解技術(shù)?好像之前說的說來說去,無非就是拖延時(shí)間,誒,這個(gè)我們要擺正心態(tài),不論是加密還是破解,其實(shí)說白了最終就是拖延時(shí)間,你看那些加密算法,依據(jù)其數(shù)學(xué)理論,如果要破解,它的計(jì)算量就算你把全世界的計(jì)算機(jī)加起來一塊算,也夠你算三個(gè)世界末日了.
? 不過別擔(dān)心,更給力的方法還是有的,你想啊,為什么我們之前說了那么多軟件都被破解了,最最關(guān)鍵的一個(gè)原因,是我們能搞到代碼,即使這個(gè)代碼已經(jīng)是經(jīng)過編譯后的一堆匯編指令,但只要我們有這堆代碼,遲早我們還是能搞懂這個(gè)程序是怎么回事的,然后我們就可以對(duì)癥下藥干壞事.
? 這就像給你有一包面粉,而程序就是一個(gè)面包機(jī),你把面粉塞進(jìn)面包機(jī)做出了面包,有天你好奇啊,這面包機(jī)咋整咋整就出來一塊面包了呢,你就動(dòng)手把面包機(jī)拆了,然后你就知道面包機(jī)是怎么回事了城舞。
? 所以有沒有辦法不讓用戶知道我們的代碼是什么樣的呢,就像你把面粉交給了面包師傅做面包,這個(gè)面包是怎么做的,你就只能指望看面包師傅有沒有這個(gè)心情告訴你了.
? 為此,有請(qǐng)?jiān)缙谝粋€(gè)相當(dāng)流行且普遍的游戲防破解工具(物理)
????你現(xiàn)在可能表情是一臉問號(hào),但我沒和你開玩笑,在2000年時(shí)代,大部分的游戲運(yùn)行在光盤CD中,但盜版也容易啊,把光盤里的數(shù)據(jù)一復(fù)制下來,然后就可以復(fù)制出一萬張盜版光碟,所以游戲廠商們就想辦法,想來想去就想到了榔頭轩触。
????? 其操作方法很簡(jiǎn)單,拿榔頭和釘子,在光盤上釘幾條刮痕出來,造成人工的壞道,然后再將數(shù)據(jù)燒錄到正確的扇區(qū)中,這樣下來雖然程序還是可以正確運(yùn)行,但是當(dāng)光頭讀盤讀到這個(gè)壞道的時(shí)候,就會(huì)讀不過去,于是你會(huì)發(fā)現(xiàn)打開光盤后,沒有關(guān)鍵的文件,這樣你就沒辦法將游戲或者說程序拷貝出來了,同時(shí)還會(huì)對(duì)壞道的位置做一個(gè)標(biāo)記,游戲運(yùn)行時(shí)也會(huì)檢查這個(gè)標(biāo)記,那么想要盜版你就也得拿起榔頭在光盤同樣的位置上砸出同樣的刮痕出來,當(dāng)然,這幾乎是不可能的。
????可惜虛擬光驅(qū)出現(xiàn)后,同樣有辦法復(fù)刻光盤的一切數(shù)據(jù)(包括壞道),所以,這個(gè)技術(shù)拿到今天來看并沒有什么卵用.不過這仍然給了我們足夠的啟發(fā)家夺。
? ? ???? 現(xiàn)在讓我們進(jìn)入防破解V3.x時(shí)代,之所以不叫V4.0是因?yàn)檫@類技術(shù)很早就有并且比VMP保護(hù)流行的時(shí)間還早的多,而且它可能是最近接理論上不可破解的防破解手段脱柱。
? ???? 我們先聊的是加密狗或者又叫Ukey保護(hù),就是運(yùn)行軟件你需要插入一個(gè)U盤一樣的東西到電腦上,實(shí)際上這個(gè)Ukey是一個(gè)微型電腦,軟件的一些關(guān)鍵的算法和代碼,都在這個(gè)UKey的芯片里,當(dāng)我們PC上的軟件運(yùn)行后,當(dāng)我們需要執(zhí)行這類關(guān)鍵算法時(shí),我們會(huì)向這個(gè)Ukey傳遞數(shù)據(jù),然后UKey將結(jié)果計(jì)算出來,返回給PC的軟件上,這樣就避免了用戶直接能夠逆向取得關(guān)鍵的算法代碼,破解也就無從談起了.這也就是為什么到了今天,Ukey保護(hù)仍然非常的流行。
? ????可惜,UKey保護(hù)仍然有諸多的限制,首先就是帶著一個(gè)Ukey賊麻煩,萬一UKey丟了補(bǔ)辦是一個(gè)麻煩事,運(yùn)行軟件插Ukey也是個(gè)神煩的事情,同時(shí),UKey的性能決定了它可能不能執(zhí)行一些過于消耗性能和內(nèi)存空間的代碼,數(shù)據(jù)交互也因帶寬和通訊延遲會(huì)造成性能損失,所以它和VMP保護(hù)機(jī)制一樣,同樣不是一個(gè)省油的燈,同時(shí)開發(fā)人員的水平不到位,該保護(hù)的代碼沒保護(hù),保護(hù)來沒啥用的代碼塞了一堆,也會(huì)給Cracker帶來機(jī)會(huì),而且只要你的軟件夠值錢,你是不是太瞧不起我華強(qiáng)北了秦踪。
????把Ukey拆開來,使用某種"藥水"剝開外層找到內(nèi)部的芯片并接上已經(jīng)熔斷的"讀引腳"(有些芯片連這步都省了,直接熱風(fēng)槍一吹接板讀ROM) 然后再把芯片的代碼給讀出來褐捻。
于是,UKey保護(hù)也宣布淪陷。
????? 你發(fā)現(xiàn),只要是把實(shí)體的東西交到用戶的手上,遲早會(huì)出問題,所以,這個(gè)Ukey保護(hù)現(xiàn)在大部分情況下變成了帶數(shù)字證書的網(wǎng)絡(luò)驗(yàn)證模式,這類的關(guān)鍵代碼從Ukey轉(zhuǎn)移到了服務(wù)器上,數(shù)據(jù)交互通過網(wǎng)絡(luò)來做.其實(shí)這種保護(hù)機(jī)制和Ukey保護(hù)原理是一樣的并沒有什么本質(zhì)的區(qū)別,但同樣處于網(wǎng)絡(luò)帶寬也延遲的考慮,同樣具有一定的性能損失和設(shè)計(jì)缺陷椅邓。
????需要重點(diǎn)提及的是,這類網(wǎng)絡(luò)保護(hù)的手段必須專門設(shè)計(jì)以保護(hù)程序中的一系列關(guān)鍵"功能"代碼而不是"防破解"代碼(比如代碼解密,注冊(cè)驗(yàn)證),因?yàn)楹笳邘缀鯖]啥卵用仍然能夠?qū)?防破解"的代碼清除或Dump解密代碼或偽造本地服務(wù)器實(shí)現(xiàn)破解柠逞。
? ???? 所以你指望一堆什么x盾,x寶一鍵能一勞永逸一鍵保護(hù)程序,程序必須經(jīng)過專業(yè)碼農(nóng)而不是彩筆專門的設(shè)計(jì)才能起到其應(yīng)有的保護(hù)效果。
? ????但現(xiàn)實(shí)情況是,處于用戶離線運(yùn)行和性能延遲瓶頸的考慮,這種網(wǎng)絡(luò)保護(hù)設(shè)計(jì)的往往都有很大的缺陷,因此,并不是說這東西不好,而是理想很豐滿現(xiàn)實(shí)很骨干,實(shí)在無能為力啊景馁。