關(guān)于CRC碼的基本知識(shí).doc_第1頁(yè)
關(guān)于CRC碼的基本知識(shí).doc_第2頁(yè)
關(guān)于CRC碼的基本知識(shí).doc_第3頁(yè)
關(guān)于CRC碼的基本知識(shí).doc_第4頁(yè)
關(guān)于CRC碼的基本知識(shí).doc_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 CRC碼工作原理1. CRC校驗(yàn)原理 CRC的英文全稱為Cyclic Redundancy Check(Code),中文名稱為循環(huán)冗余校驗(yàn)(碼)。它是一類重要的線性分組碼,編碼和解碼方法簡(jiǎn)單,檢錯(cuò)和糾錯(cuò)能力強(qiáng),在通信領(lǐng)域廣泛地用于實(shí)現(xiàn)差錯(cuò)控制。 CRC計(jì)算與普通的除法計(jì)算有所不同。普通的除法計(jì)算是借位相減的,而CRC計(jì)算則是異或運(yùn)算。任何一個(gè)除法運(yùn)算都需要選取一個(gè)除數(shù),在CRC運(yùn)算中我們稱之為poly,而寬度W就是poly最高位的位置。比如poly 1001的W是3,而不是4。注意最高位總是1,當(dāng)你選定一個(gè)寬度,那么你只需要選擇低W各位的值。假如我們想計(jì)算一個(gè)位串的CRC碼,并要保證每一位都要被處理,因此我們需要在目標(biāo)位串后面加上W個(gè)0。 CRC校驗(yàn)原理看起來(lái)比較復(fù)雜,因?yàn)榇蠖鄶?shù)書(shū)上基本上是以二進(jìn)制的多項(xiàng)式形式來(lái)說(shuō)明的。其實(shí)很簡(jiǎn)單的問(wèn)題,其根本思想就是先在要發(fā)送的幀后面附加一個(gè)數(shù)(這個(gè)就是用來(lái)校驗(yàn)的校驗(yàn)碼,但要注意,這里的數(shù)也是二進(jìn)制序列的,下同),生成一個(gè)新幀發(fā)送給接收端。當(dāng)然,這個(gè)附加的數(shù)不是隨意的,它要使所生成的新幀能與發(fā)送端和接收端共同選定的某個(gè)特定數(shù)整除(注意,這里不是直接采用二進(jìn)制除法,而是采用一種稱之為“模2除法”)。到達(dá)接收端后,再把接收到的新幀除以(同樣采用“模2除法”)這個(gè)選定的除數(shù)。因?yàn)樵诎l(fā)送端發(fā)送數(shù)據(jù)幀之前就已通過(guò)附加一個(gè)數(shù),做了“去余”處理(也就已經(jīng)能整除了),所以結(jié)果應(yīng)該是沒(méi)有余數(shù)。如果有余數(shù),則表明該幀在傳輸過(guò)程中出現(xiàn)了差錯(cuò)。【說(shuō)明】“模2除法”與“算術(shù)除法”類似,但它既不向上位借位,也不比較除數(shù)和被除數(shù)的相同位數(shù)值的大小,只要以相同位數(shù)進(jìn)行相除即可。模2加法運(yùn)算為:1+1=0,0+1=1,0+0=0,無(wú)進(jìn)位,也無(wú)借位;模2減法運(yùn)算為:1-1=0,0-1=1,1-0=1,0-0=0,也無(wú)進(jìn)位,無(wú)借位。相當(dāng)于二進(jìn)制中的邏輯異或運(yùn)算。也就是比較后,兩者對(duì)應(yīng)位相同則結(jié)果為“0”,不同則結(jié)果為“1”。如100101除以1110,結(jié)果得到商為11,余數(shù)為1,如圖5-9左圖所示。如1111=101,如圖5-9右圖所示。圖5-9“模2除法”和“模2乘法”示例 具體來(lái)說(shuō),CRC校驗(yàn)原理就是以下幾個(gè)步驟: (1)先選擇(可以隨機(jī)選擇,也可按標(biāo)準(zhǔn)選擇,具體在后面介紹)一個(gè)用于在接收端進(jìn)行校驗(yàn)時(shí),對(duì)接收的幀進(jìn)行除法運(yùn)算的除數(shù)(是二進(jìn)制比較特串,通常是以多項(xiàng)方式表示,所以CRC又稱多項(xiàng)式編碼方法,這個(gè)多項(xiàng)式也稱之為“生成多項(xiàng)式”)。 (2)看所選定的除數(shù)二進(jìn)制位數(shù)(假設(shè)為k位),然后在要發(fā)送的數(shù)據(jù)幀(假設(shè)為m位)后面加上k-1位“0”,然后以這個(gè)加了k-1個(gè)“0“的新幀(一共是m+k-1位)以“模2除法”方式除以上面這個(gè)除數(shù),所得到的余數(shù)(也是二進(jìn)制的比特串)就是該幀的CRC校驗(yàn)碼,也稱之為FCS(幀校驗(yàn)序列)。但要注意的是,余數(shù)的位數(shù)一定要是比除數(shù)位數(shù)只能少一位,哪怕前面位是0,甚至是全為0(附帶好整除時(shí))也都不能省略。 (3)再把這個(gè)校驗(yàn)碼附加在原數(shù)據(jù)幀(就是m位的幀,注意不是在后面形成的m+k-1位的幀)后面,構(gòu)建一個(gè)新幀發(fā)送到接收端,最后在接收端再把這個(gè)新幀以“模2除法”方式除以前面選擇的除數(shù),如果沒(méi)有余數(shù),則表明該幀在傳輸過(guò)程中沒(méi)出錯(cuò),否則出現(xiàn)了差錯(cuò)。 通過(guò)以上介紹,大家一定可以理解CRC校驗(yàn)的原理,并且不再認(rèn)為很復(fù)雜吧。 從上面可以看出,CRC校驗(yàn)中有兩個(gè)關(guān)鍵點(diǎn):一是要預(yù)先確定一個(gè)發(fā)送端和接收端都用來(lái)作為除數(shù)的二進(jìn)制比特串(或多項(xiàng)式);二是把原始幀與上面選定的除進(jìn)行二進(jìn)制除法運(yùn)算,計(jì)算出FCS。前者可以隨機(jī)選擇,也可按國(guó)際上通行的標(biāo)準(zhǔn)選擇,但最高位和最低位必須均為“1”,如在IBM的SDLC(同步數(shù)據(jù)鏈路控制)規(guī)程中使用的CRC-16(也就是這個(gè)除數(shù)一共是17位)生成多項(xiàng)式g(x)=x16+x15+x2+1(對(duì)應(yīng)二進(jìn)制比特串為:11000000000000101);而在ISO HDLC(高級(jí)數(shù)據(jù)鏈路控制)規(guī)程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多項(xiàng)式g(x)=x16+x15+x5+1(對(duì)應(yīng)二進(jìn)制比特串為:11000000000100001)。2.CRC校驗(yàn)碼的計(jì)算示例 由以上分析可知,既然除數(shù)是隨機(jī),或者按標(biāo)準(zhǔn)選定的,所以CRC校驗(yàn)的關(guān)鍵是如何求出余數(shù),也就是CRC校驗(yàn)碼。 下面以一個(gè)例子來(lái)具體說(shuō)明整個(gè)過(guò)程?,F(xiàn)假設(shè)選擇的CRC生成多項(xiàng)式為G(X)= X4+ X3+ 1,要求出二進(jìn)制序列10110011的CRC校驗(yàn)碼。下面是具體的計(jì)算過(guò)程: (1)首先把生成多項(xiàng)式轉(zhuǎn)換成二進(jìn)制數(shù),由G(X)= X4+ X3+ 1可以知道(,它一共是5位(總位數(shù)等于最高位的冪次加1,即4+1=5),然后根據(jù)多項(xiàng)式各項(xiàng)的含義(多項(xiàng)式只列出二進(jìn)制值為1的位,也就是這個(gè)二進(jìn)制的第4位、第3位、第0位的二進(jìn)制均為1,其它位均為0)很快就可得到它的二進(jìn)制比特串為11001。 (2)因?yàn)樯啥囗?xiàng)式的位數(shù)為5,根據(jù)前面的介紹,得知CRC校驗(yàn)碼的位數(shù)為4(校驗(yàn)碼的位數(shù)比生成多項(xiàng)式的位數(shù)少1)。因?yàn)樵瓟?shù)據(jù)幀10110011,在它后面再加4個(gè)0,得到101100110000,然后把這個(gè)數(shù)以“模2除法”方式除以生成多項(xiàng)式,得到的余數(shù),即CRC校驗(yàn)碼為0100,如圖5-10所示。注意參考前面介紹的“模2除法”運(yùn)算法則。圖5-10 CRC校驗(yàn)碼計(jì)算示例 (3)把上步計(jì)算得到的CRC校驗(yàn)碼0100替換原始幀101100110000后面的四個(gè)“0”,得到新幀101100110100。再把這個(gè)新幀發(fā)送到接收端。 (4)當(dāng)以上新幀到達(dá)接收端后,接收端會(huì)把這個(gè)新幀再用上面選定的除數(shù)11001以“模2除法”方式去除,驗(yàn)證余數(shù)是否為0,如果為0,則證明該幀數(shù)據(jù)在傳輸過(guò)程中沒(méi)有出現(xiàn)差錯(cuò),否則出現(xiàn)了差錯(cuò)。 通過(guò)以上CRC校驗(yàn)原理的剖析和CRC校驗(yàn)碼的計(jì)算示例的介紹,大家應(yīng)該對(duì)這種看似很復(fù)雜的CRC校驗(yàn)原理和計(jì)算方法應(yīng)該比較清楚了。 下面大家做一個(gè)練習(xí),假設(shè)CRC生成多項(xiàng)式為G(X)= X5+ X4+X+1,要發(fā)送的二進(jìn)制序列為100101110,求CRC校驗(yàn)碼是多少。2、 CRC碼典型應(yīng)用CRC(CyclicRedundancyCheck,直譯:循環(huán)冗余校驗(yàn))技術(shù)是一項(xiàng)很成熟的技術(shù),在眾多領(lǐng)域有廣泛的應(yīng)用,在數(shù)據(jù)存儲(chǔ)和通信傳輸應(yīng)用中處處都可以看到它的身影。最常用的CRC校驗(yàn)形式有CRC-16,CRC-32兩種形式,采用CRC-16校驗(yàn),可以保證在1014位碼元中只含有一位未被檢測(cè)出的錯(cuò)誤,采用CRC-32校驗(yàn)的出錯(cuò)概率比CRC-16還低105倍。CRC的主要特點(diǎn)就是:檢錯(cuò)能力極強(qiáng),開(kāi)銷很小,易于實(shí)現(xiàn)。從性能和開(kāi)銷上綜合考慮,其遠(yuǎn)遠(yuǎn)優(yōu)于奇偶校驗(yàn)及算術(shù)和校驗(yàn)等方式。因此,很多軟件在加密保護(hù)時(shí)都將CRC技術(shù)應(yīng)用其中。CRC校驗(yàn)的原理解析 在實(shí)際應(yīng)用中,根據(jù)環(huán)境和需求的變化,CRC形成了多種變形方式。比如:通訊協(xié)議X.25的幀檢錯(cuò)序列采用的是CRC-CCITT方式,ARJ、LHA、ZIP等壓縮軟件采用的是CRC-32方式,磁盤驅(qū)動(dòng)器的讀寫采用的是CRC-16方式,GIF、TIFF等圖像存儲(chǔ)格式也使用CRC作為檢錯(cuò)技術(shù)。目前,比較流行的CRC形式主要是:CRC-16(CRC-CCITT)、CRC-32兩種,CRC-4、CRC-8、CRC-12等形式的應(yīng)用比較少見(jiàn)。其實(shí),雖然有這么多種變形方式,但其原理是完全相同的,只是在實(shí)現(xiàn)上有一點(diǎn)變化而已,下面我們就對(duì)其原理進(jìn)行一番解剖,希求通透。 CRC的算法本質(zhì)是(模-2)除法的余數(shù)運(yùn)算,使用的除數(shù)不同,CRC的類型也就不一樣。CRC的算法其實(shí)是采用了多項(xiàng)式編碼的方法,您可以將要被處理的數(shù)據(jù)塊M看成一個(gè)n階的二進(jìn)制多項(xiàng)式,其形式如下:a是對(duì)應(yīng)的階數(shù)(位數(shù))的值;x是對(duì)應(yīng)的“模(進(jìn)制)”數(shù),由于我們處理的都是二進(jìn)制數(shù),所以x就是2了。下面我們用一個(gè)數(shù)進(jìn)行解釋吧:有一個(gè)二進(jìn)制數(shù)M=10010101,其對(duì)應(yīng)的多項(xiàng)式就可以表示為:CRC校驗(yàn)就是基于這種多項(xiàng)式進(jìn)行的運(yùn)算,其乘除法運(yùn)算過(guò)程與普通代數(shù)多項(xiàng)式的乘除法相同,其加減法運(yùn)算以2為模,加減時(shí)不進(jìn)(借)位,實(shí)際上與邏輯異或(XOR)運(yùn)算是一致的。 通常,根據(jù)多項(xiàng)表達(dá)(運(yùn)算)式的不同,就形成了不同的CRC形式,以下是各種常用的多項(xiàng)表達(dá)(運(yùn)算)式:這些多項(xiàng)表達(dá)式的值就是(模-2)除法的除數(shù),只要能確定使用哪一種多項(xiàng)式(也就是對(duì)應(yīng)除數(shù)),您就可以很簡(jiǎn)單的獲取CRC檢驗(yàn)碼了。下面就給您介紹CRC檢驗(yàn)碼的計(jì)算過(guò)程:1、先確定您要使用的CRC校驗(yàn)形式,以此確定對(duì)應(yīng)除數(shù)(用G來(lái)表示)和選定階數(shù)(用r來(lái)表示)。(如果選擇CRC-4的話,r就等于4,選擇CRC-16話,r就等于16,以此類推。)2、在待處理的數(shù)據(jù)塊M后附加上r個(gè)0。假設(shè)原始數(shù)據(jù)塊的長(zhǎng)度是m位的話,附加之后的長(zhǎng)度就變成m+r位了,我們用M來(lái)代表附加后的值。3、用第一步選擇的生成多項(xiàng)式的值(即對(duì)應(yīng)除數(shù)G)來(lái)除第二步附加0后生成的值(M),循環(huán)計(jì)算,一直到余數(shù)的階數(shù)小于等于r-1,這時(shí)所得到的余數(shù)(用Y表示)就是原始數(shù)據(jù)M經(jīng)過(guò)所選擇的CRC校驗(yàn)形式所生成的CRC校驗(yàn)碼。 如果您想將生成的校驗(yàn)碼與原始數(shù)據(jù)進(jìn)行復(fù)合,只需要用第二步生成的(M)以模2的方法減去得到的CRC校驗(yàn)碼(Y),所得到的值就是包含了CRC校驗(yàn)碼的數(shù)據(jù)串M。(不過(guò)在軟件加密過(guò)程中可能用不到這一步)。 只需要三步,就可以得到CRC的校驗(yàn)碼。舉個(gè)例子:設(shè)原始數(shù)據(jù)M1100110100選擇CRC-4的形式,則G24211910011(二進(jìn)制)rG的二進(jìn)制位數(shù)減15-14對(duì)原始數(shù)據(jù)M進(jìn)行處理,在其尾部附加r個(gè)0,即:M=M+0000=11001101000000再用G循環(huán)除M:其實(shí)校驗(yàn)碼生成的過(guò)程就是一個(gè)循環(huán)移位的運(yùn)算,位與位之間就是異或(XOR)運(yùn)算。 一個(gè)數(shù)據(jù)的校驗(yàn)過(guò)程是這樣的,如果有大量數(shù)據(jù)(比如說(shuō)一個(gè)可執(zhí)行程序或一個(gè)壓縮包)將如何進(jìn)行校驗(yàn)?zāi)??其?shí)很簡(jiǎn)單,只要將一個(gè)文件看成一個(gè)被一些數(shù)字分割的很長(zhǎng)的位字串就可以了,只是這個(gè)位字串比較TA而已,你只要按標(biāo)準(zhǔn)的方式對(duì)這個(gè)比較長(zhǎng)的位字串進(jìn)行(模-2)除法運(yùn)算,就一定會(huì)得到一個(gè)余數(shù)-CRC校驗(yàn)碼,而這個(gè)校驗(yàn)碼就是這個(gè)文件的CRC校驗(yàn)值。CRC校驗(yàn)的代碼實(shí)現(xiàn) 好了,理論上的準(zhǔn)備是很多了,現(xiàn)在要用進(jìn)入實(shí)踐了。下面,我們將給您提供一段很簡(jiǎn)單而實(shí)用的代碼,用來(lái)實(shí)現(xiàn)CRC-32校驗(yàn),最終,我會(huì)用這段代碼實(shí)現(xiàn)軟件加密保護(hù)。 大家可以看到,上面生成CRC校驗(yàn)碼的過(guò)程中,使用了大量的位運(yùn)算和邏輯操作。而我想告訴大家的是,基于位運(yùn)算的算法是非常慢的而且效率很低。因此,在實(shí)際使用中不推薦使用“計(jì)算法”來(lái)生成CRC校驗(yàn)碼,而建議使用“查表法”來(lái)進(jìn)行CRC校驗(yàn)碼計(jì)算。查表法又是什么方法呢?這里我不做過(guò)多的分析,簡(jiǎn)單的說(shuō),它是利用預(yù)先計(jì)算出的標(biāo)準(zhǔn)碼表(對(duì)應(yīng)不同的校驗(yàn)形式有不同的碼表,見(jiàn)附表1、2),用簡(jiǎn)單的移位和XOR操作,快速計(jì)算出CRC校驗(yàn)碼的方法。具體的算法就是:(1)將上次計(jì)算出的CRC校驗(yàn)碼右移一個(gè)字節(jié);(2)將移出的這個(gè)字節(jié)與新的要校驗(yàn)的字節(jié)進(jìn)行XOR運(yùn)算;(3)用運(yùn)算出的值在預(yù)先生成碼表中進(jìn)行索引,獲取對(duì)應(yīng)的值(稱為余式);(4)用獲取的值與第(1)步右移后的值進(jìn)行XOR運(yùn)算;(5)如果要校驗(yàn)的數(shù)據(jù)已經(jīng)處理完,則第(4)步的結(jié)果就是最終的CRC校驗(yàn)碼。如果還有數(shù)據(jù)要進(jìn)行處理,則再轉(zhuǎn)到第(1)步運(yùn)行??瓷厦娴倪^(guò)程是十分簡(jiǎn)單的,不好理解的可能是“預(yù)先生成的碼表”。其實(shí)這個(gè)碼表就是28的數(shù)組,為什么是8次方呢?因?yàn)槲覀兪怯米止?jié)來(lái)進(jìn)行運(yùn)算的,而一個(gè)字節(jié)是8位,所以就是2的8次方了。因此這個(gè)碼表就是擁有256值的數(shù)組,對(duì)應(yīng)的每個(gè)值實(shí)際上就是0-255以對(duì)應(yīng)的CRC多項(xiàng)表達(dá)式(見(jiàn)原理分析)為權(quán)的CRC碼。如CRC-16的多項(xiàng)表達(dá)式就是,CRC-32的多項(xiàng)表達(dá)式就是:附表1、2中分別給出了對(duì)應(yīng)兩種形式的碼表(匯編格式),您只要復(fù)制到您的代碼中即可使用(可能要做一些修飾)。 如果您不想將這么一大堆碼表復(fù)制到您的代碼中,也可以使用動(dòng)態(tài)生成碼表(不過(guò)是給256個(gè)數(shù)字進(jìn)行CRC計(jì)算而已)。下面是生成CRC-32碼表的代碼(c語(yǔ)言):/-/GenCrc32Tbl函數(shù)動(dòng)態(tài)生成CRC-32的預(yù)置碼表/Code:Chenji/-unsignedintCRC./在Windows下編程,int的大小是32位unsignedintCRC_32_Tbl256./用來(lái)保存碼表voidGenCrc32Tbl()for(inti=0.i256.+i)/用+i以提高效率CRC=i;for(intj=0.j1)0xEDB88320;else/0xEDB88320就是CRC-32多項(xiàng)表達(dá)式的值CRC=1;CRC_32_Tbli=CRC./- 上面的代碼其實(shí)就已經(jīng)實(shí)現(xiàn)了用“計(jì)算法”求取CRC校驗(yàn)碼的過(guò)程,只要做些修改就可以完全實(shí)現(xiàn)。您只要將上面的代碼復(fù)制到程序中,并調(diào)用GenCrc32Tbl函數(shù),就可以在CRC_32_Tbl中生成CRC-32的預(yù)置碼表。有了碼表,用“查表法”計(jì)算CRC-32計(jì)算校驗(yàn)碼就易如反掌了。根據(jù)上面介紹的算法,用C語(yǔ)言只需要一行就可以實(shí)現(xiàn)。CRC32=CRC_32_Tbl(CRC32(unsigned_int8*)p)i)&0xff(CRC328);下面是完整的一個(gè)實(shí)現(xiàn)函數(shù),更加簡(jiǎn)單:/-/CalcCRC32函數(shù)計(jì)算出給定數(shù)據(jù)串的CRC-32校驗(yàn)碼/Code:Chenji/-unsignedintCalcCRC32(void*DataBuff,unsignedintBufLen)/DataBuff是指向數(shù)據(jù)串的指針,BufLen是數(shù)據(jù)串的長(zhǎng)度unsignedintCRC32=0xffffffff;/設(shè)置初始值for(unsignedlongi=0;i8);/如果你的編譯器不支持unsigned_int8定義,請(qǐng)?jiān)囉胾nsignedcharreturnCRC32;/-怎么樣,用查表法計(jì)算CRC校驗(yàn)碼是不是很簡(jiǎn)單,很快捷?您只要將上面的代碼復(fù)制您的程序中,賦與對(duì)應(yīng)的參數(shù),就可以實(shí)CRC-32校驗(yàn)了。CRC校驗(yàn)在軟件加密保護(hù)中的攻與防 上面用大篇幅介紹CRC的原理與實(shí)現(xiàn),都是為現(xiàn)在的實(shí)戰(zhàn)打基礎(chǔ),現(xiàn)在我們就要用實(shí)戰(zhàn)來(lái)校驗(yàn)了。 大家已經(jīng)知道,CRC校驗(yàn)生成的結(jié)果只是一個(gè)Long型的整數(shù),市面上一些軟件是如何將這個(gè)整數(shù)應(yīng)用在軟件加密保護(hù)中呢?這里我給大家介紹兩種常用的方式:1、是對(duì)程序自身的進(jìn)行保護(hù)。首先對(duì)原始可執(zhí)行程序進(jìn)行CRC校驗(yàn),同時(shí)保存校驗(yàn)結(jié)果(可以保存在注冊(cè)表、配置文件或可執(zhí)行程序本身)。在程序運(yùn)行時(shí),對(duì)程序自身進(jìn)行CRC校驗(yàn),并將運(yùn)算出的結(jié)果與保存的原始結(jié)果進(jìn)行比較,如果不相同,就說(shuō)明程序已經(jīng)被修改(最有可能是被破解或被病毒感染)。即使只有1Bit的修改,都會(huì)被CRC檢查出來(lái),所以用CRC做自校驗(yàn)相當(dāng)有效。2、用CRC校驗(yàn)算法,對(duì)注冊(cè)名和注冊(cè)碼進(jìn)行變形運(yùn)算和判斷,以此做為注冊(cè)保護(hù)和授權(quán)的手段。這兩種方式在軟件保護(hù)上的運(yùn)用十分廣泛??梢哉f(shuō),每一種軟件加殼(加密)保護(hù)軟件(如upx,Aspack,FSG等)都使用了CRC進(jìn)行自身校驗(yàn)保護(hù)。為了證明CRC在軟件加密保護(hù)上的效果,我制作了一套測(cè)試用例,大家可以在上下載CRCTest.rar壓縮包,按本文進(jìn)行測(cè)試和分析。壓縮包中有兩個(gè)可執(zhí)行程序:crctest.exe和Makecrc.exe。其中crctest.exe就是我們要進(jìn)行分析的對(duì)象,界面如下:軟件已經(jīng)進(jìn)行了CRC外殼校驗(yàn)保護(hù),同時(shí),使用CRC-32算法做注冊(cè)碼校驗(yàn),可以說(shuō)將CRC在軟件加密保護(hù)上的應(yīng)用全部發(fā)揮出來(lái)了。MakeCrc.exe是配套工具,用來(lái)給上面的程序注入CRC保護(hù)碼和計(jì)算注冊(cè)碼。 現(xiàn)在,可以打開(kāi)crctest.exe文件,并隨意輸入注冊(cè)名和注冊(cè)碼,看一看! 您也可以用16進(jìn)制編輯器(如:Hiew,010Editor,RTA等),將crctest.exe的最后一個(gè)字節(jié)00修改成0F 保存修改后,再運(yùn)行程序,程序會(huì)提示被修改。 怎么樣,這就是CRC保護(hù)的效果。如果您試圖強(qiáng)行暴破來(lái)完成注冊(cè)的話,就必須修改原始文件,但是軟件將會(huì)在自校驗(yàn)時(shí)發(fā)現(xiàn)自己被修改了,然后自動(dòng)退出。除非您得到正確的注冊(cè)碼或注冊(cè)算法,而軟件使用的注冊(cè)算法也是由CRC算法變形實(shí)現(xiàn)的。如果在不知道具體算法的情況,想要強(qiáng)行暴破是比較麻煩的,這就是CRC的威力。市面上大多數(shù)軟件大多是這樣做的,畢竟誰(shuí)也不想自己的軟件被人破解或修改。 但是現(xiàn)在,我們就要挑戰(zhàn)這個(gè)難題,在不了解注冊(cè)算法的情況,如何實(shí)現(xiàn)強(qiáng)行暴破,徹底攻破CRC的保護(hù)。 首先,您要準(zhǔn)備一些工具:Ollydbg1.10、DeDe、Peid全能插件版,也許還需要PE-tools1.50。這些軟件您可以在網(wǎng)上很輕松的找到,如果沒(méi)有可以與我聯(lián)系。第一步:檢查 Peid是目前最流行,也是比較完善的檢測(cè)軟件??梢詸z測(cè)軟件是否加殼,使用了什么編譯器等諸多信息,同時(shí)其豐富的插件可以完成許多擴(kuò)展功能。現(xiàn)在,我們先用Peid檢測(cè)crctest.exe,查看程序的基本信息。Peid顯示軟件是用“BorlandC+1999”版的編譯器進(jìn)行編譯的,其實(shí)一般情況下,用BCB編譯的程序也會(huì)顯示為用“BorlandC+1999”編譯。 我們?cè)儆闷渲械牟寮癒ryptoANALyzer”,來(lái)分析程序中是否有通用的加密算法。我們可以看到,程序使用了CRC-32算法:這里想告訴大家的是,KryptoANALyzer是使用查詢數(shù)組(碼表)來(lái)確定軟件使用了什么算法,而軟件使用動(dòng)態(tài)生成數(shù)組(碼表)的話,它是無(wú)法檢測(cè)出算法來(lái)的。這也是它的漏洞了。你可以程序中保存一個(gè)其它算法的碼表來(lái)混淆檢測(cè)器。(crctest.exe中就定義了一個(gè)CRC32的數(shù)組,但我們并沒(méi)有使用它,而是使用了動(dòng)態(tài)生成的碼表)第二步:分析 了解軟件沒(méi)有加殼,而且可能是由BCB編譯的之后,我們就要著手分析了。針對(duì)Borland公司出品的Delphi和BCB編譯器所生成執(zhí)行程序,可以使用DeDe反編譯器進(jìn)行分析,它可以很好的恢復(fù)程序的原始代碼信息。 下面就是用DeDe將crctest.exe載入分析,現(xiàn)在我們切換到“過(guò)程”頁(yè)面,選擇“main”單元:btn_OKClick事件是我們感興趣的地方,當(dāng)按下“注冊(cè)”按鈕時(shí),這個(gè)事件會(huì)被調(diào)用。雙擊這個(gè)事件,我們就可以看到這個(gè)事件的匯編代碼,在其中顯示的匯編代碼已經(jīng)被DeDe處理過(guò),對(duì)標(biāo)準(zhǔn)的函數(shù)調(diào)用已經(jīng)進(jìn)行了注釋,其可讀性很好。00401C90這個(gè)地址就是這個(gè)事件函數(shù)的入口點(diǎn),如果您有一些基本功,可以認(rèn)真分析一下。您也許可以看出關(guān)鍵的代碼。不過(guò),下面我們要進(jìn)入動(dòng)態(tài)調(diào)試了!第三步:調(diào)試破解 在檢測(cè)和分析的基礎(chǔ)上,我們可以開(kāi)始動(dòng)態(tài)調(diào)試了。我要用動(dòng)態(tài)的數(shù)據(jù)來(lái)解釋破解的思路與過(guò)程。現(xiàn)在,請(qǐng)打開(kāi)Ollydbg動(dòng)態(tài)調(diào)試器,將crctest.exe載入,停在程序的入口處。 按Ctrl+G,輸入00401C90,直接定位到“注冊(cè)”按鈕的點(diǎn)擊事件函數(shù)入口處,并按F2下斷點(diǎn)。 接下來(lái),可以按F9運(yùn)行程序,進(jìn)入調(diào)試,然后在窗口中,隨便輸入注冊(cè)名和注冊(cè)碼,點(diǎn)擊“注冊(cè)”按鈕,程序?qū)?huì)中斷在00401C90處:不斷按F8單步運(yùn)行,其間您可以看到許多的數(shù)據(jù)在變化,不用管它,一直按F8運(yùn)行,直到顯示注冊(cè)錯(cuò)誤的信息框,再看運(yùn)行的狀態(tài)。 可以看到,在運(yùn)行00401FDF這個(gè)地址的時(shí)候,軟件顯示了注冊(cè)錯(cuò)誤的信息框。顯然這個(gè)call00468C08指令就是顯示信息框的函數(shù)。我們只要找到調(diào)用這個(gè)Call的調(diào)用(有點(diǎn)繞舌),就可以找到關(guān)鍵點(diǎn)了。大家向上回溯代碼可以看到下面的內(nèi)容:我們將匯編代碼提取出來(lái)如下:/*401F65*/leaedx,local.2/*401F68*/leaeax,local.4/*401F6B*/callcrctest.00468DA0/對(duì)比注冊(cè)碼是否正確/*401F70*/testal,al/*401F72*/jeshortcrctest.00401FC7/如果不正確就跳走/*401F74*/moveax,dwordptrds:46EF94/*401F79*/push40040/*401F7E*/leaecx,dwordptrds:edi+141/*401F84*/leaedx,dwordptrds:edi+EB/*401F8A*/moveax,dwordptrds:eax/*401F8C*/callcrctest.00468C08/顯示成功注冊(cè)的提示信息/*401F91*/movwordptrds:ebx+10,8C/*401F97*/leaedx,dwordptrds:edi+146/*401F9D*/leaeax,local.14/*401FA0*/callcrctest.00468C18/*401FA5*/incdwordptrds:ebx+1C/*401FA8*/movedx,dwordptrds:eax/*401FAA*/moveax,dwordptrds:esi+2F8/*401FB0*/callcrctest.00452658/*401FB5*/decdwordptrds:ebx+1C/*401FB8*/leaeax,local.14/*401FBB*/movedx,2/*401FC0*/callcrctest.00468CD0/*401FC5*/jmpshortcrctest.00401FE4/*401FC7*/moveax,dwordptrds:46EF94/跳轉(zhuǎn)到這里/*401FCC*/push40010/*401FD1*/leaecx,dwordptrds:edi+1B4/*401FD7*/leaedx,dwordptrds:edi+16A/*401FDD*/moveax,dwordptrds:eax/*401FDF*/callcrctest.00468C08/顯示錯(cuò)誤注冊(cè)的提示信息由此可以看到軟件的注冊(cè)檢查是很簡(jiǎn)單的,只要將00401F72處的代碼:jeshortcrctest.00401FC7修改為:nopnop就可以暴破了!大家可以在Ollydbg中將00401F72處的代碼修改成下面的形式: 然后,取消所有的斷點(diǎn),直接按F9運(yùn)行程序,再隨意輸入注冊(cè)名和注冊(cè)碼,點(diǎn)擊“注冊(cè)”。看到了嗎?軟件已經(jīng)成功注冊(cè)了!但是真的成功了嗎?不要高興的太早,還有CRC自校驗(yàn)沒(méi)有解決呢!請(qǐng)先將修改過(guò)的程序保存為另一個(gè)文件crctest_1.exe。 方法:在匯編代碼上點(diǎn)右鍵,選擇“復(fù)制到可執(zhí)行程序”-“所有改動(dòng)”,再選擇“全部復(fù)制”打開(kāi)新的窗口。在新的窗口中點(diǎn)右鍵,選擇“保存文件”,輸入文件名就可以保存。 現(xiàn)在,請(qǐng)暫時(shí)關(guān)閉ollydbg,運(yùn)行新保存的文件crctest_1.exe。怎么樣,沒(méi)有成功吧!軟件發(fā)現(xiàn)自己被修改了。目前,我們只完成了注冊(cè)碼校驗(yàn)的暴破,還沒(méi)有解決CRC的校驗(yàn)保護(hù),這才是我們的重頭戲,而這其實(shí)很簡(jiǎn)單。 再次打開(kāi)ollydbg,這次就要載入crctest_1.exe了,因?yàn)樗呀?jīng)暴破了注冊(cè)校驗(yàn)的部分。在開(kāi)始之前,我們要分析一下思路:軟件要進(jìn)行自校驗(yàn),就一定要讀文件到內(nèi)存中,我們只要找到讀文件的函數(shù),就可以順藤摸瓜找到校驗(yàn)的核心部分了。好,在ollydbg中按ctrl+n打開(kāi)函數(shù)導(dǎo)入導(dǎo)出表,找到ReadFile函數(shù)。在ReadFile這一行上點(diǎn)右鍵,選擇“在每個(gè)參考上設(shè)置斷點(diǎn)”,狀態(tài)條上顯示有六個(gè)斷點(diǎn)被設(shè)置。不管它了,按F9開(kāi)始運(yùn)行!很快軟件就被斷下來(lái):大家不用花時(shí)間在這些匯編代碼上,我們的目標(biāo)是關(guān)鍵跳轉(zhuǎn)點(diǎn)。一直按F8返回到上級(jí)調(diào)用:最終我們會(huì)返回到00401A8B這個(gè)地址,而在其上、下方有兩個(gè)調(diào)用:/*401A86*/callcrctest_.00401B8C/計(jì)算當(dāng)前的CRC校驗(yàn)碼/*401A8B*/movesi,eax/*401A8D*/moveax,ebx/*401A8F*/callcrctest_.00401AA0/讀取原始的CRC校驗(yàn)碼這兩個(gè)調(diào)用分別返回當(dāng)前的CRC校驗(yàn)碼和原始的CRC校驗(yàn)碼,具體過(guò)程大家可以進(jìn)入其中進(jìn)行分析,這里不做詳解。接下來(lái),繼續(xù)按F8,直到返回到更上級(jí)的調(diào)用(建議按Alt+B,關(guān)閉所有中斷):經(jīng)過(guò)三次返回,我們終于看到了關(guān)鍵點(diǎn):/*40193E*/callcrctest_.00401A80/這個(gè)調(diào)用進(jìn)行自校驗(yàn)/*401943*/testal,al/檢查校驗(yàn)的結(jié)果/*401945*/jnzshortcrctest_.0040196F/如果通過(guò)就跳走/*401947*/moveax,dwordptrds:46EF94/*40194C*/push40010/*401951*/movecx,crctest_.0046A5E0/*401956*/movedx,crctest_.0046A5BC/*40195B*/moveax,dwordptrds:eax/*40195D*/callcrctest_.00468C08/*401962*/movedx,dwordptrds:46EF94/*401968*/moveax,dwordptrds:edx/*40196A*/callcrctest_.004488FC/*40196F*/movedx,local.10/通過(guò)以后,就跳到這里/*401972*/movdwordptrfs:0,edx/*401979*/moveax,local.1/*40197C*/testbl,bl/*40197E*/jeshortcrctest_.00401985/*401980*/callcrctest_.00468F61/*401985*/popesi/*401986*/popebx/*401987*/movesp,ebp/*401989*/popebp/*40198A*/retn很顯然,我們只要將00401945處的代碼:jnzshortcrctest_.0040196F修改為:jmpshortcrctest_.0040196F/強(qiáng)行跳轉(zhuǎn)就可以強(qiáng)制為自校驗(yàn)通過(guò)的狀態(tài)。好了,接下來(lái)的保存工作就不用我多說(shuō)了。最后,再用Keymake軟件制作出破解補(bǔ)丁就可以完成注冊(cè)了!軟件包中就保存了破解補(bǔ)丁crctest_patch.exe,大家只要運(yùn)行就可以看到效果了!OK,到目前為止,我為您制作的CRC保護(hù)實(shí)際已經(jīng)被完全破解了,整個(gè)過(guò)程比較啰嗦,只是力求詳盡。在看過(guò)這一部分后,您應(yīng)該對(duì)破解CRC保護(hù)的軟件有了感性和理性的認(rèn)識(shí)。附表1CRC-16的碼表dw00000h,0C0C1h,0C181h,00140h,0C301h,003C0h,00280h,0C241hdw0C601h,006C0h,00780h,0C741h,00500h,0C5C1h,0C481h,00440hdw0CC01h,00CC0h,00D80h,0CD41h,00F00h,0CFC1h,0CE81h,00E40hdw00A00h,0CAC1h,0CB81h,00B40h,0C901h,009C0h,00880h,0C841hdw0D801h,018C0h,01980h,0D941h,01B00h,0DBC1h,0DA81h,01A40hdw01E00h,0DEC1h,0DF81h,01F40h,0DD01h,01DC0h,01C80h,0DC41hdw01400h,0D4C1h,0D581h,01540h,0D701h,017C0h,01680h,0D641hdw0D201h,012C0h,01380h,0D341h,01100h,0D1C1h,0D081h,01040hdw0F001h,030C0h,03180h,0F141h,03300h,0F3C1h,0F281h,03240hdw03600h,0F6C1h,0F781h,03740h,0F501h,035C0h,03480h,0F441hdw03C00h,0FCC1h,0FD81h,03D40h,0FF01h,03FC0h,03E80h,0FE41hdw0FA01h,03AC0h,03B80h,0FB41h,03900h,0F9C1h,0F881h,03840hdw02800h,0E8C1h,0E981h,02940h,0EB01h,02BC0h,02A80h,0EA41hdw0EE01h,02EC0h,02F80h,0EF41h,02D00h,0EDC1h,0EC81h,02C40hdw0E401h,024C0h,02580h,0E541h,02700h,0E7C1h,0E681h,02640hdw02200h,0E2C1h,0E381h,02340h,0E101h,021C0h,02080h,0E041hdw0A001h,060C0h,06180h,0A141h,06300h,0A3C1h,0A281h,06240hdw06600h,0A6C1h,0A781h,06740h,0A501h,065C0h,06480h,0A441hdw06C00h,0ACC1h,0AD81h,06D40h,0AF01h,06FC0h,06E80h,0AE41hdw0AA01h,06AC0h,06B80h,0AB41h,06900h,0A9C1h,0A881h,06840hdw07800h,0B8C1h,0B981h,07940h,0BB01h,07BC0h,07A80h,0BA41hdw0BE01h,07EC0h,07F80h,0BF41h,07D00h,0BDC1h,0BC81h,07C40hdw0B401h,074C0h,07580h,0B541h,07700h,0B7C1h,0B681h,07640hdw07200h,0B2C1h,0B381h,07340h,0B101h,071C0h,07080h,0B041hdw05000h,090C1h,09181h,05140h,09301h,053C0h,05280h,09241hdw09601h,056C0h,05780h,09741h,05500h,095C1h,09481h,05440hdw09C01h,05CC0h,05D80h,09D41h,05F00h,09FC1h,09E81h,05E40hdw05A00h,09AC1h,09B81h,05B40h,09901h,059C0h,05880h,09841hdw08801h,048C0h,04980h,08941h,04B00h,08BC1h,08A81h,04A40hdw04E00h,08EC1h,08F81h,04F40h,08D01h,04DC0h,04C80h,08C41hdw04400h,084C1h,08581h,04540h,08701h,047C0h,04680h,08641hdw08201h,042C0h,04380h,08341h,04100h,081C1h,08081h,04040h附表2CRC-32的碼表dd000000000h,077073096h,0EE0E612Ch,0990951BAh,0076DC419h,0706AF48Fh,0E963A535h,09E6495A3h,00EDB8832h,079DCB8A4hdd0E0D5E91Eh,097D2D988h,009B64C2Bh,07EB17CBDh,0E7B82D07h,090BF1D91h,01DB71064h,06AB020F2h,0F3B97148h,084BE41DEhdd01ADAD47Dh,06DDDE4EBh,0F4D4B551h,083D385C7h,0136C9856h,0646BA8C0h,0FD62F97Ah,08A65C9ECh,014015C4Fh,063066CD9hdd0FA0F3D63h,08D080DF5h,03B6E20C8h,04C69105Eh,0D56041E4h,0A2677172h,03C03E4D1h,04B04D447h,0D20D85FDh,0A50AB56Bhdd035B5A8FAh,042B2986Ch,0DBBBC9D6h,0ACBCF940h,032D86CE3h,045DF5C75h,0DCD60DCFh,0ABD13D59h,026D930ACh,051DE003Ahdd0C8D75180h,0BFD06116h,021B4F4B5h,056B3C423h,0CFBA9599h,0B8BDA50Fh,02802B89Eh,05F058808h,0C60CD9B2h,0B10BE924hdd02F6F7C87h,058684C11h,0C1611DABh,0B6662D3Dh,076DC4190h,001DB7106h,098D220BCh,0EFD5102Ah,071B18589h,006B6B51Fhdd09FBFE4A5h,0E8B8D433h,07807C9A2h,00F00F934h,09609A88Eh,0E10E9818h,07F6A0DBBh,0086D3D2Dh,091646C97h,0E6635C01hdd06B6B51F4h,01C6C6162h,0856530D8h,0F262004Eh,06C0695EDh,01B01A57Bh,08208F4C1h,0F50FC457h,065B0D9C6h,012B7E950hdd08BBEB8EAh,0FCB9887Ch,062DD1DDFh,015DA2D49h,08CD37CF3h,0FBD44C65h,04DB26158h,03AB551CEh,0A3BC0074h,0D4BB30E2hdd04ADFA541h,03DD895D7h,0A4D1C46Dh,0D3D6F4FBh,04369E96Ah,0346ED9FCh,0AD678846h,0DA60B8D0h,044042D73h,033031DE5hdd0AA0A4C5Fh,0DD0D7CC9h,05005713Ch,0270241AAh,0BE0B1010h,0C90C2086h,05768B525h,0206F85B3h,0B966D409h,0CE61E49Fhdd05EDEF90Eh,029D9C998h,0B0D09822h,0C7D7A8B4h,059B33D17h,02EB40D81h,0B7BD5C3Bh,0C0BA6CADh,0EDB88320h,09ABFB3B6hdd003B6E20Ch,074B1D29Ah,0EAD54739h,09DD277AFh,004DB2615h,073DC1683h,0E3630B12h,094643B84h,00D6D6A3Eh,07A6A5AA8hdd0E40ECF0Bh,09309FF9Dh,00A00AE27h,07D079EB1h,0F00F9344h,08708A3D2h,01E01F268h,06906C2FEh,0F762575Dh,0806567CBhdd0196C3671h,06E6B06E7h,0FED41B76h,089D32BE0h,010DA7A5Ah,067DD4ACCh,0F9B9DF6Fh,08EBEEFF9h,017B7BE43h,060B08ED5hdd0D6D6A3E8h,0A1D1937Eh,038D8C2C4h,04FDFF252h,0D1BB67F1h,0A6BC5767h,03FB506DDh,048B2364Bh,0D80D2BDAh,0AF0A1B4Chdd036034AF6h,041047A60h,0DF60EFC3h,0A867DF55h,0316E8EEFh,04669BE79h,0CB61B38Ch,0BC66831Ah,0256FD2A0h,05268E236hdd0CC0C7795h,0BB0B4703h,0220216B9h,05505262Fh,0C5BA3BBEh,0B2BD0B28h,02BB45A92h,05CB36A04h,0C2D7FFA7h,0B5D0CF31hdd02CD99E8Bh,05BDEAE1Dh,09B64C2B0h,0EC63F226h,0756AA39Ch,0026D930Ah,09C0906A9h,0EB0E363Fh,072076785h,005005713hdd095BF4A82h,0E2B87A14h,07BB12BAEh,00CB61B38h,092D28E9Bh,0E5D5BE0Dh,07CDCEFB7h,00BDBDF21h,086D3D2D4h,0F1D4E242hdd068DDB3F8h,01FDA836Eh,081BE16CDh,0F6B9265Bh,06FB077E1h,018B74777h,088085AE6h,0FF0F6A70h,066063BCAh,011010B5Chdd08F659EFFh,0F862AE69h,0616BFFD3h,0166CCF45h,0A00AE278h,0D70DD2EEh,04E048354h,03903B3C2h,0A7672661h,0D06016F7hdd04969474Dh,03E6E77DBh,0AED16A4Ah,0D9D65ADCh,040DF0B66h,037D83BF0h,0A9BCAE53h,0DEBB9EC5h,047B2CF7Fh,030B5FFE9hdd0BDBDF21Ch,0CABAC28Ah,053B39330h,024B4A3A6h,0BAD03605h,0CDD70693h,054DE5729h,023D967BFh,0B3667A2Eh,0C4614AB8hdd05D681B02h,02A6F2B94h,0B40BBE37h,0C30C8EA1h,05A05DF1Bh,02D02EF8Dh3、 IP儲(chǔ)存包中CRC檢驗(yàn)位 在學(xué)TCP/IP中,關(guān)于Ethernet幀結(jié)構(gòu)中的最后一部分幀校驗(yàn)字段FCS(4B),在編程通信程序時(shí),我們需對(duì)數(shù)據(jù)鏈路層通信Ethernet幀進(jìn)行校驗(yàn),即對(duì)幀校驗(yàn)字段FCS進(jìn)行校驗(yàn)。FCS采用32位CRC校驗(yàn)。校驗(yàn)的范圍包括目的地址、源地址字段、類型字段、數(shù)據(jù)字段。在接受段進(jìn)行校驗(yàn),如果發(fā)現(xiàn)錯(cuò)誤,幀將被丟棄。下面是關(guān)于CRC的循序漸進(jìn)的知識(shí): 循環(huán)冗余碼校驗(yàn)(CRC=cyclicredundancycheck),是一個(gè)信息字段和校驗(yàn)字段的長(zhǎng)度可以任意選定的差錯(cuò)校驗(yàn)碼。 原理:任意一個(gè)由二進(jìn)制位串組成的代碼都可以和一個(gè)系數(shù)僅為0和1取值的多項(xiàng)式一一對(duì)應(yīng)。例如:代碼1010111對(duì)應(yīng)的多項(xiàng)式為x6+

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論