




已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 CRC碼工作原理1. CRC校驗原理 CRC的英文全稱為Cyclic Redundancy Check(Code),中文名稱為循環(huán)冗余校驗(碼)。它是一類重要的線性分組碼,編碼和解碼方法簡單,檢錯和糾錯能力強,在通信領(lǐng)域廣泛地用于實現(xiàn)差錯控制。 CRC計算與普通的除法計算有所不同。普通的除法計算是借位相減的,而CRC計算則是異或運算。任何一個除法運算都需要選取一個除數(shù),在CRC運算中我們稱之為poly,而寬度W就是poly最高位的位置。比如poly 1001的W是3,而不是4。注意最高位總是1,當你選定一個寬度,那么你只需要選擇低W各位的值。假如我們想計算一個位串的CRC碼,并要保證每一位都要被處理,因此我們需要在目標位串后面加上W個0。 CRC校驗原理看起來比較復雜,因為大多數(shù)書上基本上是以二進制的多項式形式來說明的。其實很簡單的問題,其根本思想就是先在要發(fā)送的幀后面附加一個數(shù)(這個就是用來校驗的校驗碼,但要注意,這里的數(shù)也是二進制序列的,下同),生成一個新幀發(fā)送給接收端。當然,這個附加的數(shù)不是隨意的,它要使所生成的新幀能與發(fā)送端和接收端共同選定的某個特定數(shù)整除(注意,這里不是直接采用二進制除法,而是采用一種稱之為“模2除法”)。到達接收端后,再把接收到的新幀除以(同樣采用“模2除法”)這個選定的除數(shù)。因為在發(fā)送端發(fā)送數(shù)據(jù)幀之前就已通過附加一個數(shù),做了“去余”處理(也就已經(jīng)能整除了),所以結(jié)果應該是沒有余數(shù)。如果有余數(shù),則表明該幀在傳輸過程中出現(xiàn)了差錯?!菊f明】“模2除法”與“算術(shù)除法”類似,但它既不向上位借位,也不比較除數(shù)和被除數(shù)的相同位數(shù)值的大小,只要以相同位數(shù)進行相除即可。模2加法運算為:1+1=0,0+1=1,0+0=0,無進位,也無借位;模2減法運算為:1-1=0,0-1=1,1-0=1,0-0=0,也無進位,無借位。相當于二進制中的邏輯異或運算。也就是比較后,兩者對應位相同則結(jié)果為“0”,不同則結(jié)果為“1”。如100101除以1110,結(jié)果得到商為11,余數(shù)為1,如圖5-9左圖所示。如1111=101,如圖5-9右圖所示。圖5-9“模2除法”和“模2乘法”示例 具體來說,CRC校驗原理就是以下幾個步驟: (1)先選擇(可以隨機選擇,也可按標準選擇,具體在后面介紹)一個用于在接收端進行校驗時,對接收的幀進行除法運算的除數(shù)(是二進制比較特串,通常是以多項方式表示,所以CRC又稱多項式編碼方法,這個多項式也稱之為“生成多項式”)。 (2)看所選定的除數(shù)二進制位數(shù)(假設為k位),然后在要發(fā)送的數(shù)據(jù)幀(假設為m位)后面加上k-1位“0”,然后以這個加了k-1個“0“的新幀(一共是m+k-1位)以“模2除法”方式除以上面這個除數(shù),所得到的余數(shù)(也是二進制的比特串)就是該幀的CRC校驗碼,也稱之為FCS(幀校驗序列)。但要注意的是,余數(shù)的位數(shù)一定要是比除數(shù)位數(shù)只能少一位,哪怕前面位是0,甚至是全為0(附帶好整除時)也都不能省略。 (3)再把這個校驗碼附加在原數(shù)據(jù)幀(就是m位的幀,注意不是在后面形成的m+k-1位的幀)后面,構(gòu)建一個新幀發(fā)送到接收端,最后在接收端再把這個新幀以“模2除法”方式除以前面選擇的除數(shù),如果沒有余數(shù),則表明該幀在傳輸過程中沒出錯,否則出現(xiàn)了差錯。 通過以上介紹,大家一定可以理解CRC校驗的原理,并且不再認為很復雜吧。 從上面可以看出,CRC校驗中有兩個關(guān)鍵點:一是要預先確定一個發(fā)送端和接收端都用來作為除數(shù)的二進制比特串(或多項式);二是把原始幀與上面選定的除進行二進制除法運算,計算出FCS。前者可以隨機選擇,也可按國際上通行的標準選擇,但最高位和最低位必須均為“1”,如在IBM的SDLC(同步數(shù)據(jù)鏈路控制)規(guī)程中使用的CRC-16(也就是這個除數(shù)一共是17位)生成多項式g(x)=x16+x15+x2+1(對應二進制比特串為:11000000000000101);而在ISO HDLC(高級數(shù)據(jù)鏈路控制)規(guī)程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多項式g(x)=x16+x15+x5+1(對應二進制比特串為:11000000000100001)。2.CRC校驗碼的計算示例 由以上分析可知,既然除數(shù)是隨機,或者按標準選定的,所以CRC校驗的關(guān)鍵是如何求出余數(shù),也就是CRC校驗碼。 下面以一個例子來具體說明整個過程?,F(xiàn)假設選擇的CRC生成多項式為G(X)= X4+ X3+ 1,要求出二進制序列10110011的CRC校驗碼。下面是具體的計算過程: (1)首先把生成多項式轉(zhuǎn)換成二進制數(shù),由G(X)= X4+ X3+ 1可以知道(,它一共是5位(總位數(shù)等于最高位的冪次加1,即4+1=5),然后根據(jù)多項式各項的含義(多項式只列出二進制值為1的位,也就是這個二進制的第4位、第3位、第0位的二進制均為1,其它位均為0)很快就可得到它的二進制比特串為11001。 (2)因為生成多項式的位數(shù)為5,根據(jù)前面的介紹,得知CRC校驗碼的位數(shù)為4(校驗碼的位數(shù)比生成多項式的位數(shù)少1)。因為原數(shù)據(jù)幀10110011,在它后面再加4個0,得到101100110000,然后把這個數(shù)以“模2除法”方式除以生成多項式,得到的余數(shù),即CRC校驗碼為0100,如圖5-10所示。注意參考前面介紹的“模2除法”運算法則。圖5-10 CRC校驗碼計算示例 (3)把上步計算得到的CRC校驗碼0100替換原始幀101100110000后面的四個“0”,得到新幀101100110100。再把這個新幀發(fā)送到接收端。 (4)當以上新幀到達接收端后,接收端會把這個新幀再用上面選定的除數(shù)11001以“模2除法”方式去除,驗證余數(shù)是否為0,如果為0,則證明該幀數(shù)據(jù)在傳輸過程中沒有出現(xiàn)差錯,否則出現(xiàn)了差錯。 通過以上CRC校驗原理的剖析和CRC校驗碼的計算示例的介紹,大家應該對這種看似很復雜的CRC校驗原理和計算方法應該比較清楚了。 下面大家做一個練習,假設CRC生成多項式為G(X)= X5+ X4+X+1,要發(fā)送的二進制序列為100101110,求CRC校驗碼是多少。2、 CRC碼典型應用CRC(CyclicRedundancyCheck,直譯:循環(huán)冗余校驗)技術(shù)是一項很成熟的技術(shù),在眾多領(lǐng)域有廣泛的應用,在數(shù)據(jù)存儲和通信傳輸應用中處處都可以看到它的身影。最常用的CRC校驗形式有CRC-16,CRC-32兩種形式,采用CRC-16校驗,可以保證在1014位碼元中只含有一位未被檢測出的錯誤,采用CRC-32校驗的出錯概率比CRC-16還低105倍。CRC的主要特點就是:檢錯能力極強,開銷很小,易于實現(xiàn)。從性能和開銷上綜合考慮,其遠遠優(yōu)于奇偶校驗及算術(shù)和校驗等方式。因此,很多軟件在加密保護時都將CRC技術(shù)應用其中。CRC校驗的原理解析 在實際應用中,根據(jù)環(huán)境和需求的變化,CRC形成了多種變形方式。比如:通訊協(xié)議X.25的幀檢錯序列采用的是CRC-CCITT方式,ARJ、LHA、ZIP等壓縮軟件采用的是CRC-32方式,磁盤驅(qū)動器的讀寫采用的是CRC-16方式,GIF、TIFF等圖像存儲格式也使用CRC作為檢錯技術(shù)。目前,比較流行的CRC形式主要是:CRC-16(CRC-CCITT)、CRC-32兩種,CRC-4、CRC-8、CRC-12等形式的應用比較少見。其實,雖然有這么多種變形方式,但其原理是完全相同的,只是在實現(xiàn)上有一點變化而已,下面我們就對其原理進行一番解剖,希求通透。 CRC的算法本質(zhì)是(模-2)除法的余數(shù)運算,使用的除數(shù)不同,CRC的類型也就不一樣。CRC的算法其實是采用了多項式編碼的方法,您可以將要被處理的數(shù)據(jù)塊M看成一個n階的二進制多項式,其形式如下:a是對應的階數(shù)(位數(shù))的值;x是對應的“模(進制)”數(shù),由于我們處理的都是二進制數(shù),所以x就是2了。下面我們用一個數(shù)進行解釋吧:有一個二進制數(shù)M=10010101,其對應的多項式就可以表示為:CRC校驗就是基于這種多項式進行的運算,其乘除法運算過程與普通代數(shù)多項式的乘除法相同,其加減法運算以2為模,加減時不進(借)位,實際上與邏輯異或(XOR)運算是一致的。 通常,根據(jù)多項表達(運算)式的不同,就形成了不同的CRC形式,以下是各種常用的多項表達(運算)式:這些多項表達式的值就是(模-2)除法的除數(shù),只要能確定使用哪一種多項式(也就是對應除數(shù)),您就可以很簡單的獲取CRC檢驗碼了。下面就給您介紹CRC檢驗碼的計算過程:1、先確定您要使用的CRC校驗形式,以此確定對應除數(shù)(用G來表示)和選定階數(shù)(用r來表示)。(如果選擇CRC-4的話,r就等于4,選擇CRC-16話,r就等于16,以此類推。)2、在待處理的數(shù)據(jù)塊M后附加上r個0。假設原始數(shù)據(jù)塊的長度是m位的話,附加之后的長度就變成m+r位了,我們用M來代表附加后的值。3、用第一步選擇的生成多項式的值(即對應除數(shù)G)來除第二步附加0后生成的值(M),循環(huán)計算,一直到余數(shù)的階數(shù)小于等于r-1,這時所得到的余數(shù)(用Y表示)就是原始數(shù)據(jù)M經(jīng)過所選擇的CRC校驗形式所生成的CRC校驗碼。 如果您想將生成的校驗碼與原始數(shù)據(jù)進行復合,只需要用第二步生成的(M)以模2的方法減去得到的CRC校驗碼(Y),所得到的值就是包含了CRC校驗碼的數(shù)據(jù)串M。(不過在軟件加密過程中可能用不到這一步)。 只需要三步,就可以得到CRC的校驗碼。舉個例子:設原始數(shù)據(jù)M1100110100選擇CRC-4的形式,則G24211910011(二進制)rG的二進制位數(shù)減15-14對原始數(shù)據(jù)M進行處理,在其尾部附加r個0,即:M=M+0000=11001101000000再用G循環(huán)除M:其實校驗碼生成的過程就是一個循環(huán)移位的運算,位與位之間就是異或(XOR)運算。 一個數(shù)據(jù)的校驗過程是這樣的,如果有大量數(shù)據(jù)(比如說一個可執(zhí)行程序或一個壓縮包)將如何進行校驗呢?其實很簡單,只要將一個文件看成一個被一些數(shù)字分割的很長的位字串就可以了,只是這個位字串比較TA而已,你只要按標準的方式對這個比較長的位字串進行(模-2)除法運算,就一定會得到一個余數(shù)-CRC校驗碼,而這個校驗碼就是這個文件的CRC校驗值。CRC校驗的代碼實現(xiàn) 好了,理論上的準備是很多了,現(xiàn)在要用進入實踐了。下面,我們將給您提供一段很簡單而實用的代碼,用來實現(xiàn)CRC-32校驗,最終,我會用這段代碼實現(xiàn)軟件加密保護。 大家可以看到,上面生成CRC校驗碼的過程中,使用了大量的位運算和邏輯操作。而我想告訴大家的是,基于位運算的算法是非常慢的而且效率很低。因此,在實際使用中不推薦使用“計算法”來生成CRC校驗碼,而建議使用“查表法”來進行CRC校驗碼計算。查表法又是什么方法呢?這里我不做過多的分析,簡單的說,它是利用預先計算出的標準碼表(對應不同的校驗形式有不同的碼表,見附表1、2),用簡單的移位和XOR操作,快速計算出CRC校驗碼的方法。具體的算法就是:(1)將上次計算出的CRC校驗碼右移一個字節(jié);(2)將移出的這個字節(jié)與新的要校驗的字節(jié)進行XOR運算;(3)用運算出的值在預先生成碼表中進行索引,獲取對應的值(稱為余式);(4)用獲取的值與第(1)步右移后的值進行XOR運算;(5)如果要校驗的數(shù)據(jù)已經(jīng)處理完,則第(4)步的結(jié)果就是最終的CRC校驗碼。如果還有數(shù)據(jù)要進行處理,則再轉(zhuǎn)到第(1)步運行。看上面的過程是十分簡單的,不好理解的可能是“預先生成的碼表”。其實這個碼表就是28的數(shù)組,為什么是8次方呢?因為我們是用字節(jié)來進行運算的,而一個字節(jié)是8位,所以就是2的8次方了。因此這個碼表就是擁有256值的數(shù)組,對應的每個值實際上就是0-255以對應的CRC多項表達式(見原理分析)為權(quán)的CRC碼。如CRC-16的多項表達式就是,CRC-32的多項表達式就是:附表1、2中分別給出了對應兩種形式的碼表(匯編格式),您只要復制到您的代碼中即可使用(可能要做一些修飾)。 如果您不想將這么一大堆碼表復制到您的代碼中,也可以使用動態(tài)生成碼表(不過是給256個數(shù)字進行CRC計算而已)。下面是生成CRC-32碼表的代碼(c語言):/-/GenCrc32Tbl函數(shù)動態(tài)生成CRC-32的預置碼表/Code:Chenji/-unsignedintCRC./在Windows下編程,int的大小是32位unsignedintCRC_32_Tbl256./用來保存碼表voidGenCrc32Tbl()for(inti=0.i256.+i)/用+i以提高效率CRC=i;for(intj=0.j1)0xEDB88320;else/0xEDB88320就是CRC-32多項表達式的值CRC=1;CRC_32_Tbli=CRC./- 上面的代碼其實就已經(jīng)實現(xiàn)了用“計算法”求取CRC校驗碼的過程,只要做些修改就可以完全實現(xiàn)。您只要將上面的代碼復制到程序中,并調(diào)用GenCrc32Tbl函數(shù),就可以在CRC_32_Tbl中生成CRC-32的預置碼表。有了碼表,用“查表法”計算CRC-32計算校驗碼就易如反掌了。根據(jù)上面介紹的算法,用C語言只需要一行就可以實現(xiàn)。CRC32=CRC_32_Tbl(CRC32(unsigned_int8*)p)i)&0xff(CRC328);下面是完整的一個實現(xiàn)函數(shù),更加簡單:/-/CalcCRC32函數(shù)計算出給定數(shù)據(jù)串的CRC-32校驗碼/Code:Chenji/-unsignedintCalcCRC32(void*DataBuff,unsignedintBufLen)/DataBuff是指向數(shù)據(jù)串的指針,BufLen是數(shù)據(jù)串的長度unsignedintCRC32=0xffffffff;/設置初始值for(unsignedlongi=0;i8);/如果你的編譯器不支持unsigned_int8定義,請試用unsignedcharreturnCRC32;/-怎么樣,用查表法計算CRC校驗碼是不是很簡單,很快捷?您只要將上面的代碼復制您的程序中,賦與對應的參數(shù),就可以實CRC-32校驗了。CRC校驗在軟件加密保護中的攻與防 上面用大篇幅介紹CRC的原理與實現(xiàn),都是為現(xiàn)在的實戰(zhàn)打基礎,現(xiàn)在我們就要用實戰(zhàn)來校驗了。 大家已經(jīng)知道,CRC校驗生成的結(jié)果只是一個Long型的整數(shù),市面上一些軟件是如何將這個整數(shù)應用在軟件加密保護中呢?這里我給大家介紹兩種常用的方式:1、是對程序自身的進行保護。首先對原始可執(zhí)行程序進行CRC校驗,同時保存校驗結(jié)果(可以保存在注冊表、配置文件或可執(zhí)行程序本身)。在程序運行時,對程序自身進行CRC校驗,并將運算出的結(jié)果與保存的原始結(jié)果進行比較,如果不相同,就說明程序已經(jīng)被修改(最有可能是被破解或被病毒感染)。即使只有1Bit的修改,都會被CRC檢查出來,所以用CRC做自校驗相當有效。2、用CRC校驗算法,對注冊名和注冊碼進行變形運算和判斷,以此做為注冊保護和授權(quán)的手段。這兩種方式在軟件保護上的運用十分廣泛??梢哉f,每一種軟件加殼(加密)保護軟件(如upx,Aspack,FSG等)都使用了CRC進行自身校驗保護。為了證明CRC在軟件加密保護上的效果,我制作了一套測試用例,大家可以在上下載CRCTest.rar壓縮包,按本文進行測試和分析。壓縮包中有兩個可執(zhí)行程序:crctest.exe和Makecrc.exe。其中crctest.exe就是我們要進行分析的對象,界面如下:軟件已經(jīng)進行了CRC外殼校驗保護,同時,使用CRC-32算法做注冊碼校驗,可以說將CRC在軟件加密保護上的應用全部發(fā)揮出來了。MakeCrc.exe是配套工具,用來給上面的程序注入CRC保護碼和計算注冊碼。 現(xiàn)在,可以打開crctest.exe文件,并隨意輸入注冊名和注冊碼,看一看! 您也可以用16進制編輯器(如:Hiew,010Editor,RTA等),將crctest.exe的最后一個字節(jié)00修改成0F 保存修改后,再運行程序,程序會提示被修改。 怎么樣,這就是CRC保護的效果。如果您試圖強行暴破來完成注冊的話,就必須修改原始文件,但是軟件將會在自校驗時發(fā)現(xiàn)自己被修改了,然后自動退出。除非您得到正確的注冊碼或注冊算法,而軟件使用的注冊算法也是由CRC算法變形實現(xiàn)的。如果在不知道具體算法的情況,想要強行暴破是比較麻煩的,這就是CRC的威力。市面上大多數(shù)軟件大多是這樣做的,畢竟誰也不想自己的軟件被人破解或修改。 但是現(xiàn)在,我們就要挑戰(zhàn)這個難題,在不了解注冊算法的情況,如何實現(xiàn)強行暴破,徹底攻破CRC的保護。 首先,您要準備一些工具:Ollydbg1.10、DeDe、Peid全能插件版,也許還需要PE-tools1.50。這些軟件您可以在網(wǎng)上很輕松的找到,如果沒有可以與我聯(lián)系。第一步:檢查 Peid是目前最流行,也是比較完善的檢測軟件。可以檢測軟件是否加殼,使用了什么編譯器等諸多信息,同時其豐富的插件可以完成許多擴展功能?,F(xiàn)在,我們先用Peid檢測crctest.exe,查看程序的基本信息。Peid顯示軟件是用“BorlandC+1999”版的編譯器進行編譯的,其實一般情況下,用BCB編譯的程序也會顯示為用“BorlandC+1999”編譯。 我們再用其中的插件“KryptoANALyzer”,來分析程序中是否有通用的加密算法。我們可以看到,程序使用了CRC-32算法:這里想告訴大家的是,KryptoANALyzer是使用查詢數(shù)組(碼表)來確定軟件使用了什么算法,而軟件使用動態(tài)生成數(shù)組(碼表)的話,它是無法檢測出算法來的。這也是它的漏洞了。你可以程序中保存一個其它算法的碼表來混淆檢測器。(crctest.exe中就定義了一個CRC32的數(shù)組,但我們并沒有使用它,而是使用了動態(tài)生成的碼表)第二步:分析 了解軟件沒有加殼,而且可能是由BCB編譯的之后,我們就要著手分析了。針對Borland公司出品的Delphi和BCB編譯器所生成執(zhí)行程序,可以使用DeDe反編譯器進行分析,它可以很好的恢復程序的原始代碼信息。 下面就是用DeDe將crctest.exe載入分析,現(xiàn)在我們切換到“過程”頁面,選擇“main”單元:btn_OKClick事件是我們感興趣的地方,當按下“注冊”按鈕時,這個事件會被調(diào)用。雙擊這個事件,我們就可以看到這個事件的匯編代碼,在其中顯示的匯編代碼已經(jīng)被DeDe處理過,對標準的函數(shù)調(diào)用已經(jīng)進行了注釋,其可讀性很好。00401C90這個地址就是這個事件函數(shù)的入口點,如果您有一些基本功,可以認真分析一下。您也許可以看出關(guān)鍵的代碼。不過,下面我們要進入動態(tài)調(diào)試了!第三步:調(diào)試破解 在檢測和分析的基礎上,我們可以開始動態(tài)調(diào)試了。我要用動態(tài)的數(shù)據(jù)來解釋破解的思路與過程?,F(xiàn)在,請打開Ollydbg動態(tài)調(diào)試器,將crctest.exe載入,停在程序的入口處。 按Ctrl+G,輸入00401C90,直接定位到“注冊”按鈕的點擊事件函數(shù)入口處,并按F2下斷點。 接下來,可以按F9運行程序,進入調(diào)試,然后在窗口中,隨便輸入注冊名和注冊碼,點擊“注冊”按鈕,程序?qū)袛嘣?0401C90處:不斷按F8單步運行,其間您可以看到許多的數(shù)據(jù)在變化,不用管它,一直按F8運行,直到顯示注冊錯誤的信息框,再看運行的狀態(tài)。 可以看到,在運行00401FDF這個地址的時候,軟件顯示了注冊錯誤的信息框。顯然這個call00468C08指令就是顯示信息框的函數(shù)。我們只要找到調(diào)用這個Call的調(diào)用(有點繞舌),就可以找到關(guān)鍵點了。大家向上回溯代碼可以看到下面的內(nèi)容:我們將匯編代碼提取出來如下:/*401F65*/leaedx,local.2/*401F68*/leaeax,local.4/*401F6B*/callcrctest.00468DA0/對比注冊碼是否正確/*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/顯示成功注冊的提示信息/*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/顯示錯誤注冊的提示信息由此可以看到軟件的注冊檢查是很簡單的,只要將00401F72處的代碼:jeshortcrctest.00401FC7修改為:nopnop就可以暴破了!大家可以在Ollydbg中將00401F72處的代碼修改成下面的形式: 然后,取消所有的斷點,直接按F9運行程序,再隨意輸入注冊名和注冊碼,點擊“注冊”??吹搅藛??軟件已經(jīng)成功注冊了!但是真的成功了嗎?不要高興的太早,還有CRC自校驗沒有解決呢!請先將修改過的程序保存為另一個文件crctest_1.exe。 方法:在匯編代碼上點右鍵,選擇“復制到可執(zhí)行程序”-“所有改動”,再選擇“全部復制”打開新的窗口。在新的窗口中點右鍵,選擇“保存文件”,輸入文件名就可以保存。 現(xiàn)在,請暫時關(guān)閉ollydbg,運行新保存的文件crctest_1.exe。怎么樣,沒有成功吧!軟件發(fā)現(xiàn)自己被修改了。目前,我們只完成了注冊碼校驗的暴破,還沒有解決CRC的校驗保護,這才是我們的重頭戲,而這其實很簡單。 再次打開ollydbg,這次就要載入crctest_1.exe了,因為它已經(jīng)暴破了注冊校驗的部分。在開始之前,我們要分析一下思路:軟件要進行自校驗,就一定要讀文件到內(nèi)存中,我們只要找到讀文件的函數(shù),就可以順藤摸瓜找到校驗的核心部分了。好,在ollydbg中按ctrl+n打開函數(shù)導入導出表,找到ReadFile函數(shù)。在ReadFile這一行上點右鍵,選擇“在每個參考上設置斷點”,狀態(tài)條上顯示有六個斷點被設置。不管它了,按F9開始運行!很快軟件就被斷下來:大家不用花時間在這些匯編代碼上,我們的目標是關(guān)鍵跳轉(zhuǎn)點。一直按F8返回到上級調(diào)用:最終我們會返回到00401A8B這個地址,而在其上、下方有兩個調(diào)用:/*401A86*/callcrctest_.00401B8C/計算當前的CRC校驗碼/*401A8B*/movesi,eax/*401A8D*/moveax,ebx/*401A8F*/callcrctest_.00401AA0/讀取原始的CRC校驗碼這兩個調(diào)用分別返回當前的CRC校驗碼和原始的CRC校驗碼,具體過程大家可以進入其中進行分析,這里不做詳解。接下來,繼續(xù)按F8,直到返回到更上級的調(diào)用(建議按Alt+B,關(guān)閉所有中斷):經(jīng)過三次返回,我們終于看到了關(guān)鍵點:/*40193E*/callcrctest_.00401A80/這個調(diào)用進行自校驗/*401943*/testal,al/檢查校驗的結(jié)果/*401945*/jnzshortcrctest_.0040196F/如果通過就跳走/*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/通過以后,就跳到這里/*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/強行跳轉(zhuǎn)就可以強制為自校驗通過的狀態(tài)。好了,接下來的保存工作就不用我多說了。最后,再用Keymake軟件制作出破解補丁就可以完成注冊了!軟件包中就保存了破解補丁crctest_patch.exe,大家只要運行就可以看到效果了!OK,到目前為止,我為您制作的CRC保護實際已經(jīng)被完全破解了,整個過程比較啰嗦,只是力求詳盡。在看過這一部分后,您應該對破解CRC保護的軟件有了感性和理性的認識。附表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儲存包中CRC檢驗位 在學TCP/IP中,關(guān)于Ethernet幀結(jié)構(gòu)中的最后一部分幀校驗字段FCS(4B),在編程通信程序時,我們需對數(shù)據(jù)鏈路層通信Ethernet幀進行校驗,即對幀校驗字段FCS進行校驗。FCS采用32位CRC校驗。校驗的范圍包括目的地址、源地址字段、類型字段、數(shù)據(jù)字段。在接受段進行校驗,如果發(fā)現(xiàn)錯誤,幀將被丟棄。下面是關(guān)于CRC的循序漸進的知識: 循環(huán)冗余碼校驗(CRC=cyclicredundancycheck),是一個信息字段和校驗字段的長度可以任意選定的差錯校驗碼。 原理:任意一個由二進制位串組成的代碼都可以和一個系數(shù)僅為0和1取值的多項式一一對應。例如:代碼1010111對應的多項式為x6+
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- HY/T 0460.5-2024海岸帶生態(tài)系統(tǒng)現(xiàn)狀調(diào)查與評估技術(shù)導則第5部分:珊瑚礁
- 起重平臺維修合同協(xié)議
- 解除商鋪轉(zhuǎn)讓合同協(xié)議
- 貨運物流租賃合同協(xié)議
- 豆皮代加工合同協(xié)議
- 豆腐經(jīng)銷代理合同協(xié)議
- 購房合同轉(zhuǎn)讓合同協(xié)議
- 講課合作協(xié)議合同協(xié)議
- 貼牌加工合同合同協(xié)議
- cdr考試試題及答案2015
- 2025年導游從業(yè)資格通關(guān)秘籍
- 中國法院知識產(chǎn)權(quán)司法保護狀況2024
- 外賣配送員工作流程總結(jié)
- 新式茶飲產(chǎn)業(yè)的技術(shù)發(fā)展現(xiàn)狀與未來創(chuàng)新趨勢
- 【國浩律師事務所】2025中國企業(yè)出海戰(zhàn)略與法律支持需求調(diào)研報告
- 2025中國低空經(jīng)濟城市發(fā)展指數(shù)報告
- 湖南省長沙市岳麓區(qū)湖南師范大學附中2025屆高三下學期第六次檢測化學試卷含解析
- 蘭州2025年中國農(nóng)業(yè)科學院蘭州畜牧與獸藥研究所招聘16人筆試歷年參考題庫附帶答案詳解
- 課題申報書:教育強國背景下加快構(gòu)建現(xiàn)代職業(yè)教育體系研究
- 山東省公共衛(wèi)生臨床中心招聘考試真題2024
- 貴州國企招聘2024貴州頁巖氣勘探開發(fā)有限責任公司招聘42人筆試參考題庫附帶答案詳解
評論
0/150
提交評論