我眼中的加密與解密
來源:龍人計(jì)算機(jī)研究所 作者:站長 時(shí)間:2006-11-04 11:54:46
我接觸加密與解密已經(jīng)5個(gè)年頭了,在看雪論壇中也潛水了兩個(gè)春秋,卻一直不敢說自己的水平怎么樣.面對這個(gè)標(biāo)題,更是心有千言卻難以下筆.我只能說說我個(gè)人接觸加密解密的經(jīng)歷以及自己對加密解密的一些淺陋的看法,如果有不妥之處,還請各位高人多多指教. (一)我和破解
我是從游戲中熟悉電腦的,上了高中,我終于有了一臺(tái)自己的電腦.而我迷上破解是從借同學(xué)的一張光盤開始的.那張光盤上有一個(gè)目錄叫"高手區(qū)",里面除了有一些CrackMe的破解動(dòng)畫外,還有看雪論壇當(dāng)初編寫的那本"Crack Tutorial"(名字不一樣,內(nèi)容相同),現(xiàn)在看起來那些東西似乎顯得過于低級和簡單了,可不管怎樣畢竟是它們引領(lǐng)著我走進(jìn)了破解的大門,更確切的說,是走進(jìn)了計(jì)算機(jī)科學(xué)的世界(為什么?后面會(huì)說).
那本Crack Tutorial以及一些其他的破解動(dòng)畫確實(shí)給我了很多學(xué)習(xí)的東西,例如我印象最深的是幾句程序判斷注冊的"經(jīng)典組合":
1)cmp xxx,yyy
jz/jnz zzz
2)call xxx
test/or eax,eax
jz/jnz yyy
.........
現(xiàn)在你對這些可能不屑一顧,但以那個(gè)時(shí)候的加密解密水平來衡量的話,這已經(jīng)是很不錯(cuò)的了(不信可以翻翻2001年的看雪論壇精華)
可是,當(dāng)時(shí)我才高一,對計(jì)算機(jī)理論知之甚少,很快破解的學(xué)習(xí)便進(jìn)行不下去了,主要是很多指令都不懂,例如對于一條簡單的lea指令助記符,當(dāng)時(shí)我就是不懂諸如lea ebx,DWORD PTR [ebp + 4]之類的指令到底是什么含義,雖然現(xiàn)在看起來這些指令是那么的簡單,不僅如此,類似于消息循環(huán)等Windows程序的基本內(nèi)容我都一無所知.所以,高二的時(shí)候我便下定決心要學(xué)習(xí)匯編語言.我利用去大學(xué)參加競賽的機(jī)會(huì)買了一本x86匯編語言的教材,從此便開始了匯編語言的學(xué)習(xí).
學(xué)習(xí)匯編語言并不是一帆風(fēng)順的.不少人視匯編為畏途,認(rèn)為匯編是最難學(xué)習(xí)的語言之一,更何況我是自學(xué).在高中繁忙的學(xué)習(xí)中,如果每天能抽出半個(gè)小時(shí)看匯編就已經(jīng)很不錯(cuò)了,更要命的是有問題找不到人問,一切只能靠自己解決(有人問:看雪論壇呢?回答:當(dāng)時(shí)我上不了網(wǎng)),x86的基本架構(gòu),指令尋址方式等我都花了很長一段時(shí)間才弄明白.這段艱辛的路程至今仍然記憶猶新.
到了大學(xué),我有幸進(jìn)入了軟件工程系,得以繼續(xù)學(xué)習(xí)我感興趣的計(jì)算機(jī).我利用1年的時(shí)間我自學(xué)完了Windows編程(靠的就是羅云彬的那本<<Windows環(huán)境下32位匯編語言程序設(shè)計(jì)>>),過程同樣是曲折的,記得我有一次編寫多線程程序時(shí),程序怎么也不能正常結(jié)束,那時(shí)我花了3天的時(shí)間才弄明白原因:書上內(nèi)容有誤......
我買了<<加密與解密>>又一次開始學(xué)習(xí),也是正式開始學(xué)習(xí)破解,到這個(gè)時(shí)候,我發(fā)現(xiàn),書上講的那些例子是那么簡單易懂,高中第一次看加密解密時(shí)的疑惑這時(shí)全部無影無蹤了.看雪論壇上不少的精華文章都能毫無困難的讀懂.我深深感到當(dāng)初選擇學(xué)習(xí)匯編語言是正確的,正是因?yàn)槟菚r(shí)的選擇才使得現(xiàn)在學(xué)習(xí)破解才如此的順利.
如今我仍然在學(xué)習(xí)<<加密與解密>>,但同時(shí)有有了新的挑戰(zhàn):學(xué)習(xí)保護(hù)模式Windows驅(qū)動(dòng)程序的編寫.
我對看雪論壇的認(rèn)識(shí)也是從那本Crack Tutorial開始的,看雪論壇是我兩個(gè)每次上網(wǎng)必去的論壇之一(另一個(gè)是霏凡論壇),不過當(dāng)時(shí)論壇很不穩(wěn)定,經(jīng)常上不去,而且系統(tǒng)換來換去的(以后才知道是遭到攻擊了),后來我家安裝了包月的寬帶,我才真正成為看雪論壇的?,并在04年7月份注冊了現(xiàn)在的帳號.看雪論壇確實(shí)是很好的論壇,國內(nèi)沒有其他破解相關(guān)論壇的質(zhì)量有它高的.正是由于大家的無私奉獻(xiàn)才造就了今日的看雪論壇.翻開看雪論壇精華集,對比一下2001年的精華1和2005年的精華7,感慨萬千啊.
(二)為什么要學(xué)破解
記得當(dāng)初初識(shí)破解時(shí),我覺得破解很神秘高深,那些大牛破解了軟件還不忘在軟件上留個(gè)名,多么風(fēng)光啊.正是由于這種動(dòng)機(jī)才促使我努力去成為一名破解高手.如今的我當(dāng)然還不能稱為高手,可是我知道,我在成為高手的路上又走了一步.此時(shí)破解對于我來說已經(jīng)不只是簡單爆破幾個(gè)玩具程序,它包含了更多更廣的內(nèi)容,如逆向工程.在學(xué)習(xí)破解的過程中,我不斷學(xué)習(xí)到很多相關(guān)的東西,如SEH,PE文件的結(jié)構(gòu)等知識(shí).我曾經(jīng)計(jì)劃用10年的時(shí)間成為破解高手,現(xiàn)在已經(jīng)過去了接近5年,不管到時(shí)候怎么樣,我的目標(biāo)不會(huì)變.10年不行就15年.因?yàn)槠平庖呀?jīng)成為我的興趣,一種探索計(jì)算機(jī)世界的興趣.所以說,當(dāng)初的那些簡易的Crack教程引領(lǐng)我走進(jìn)了計(jì)算機(jī)世界的大門,不僅僅是破解的.
(三)我對加密解密的一些個(gè)人看法
此部分內(nèi)容如有不妥之處還請各位指正
1.關(guān)于學(xué)習(xí)加密與解密
各位從我的經(jīng)歷可以看出來,當(dāng)初我是對計(jì)算機(jī)一無所知,到現(xiàn)在初步掌握了破解技術(shù),其間走過了不少彎路.關(guān)于如何學(xué)習(xí)加密與解密我就不多說了,看雪大哥有文章,置頂貼也有相關(guān)的說明(http://bbs.pediy.com//showthread.php?s=&threadid=769),我只是結(jié)合自己的經(jīng)歷來說明
----關(guān)于對"初學(xué)者"的一些提醒
學(xué)習(xí)加密解密的有兩類人,其一對計(jì)算機(jī)已經(jīng)有一些了解,例如懂匯編語言,懂計(jì)算機(jī)體系結(jié)構(gòu)等等,只是不知道如何把知識(shí)應(yīng)用到加密解密這一方面.這類人是真正的初學(xué)者.他們學(xué)習(xí)加密解密會(huì)比較容易,花的精力也會(huì)比較少.其二則是對計(jì)算機(jī)知之甚少,例如那些不懂匯編語言的,也就是和我當(dāng)初一樣.恕我直言,這類人其實(shí)不能稱為"初學(xué)者",充其量只是"門外漢"而已,論壇上很多初級問題正是他們提出的(如某某指令的含義是什么等,這可以去查Intel的手冊的).他們?nèi)绻脒_(dá)到一種比較高的層次,就必須花很多的時(shí)間和精力.但問題是,你有這么多的時(shí)間和精力嗎?我當(dāng)初從一無所知到現(xiàn)在花了5年的時(shí)間----我當(dāng)時(shí)才高二,時(shí)間和精力都有.對于第二類人,我不懷疑你們的主觀因素,相信其中有不少是愿意學(xué)習(xí)破解的,對破解真正感興趣的,也是有耐心愿意學(xué)習(xí)的.但是我很懷疑你們的客觀條件----時(shí)間和精力.學(xué)習(xí)破解基本上相當(dāng)于學(xué)習(xí)大學(xué)兩年的課程還多(如果你想成為高手).所以,如果你們想學(xué)好破解,想成為高手,首先要想想是否有充足的時(shí)間和精力.如果沒有就不要浪費(fèi)太多了,能玩玩幾個(gè)簡單的程序就可以了.
2.關(guān)于軟件加密問題
有句話說:理論上任何軟件只要能完整運(yùn)行所有功能一次即可PJ.其實(shí)更準(zhǔn)確的說法是這樣:
(在Cracker不增加功能模塊的前提下)任何一個(gè)軟件,如果所有功能都能夠在本地機(jī)器上運(yùn)行至少一次,那么這個(gè)軟件經(jīng)過修改一定可以無限制的在本地機(jī)器上運(yùn)行所有功能.(可以被PJ)
證明:在軟件運(yùn)行每一個(gè)功能模塊時(shí)抽出此功能模塊代碼,然后將它們組合就成為PJ后的軟件了(注意是理論上的證明)
逆命題也對:
如果一個(gè)軟件可以被PJ,那么它的所有功能一定可以在本地機(jī)器上運(yùn)行至少一次
證明:假設(shè)某軟件已經(jīng)被PJ,但是它的某功能不能在本地機(jī)器上運(yùn)行,也就是說,從軟件中得不到這個(gè)模塊的代碼,那么PJ后的代碼中是如何有這一段代碼的呢?注意前提:Cracker不增加功能模塊
因此,一個(gè)軟件可以被PJ 等價(jià)于 它的所有功能可以在本地機(jī)器上運(yùn)行至少一次
也就是說,
一個(gè)軟件不能被PJ 等價(jià)于 它不可能在本地機(jī)器運(yùn)行所有功能一次
要打造(理論上)不能被破解的軟件,這是一條基本原則
例如,Demo版的軟件沒有某個(gè)功能模塊代碼,那如果Cracker不自己寫代碼是無論如何也不可能PJ成全功能的軟件的.
在第6期的看雪論壇精華中有篇文章<<保護(hù)軟件著作權(quán)要注意避免的思路誤區(qū)>>,作者是廖紅旭,作者一針見血的指出當(dāng)前軟件保護(hù)的關(guān)鍵失誤是"簡單地通過條件判斷語句來“甄別”合法用戶",就是說,把整個(gè)保護(hù)的"終審權(quán)"交給一個(gè)簡單的條件判斷語句.應(yīng)當(dāng)說,作者是非常正確的,但是他提出的方案(“不論前述認(rèn)證結(jié)果正確與否,都將該認(rèn)證結(jié)果再次作為算子,經(jīng)過必要運(yùn)算后對發(fā)行前已受保護(hù)的軟件核心功能代碼進(jìn)行解碼”,<<加密與解密>>第二版P224的思想類似)也不能徹底解決這個(gè)問題,因?yàn)橐坏〤racker得到了一個(gè)可用的Key,那么這個(gè)軟件就相當(dāng)于可以執(zhí)行所有功能一次,也就是可以PJ,作者自己也承認(rèn)這一點(diǎn).
計(jì)算機(jī)=硬件+軟件+網(wǎng)絡(luò),所以,加密和解密也必須體現(xiàn)這個(gè)特征.
考慮等價(jià)條件:它不可能在本地機(jī)器運(yùn)行所有功能一次,怎樣才能滿足這個(gè)條件?思路如下:
a.本地機(jī)器上不能存在所有功能代碼.
這是Demo版軟件的特征,那么,正式版應(yīng)當(dāng)如何處理呢?
b.在非本地機(jī)器上存在本地機(jī)器缺失的代碼,且這段代碼不能在本地機(jī)器上執(zhí)行(否則就相當(dāng)于本地機(jī)器有所有代碼)
如果認(rèn)為這"非本地機(jī)器"是硬件,那么就有狗加密方案,如果認(rèn)為是網(wǎng)絡(luò)服務(wù)器,那么就有CS模式方案
寫得很亂,畢竟是自己的原創(chuàng),不妥之處還請各位多多批評指正