欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

取密鑰生成算法(圖)

互聯(lián)網(wǎng)   發(fā)布時(shí)間:2008-10-08 19:02:43   作者:佚名   我要評(píng)論
從拷貝保護(hù)產(chǎn)品中剝?nèi)。╮ipping)算法通常是創(chuàng)建密鑰生成程序的一種簡(jiǎn)單而行之有效的方法。其思路非常簡(jiǎn)單:定位受保護(hù)程序內(nèi)計(jì)算合法序列號(hào)的函數(shù)(可能不止一個(gè)函數(shù)),并將它(們)移植到你密鑰生成程序中。這種方法的美妙之處在于你不需要真正理解這個(gè)算法,你只需

從拷貝保護(hù)產(chǎn)品中剝?nèi)。╮ipping)算法通常是創(chuàng)建密鑰生成程序的一種簡(jiǎn)單而行之有效的方法。其思路非常簡(jiǎn)單:定位受保護(hù)程序內(nèi)計(jì)算合法序列號(hào)的函數(shù)(可能不止一個(gè)函數(shù)),并將它(們)移植到你密鑰生成程序中。這種方法的美妙之處在于你不需要真正理解這個(gè)算法,你只需要找到生成合法序列號(hào)這個(gè)(或些)函數(shù)并想辦法在自己的程序中調(diào)用它(們)。
你第一個(gè)必須要完成的任務(wù)是定位這個(gè)crackme程序內(nèi)的密鑰生成算法??梢圆扇〉霓k法有很多,但有一種方法很少會(huì)失敗,那就是尋找讀取你輸入用戶(hù)名和序列號(hào)的兩個(gè)文本框的那段代碼。假定KegenMe-3的主窗口是一個(gè)對(duì)話(huà)框(這一點(diǎn)通過(guò)查找程序初始化代碼中的創(chuàng)建對(duì)話(huà)框的API函數(shù)就可以很容易地得到證實(shí)),很可能程序會(huì)使用GetDlgItemText函數(shù)或者向文本框發(fā)送WM_GETTEXT消息。假定這個(gè)程序使用的是GetDlgItemText,你可以返回到OllyDbg的“Name(名稱(chēng))”窗口查找調(diào)用GetDlgItemTextA或調(diào)用GetDlgItemTextW的代碼。不出所料,你會(huì)發(fā)現(xiàn)程序調(diào)用了GetDlgItemTextA函數(shù)。打開(kāi)“Find References to Import(查找導(dǎo)入項(xiàng)的引用)”窗口,你會(huì)看到有兩處代碼調(diào)用了這個(gè)GetDlgItemTextA函數(shù)(不計(jì)那條直接跳轉(zhuǎn)的JMP指令,它是這個(gè)函數(shù)的導(dǎo)入地址表中的項(xiàng))。


列表11.1 KeygenMe-3中第一個(gè)輸入字符串的轉(zhuǎn)換算法






列表11.1
在試著從列表11.1給出的代碼中剝?nèi)〕鲛D(zhuǎn)換算法之前,讓我們先看一下在Key4.00401388處的這個(gè)函數(shù),它顯然也是算法的一部分。


列表11.2 KeygenMe-3中第二個(gè)輸入字符串的轉(zhuǎn)換算法


列表11.2
通過(guò)查看這段代碼,你可以明顯地看到好像有兩段代碼中包含了密鑰生成算法。第一段是列表11.1中Key4.0040130B部分,第二段是列表11.2給出的整個(gè)函數(shù)。列表11.1中的那部分代碼生成了ESI寄存器中的值,而列表11.2中的函數(shù)將返回值賦給了EAX寄存器。然后比較這兩個(gè)值,如果兩個(gè)值相等的話(huà),程序就報(bào)告成功通過(guò)驗(yàn)證(也就是我們剛才修補(bǔ)過(guò)的地方)。
我們從Key4.0040130B處的代碼片段開(kāi)始,確定它要接收什么樣的輸入數(shù)據(jù)。這段代碼開(kāi)始之前ECX寄存器已經(jīng)存放了輸入的第一個(gè)字符串(從上面那個(gè)文本框輸入的字符串)的長(zhǎng)度,開(kāi)始之后代碼中又出現(xiàn)了該字符串的地址(40303F)和一個(gè)未知的硬編碼地址(40351F)。首先要注意的是,這段代碼并沒(méi)有挨個(gè)地處理字符串中的每個(gè)字符。相反,它只是讀取字符串的前四個(gè)字符,并把它們當(dāng)作一個(gè)雙字來(lái)處理。要把這些代碼移植到自己的密鑰生成程序中,必須先弄清楚40351F中存放的到底是什么。首先,你可以看到這個(gè)地址在引用之前總是先與EAX寄存器中的值相加。在第一次迭代中,EAX寄存器的值為1,所以訪(fǎng)問(wèn)的實(shí)際地址是403520。在接下來(lái)的迭代中,EAX的值一直為4,所以你現(xiàn)在應(yīng)該去查看403524這個(gè)地址。在OllyDbg中讀出403520處的內(nèi)存,你可以看到這個(gè)地址包含了下面這些數(shù)據(jù):


要注意的是,這一行代碼把這個(gè)地址當(dāng)作一個(gè)單字節(jié)來(lái)訪(fǎng)問(wèn),而不是按完整的DWORD訪(fǎng)問(wèn),所以實(shí)際上程序只訪(fǎng)問(wèn)了第一字節(jié)(0x25)和第四字節(jié)(0x65)的內(nèi)容。
查看列表11.1中的第一個(gè)算法,你會(huì)發(fā)現(xiàn)這顯然是一個(gè)將用戶(hù)名轉(zhuǎn)換成一個(gè)32位數(shù)的密鑰生成算法(轉(zhuǎn)換完成后存放在ESI寄存器中)。那么,列表11.2中的第二個(gè)算法又在干什么呢?通過(guò)快速瀏覽就可以看出這段代碼中沒(méi)有任何復(fù)雜的處理。它只是逐個(gè)檢查我們輸入的序列號(hào)中的每一個(gè)數(shù)字,每檢查一個(gè)都把它的值減去0x30(0x30恰好就是ASCII碼中“0“的編碼)并將結(jié)果反復(fù)地乘以10,直到ECX寄存器中的值變成0為止。對(duì)源串中每一個(gè)字符進(jìn)行乘10運(yùn)算是在一個(gè)內(nèi)部循環(huán)中完成的,且乘以10的次數(shù)取決于這個(gè)數(shù)字在源串中的位置。
在調(diào)試器中單步調(diào)試這段代碼,我們會(huì)看到一些有經(jīng)驗(yàn)的逆向工作者僅通過(guò)觀察這個(gè)函數(shù)就可以獲得的一些信息。這個(gè)函數(shù)實(shí)際上就是把通過(guò)參數(shù)傳入的字符串轉(zhuǎn)化成一個(gè)二進(jìn)制的DWORD(雙字),它相當(dāng)于C運(yùn)行庫(kù)中的atoi函數(shù),但它看上去更像是一個(gè)atoi函數(shù)的個(gè)人實(shí)現(xiàn)版本(atoi要稍微復(fù)雜一點(diǎn),如果有相應(yīng)的庫(kù)文件,并且因?yàn)镺llyDbg能夠識(shí)別出庫(kù)函數(shù)——如果程序中用了atoi函數(shù)的話(huà),肯定會(huì)被OllyDbg識(shí)別出來(lái),但OllyDbg沒(méi)有在KeygenMe-3中找到相關(guān)的任何信息)。
因此,好像第一個(gè)算法(列表11.1中的算法)使用了一個(gè)專(zhuān)門(mén)的算法將用戶(hù)名轉(zhuǎn)換成32位的DWORD,而第二個(gè)算法只是簡(jiǎn)單地將下面的那個(gè)文本框中輸入的內(nèi)容轉(zhuǎn)換成數(shù)字形式。下面的那個(gè)文本框中所包含的應(yīng)該就是第一個(gè)算法生成的數(shù)。根據(jù)這一線(xiàn)索,好像我們只需要把第一個(gè)算法“剝?nèi) 背鰜?lái)放到我們的密鑰生成程序中,就可以讓它為我們生成序列號(hào)了。讓我們來(lái)試試看。
表11.3給出了我為密鑰生成程序創(chuàng)建的取出來(lái)的子程序。它實(shí)際上是一個(gè)C函數(shù)(用Microsoft的C/C 編譯器編譯),其中是一段從OllyDbg的反匯編器中拷貝而來(lái)的一段直接插入的(inline。譯注:用“_asm { }”括起來(lái)的部分)匯編代碼。用小寫(xiě)字母表示的指令是我手工加上去的,還包括LoopStart這個(gè)名稱(chēng)。


列表11.3 從KeygenMe-3中取出的處理第一個(gè)字符串的轉(zhuǎn)換算法


列表11.3
我把這個(gè)函數(shù)(函數(shù)名為ComputeSerial)插入到一個(gè)短小的控制臺(tái)模式的應(yīng)用程序中(console mode application),這個(gè)程序要求用戶(hù)輸入用戶(hù)名,并以十進(jìn)制數(shù)形式顯示ComputeSerial函數(shù)的返回值。這個(gè)程序所要做的只是調(diào)用ComputeSerial函數(shù)并以十進(jìn)制數(shù)的形式顯示ComputeSerial的返回值。下面是我的密鑰生成程序的入口程序:


似乎輸入任意一個(gè)名字到KeygenMe-3主界面的上面的那個(gè)文本框(這個(gè)名字應(yīng)與作為參數(shù)傳遞給ComputeSerial函數(shù)的名字相同),然后將ComputeSerial函數(shù)的返回值鍵入到KeygenMe-3主界面的第二個(gè)文本框,就可以讓KeygenMe-3顯示成功消息框了。讓我們來(lái)試試看。你可以將“John Doe”作為參數(shù)傳遞給我們的密鑰生成程序,并記下生成的序列號(hào)。圖11.9顯示了密鑰生成程序的輸出界面。


圖11.9 運(yùn)行中的KeygenMe-3密鑰生成程序
最后得到的序列號(hào)為580695444。運(yùn)行KeygenMe-3(未做補(bǔ)丁的那個(gè)版本),在第一個(gè)文本框中輸入“John Doe”,在第二個(gè)文本框中輸入“580695444”。又成功了!KeygenMe-3將這兩個(gè)輸入值作為合法的值接受了。恭喜你,你的第二節(jié)破解課程到此結(jié)束。

相關(guān)文章

最新評(píng)論