OD入門系列詳細(xì)教程破解做輔助起步_第1頁
OD入門系列詳細(xì)教程破解做輔助起步_第2頁
OD入門系列詳細(xì)教程破解做輔助起步_第3頁
OD入門系列詳細(xì)教程破解做輔助起步_第4頁
OD入門系列詳細(xì)教程破解做輔助起步_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一、 ollydbg 的安裝與配置 ollydbg 1.10 版的發(fā)布版本是個 zip 壓縮包,只要解壓到一個目錄下,運行 ollydbg.exe 就可以了。漢化版的發(fā)布版本是個 rar 壓縮包,同樣只需解壓到一個目錄下運行 ollydbg.exe 即可: ollydbg 中各個窗口的功能如上圖。簡單解釋一下各個窗口的功能,更詳細(xì)的內(nèi)容可以參考 tt 小組翻譯的中文幫助: 反匯編窗口:顯示被調(diào)試程序的反匯編代碼,標(biāo)題欄上的地址、hex 數(shù)據(jù)、反匯編、注釋可以通過在窗口中右擊出現(xiàn)的菜單 界面選項-隱藏標(biāo)題 或 顯示標(biāo)題 來進(jìn)行切換是否顯示。用鼠標(biāo)左鍵點擊注釋標(biāo)簽可以切換注釋顯示的方式。 寄存器窗

2、口:顯示當(dāng)前所選線程的 cpu 寄存器內(nèi)容。同樣點擊標(biāo)簽 寄存器 (fpu) 可以切換顯示寄存器的方式。 信息窗口:顯示反匯編窗口中選中的第一個命令的參數(shù)及一些跳轉(zhuǎn)目標(biāo)地址、字串等。 數(shù)據(jù)窗口:顯示內(nèi)存或文件的內(nèi)容。右鍵菜單可用于切換顯示方式。 堆棧窗口:顯示當(dāng)前線程的堆棧。 要調(diào)整上面各個窗口的大小的話,只需左鍵按住邊框拖動,等調(diào)整好了,重新啟動一下 ollydbg 就可以生效了。 啟動后我們要把插件及 udd 的目錄配置為絕對路徑,點擊菜單上的 選項-界面,將會出來一個界面選項的對話框,我們點擊其中的目錄標(biāo)簽:因為我這里是把 ollydbg 解壓在 f:ollydbg 目錄下,所以相應(yīng)的

3、udd 目錄及插件目錄按圖上配置。還有一個常用到的標(biāo)簽就是上圖后面那個字體,在這里你可以更改 ollydbg 中顯示的字體。上圖中其它的選項可以保留為默認(rèn),若有需要也可以自己修改。修改完以后點擊確定,彈出一個對話框,說我們更改了插件路徑,要重新啟動 ollydbg。在這個對話框上點確定,重新啟動一下 ollydbg,我們再到界面選項中看一下,會發(fā)現(xiàn)我們原先設(shè)置好的路徑都已保存了。有人可能知道插件的作用,但對那個 udd 目錄不清楚。我這簡單解釋一下:這個 udd 目錄的作用是保存你調(diào)試的工作。比如你調(diào)試一個軟件,設(shè)置了斷點,添加了注釋,一次沒做完,這時 ollydbg 就會把你所做的工作保存到

4、這個 udd 目錄,以便你下次調(diào)試時可以繼續(xù)以前的工作。如果不設(shè)置這個 udd 目錄,ollydbg 默認(rèn)是在其安裝目錄下保存這些后綴名為 udd 的文件,時間長了就會顯的很亂,所以還是建議專門設(shè)置一個目錄來保存這些文件。 另外一個重要的選項就是調(diào)試選項,可通過菜單 選項-調(diào)試設(shè)置 來配置: 新手一般不需更改這里的選項,默認(rèn)已配置好,可以直接使用。建議在對 ollydbg 已比較熟的情況下再來進(jìn)行配置。上面那個異常標(biāo)簽中的選項經(jīng)常會在脫殼中用到,建議在有一定調(diào)試基礎(chǔ)后學(xué)脫殼時再配置這里。 除了直接啟動 ollydbg 來調(diào)試外,我們還可以把 ollydbg 添加到資源管理器右鍵菜單,這樣我們就

5、可以直接在 .exe 及 .dll 文件上點右鍵選擇“用ollydbg打開”菜單來進(jìn)行調(diào)試。要把 ollydbg 添加到資源管理器右鍵菜單,只需點菜單 選項-添加到瀏覽器,將會出現(xiàn)一個對話框,先點擊“添加 ollydbg 到系統(tǒng)資源管理器菜單”,再點擊“完成”按鈕即可。要從右鍵菜單中刪除也很簡單,還是這個對話框,點擊“從系統(tǒng)資源管理器菜單刪除 ollydbg”,再點擊“完成”就行了。 ollydbg 支持插件功能,插件的安裝也很簡單,只要把下載的插件(一般是個 dll 文件)復(fù)制到 ollydbg 安裝目錄下的 plugin 目錄中就可以了,ollydbg 啟動時會自動識別。要注意的是 oll

6、ydbg 1.10 對插件的個數(shù)有限制,最多不能超過 32 個,否則會出錯。建議插件不要添加的太多。 到這里基本配置就完成了,ollydbg 把所有配置都放在安裝目錄下的 ollydbg.ini 文件中。 二、基本調(diào)試方法 ollydbg 有三種方式來載入程序進(jìn)行調(diào)試,一種是點擊菜單 文件-打開 (快捷鍵是 f3)來打開一個可執(zhí)行文件進(jìn)行調(diào)試,另一種是點擊菜單 文件-附加 來附加到一個已運行的進(jìn)程上進(jìn)行調(diào)試。注意這里要附加的程序必須已運行。第三種就是用右鍵菜單來載入程序(不知這種算不算)。一般情況下我們選第一種方式。比如我們選擇一個 test.exe 來調(diào)試,通過菜單 文件-打開 來載入這個程

7、序,ollydbg 中顯示的內(nèi)容將會是這樣: 調(diào)試中我們經(jīng)常要用到的快捷鍵有這些: f2:設(shè)置斷點,只要在光標(biāo)定位的位置(上圖中灰色條)按f2鍵即可,再按一次f2鍵則會刪除斷點。(相當(dāng)于 softice 中的 f9) f8:單步步過。每按一次這個鍵執(zhí)行一條反匯編窗口中的一條指令,遇到 call 等子程序不進(jìn)入其代碼。(相當(dāng)于 softice 中的 f10) f7:單步步入。功能同單步步過(f8)類似,區(qū)別是遇到 call 等子程序時會進(jìn)入其中,進(jìn)入后首先會停留在子程序的第一條指令上。(相當(dāng)于 softice 中的 f8) f4:運行到選定位置。作用就是直接運行到光標(biāo)所在位置處暫停。(相當(dāng)于 s

8、oftice 中的 f7) f9:運行。按下這個鍵如果沒有設(shè)置相應(yīng)斷點的話,被調(diào)試的程序?qū)⒅苯娱_始運行。(相當(dāng)于 softice 中的 f5) ctr+f9:執(zhí)行到返回。此命令在執(zhí)行到一個 ret (返回指令)指令時暫停,常用于從系統(tǒng)領(lǐng)空返回到我們調(diào)試的程序領(lǐng)空。(相當(dāng)于 softice 中的 f12) alt+f9:執(zhí)行到用戶代碼??捎糜趶南到y(tǒng)領(lǐng)空快速返回到我們調(diào)試的程序領(lǐng)空。(相當(dāng)于 softice 中的 f11) 上面提到的幾個快捷鍵對于一般的調(diào)試基本上已夠用了。要開始調(diào)試只需設(shè)置好斷點,找到你感興趣的代碼段再按 f8 或 f7 鍵來一條條分析指令功能就可以了。就寫到這了,改天有空再接著

9、灌。二)字串參考上一篇是使用入門,現(xiàn)在我們開始正式進(jìn)入破解。今天的目標(biāo)程序是看雪兄加密與解密第一版附帶光盤中的 鏡像打包中的 cff crackme #3,采用用戶名/序列號保護(hù)方式。原版加了個 upx 的殼。剛開始學(xué)破解先不涉及殼的問題,我們主要是熟悉用 ollydbg 來破解的一般方法。我這里把殼脫掉來分析,附件是脫殼后的文件,直接就可以拿來用。先說一下一般軟件破解的流程:拿到一個軟件先別接著馬上用 ollydbg 調(diào)試,先運行一下,有幫助文檔的最好先看一下幫助,熟悉一下軟件的使用方法,再看看注冊的方式。如果是序列號方式可以先輸個假的來試一下,看看有什么反

10、應(yīng),也給我們破解留下一些有用的線索。如果沒有輸入注冊碼的地方,要考慮一下是不是讀取注冊表或 key 文件(一般稱 keyfile,就是程序讀取一個文件中的內(nèi)容來判斷是否注冊),這些可以用其它工具來輔助分析。如果這些都不是,原程序只是一個功能不全的試用版,那要注冊為正式版本就要自己來寫代碼完善了。有點跑題了,呵呵。獲得程序的一些基本信息后,還要用查殼的工具來查一下程序是否加了殼,若沒殼的話看看程序是什么編譯器編的,如 vc、delphi、vb 等。這樣的查殼工具有 peid 和 fi。有殼的話我們要盡量脫了殼后再來用 ollydbg 調(diào)試,特殊情況下也可帶殼調(diào)試。下面進(jìn)入正題: 我們先來運行一下

11、這個 crackme(用 peid 檢測顯示是 delphi 編的),界面如圖: 這個 crackme 已經(jīng)把用戶名和注冊碼都輸好了,省得我們動手_。我們在那個“register now !”按鈕上點擊一下,將會跳出一個對話框: 好了,今天我們就從這個錯誤對話框中顯示的“wrong serial, try again!”來入手。啟動 ollydbg,選擇菜單 文件-打開 載入 crackme3.exe 文件,我們會停在這里: 我們在反匯編窗口中右擊,出來一個菜單,我們在 查找-所有參考文本字串 上左鍵點擊: 當(dāng)然如果用上面那個 超級字串參考 插件會更方便。但我們的目標(biāo)是熟悉 ollydbg 的

12、一些操作,我就盡量使用 ollydbg 自帶的功能,少用插件。好了,現(xiàn)在出來另一個對話框,我們在這個對話框里右擊,選擇“查找文本”菜單項,輸入“wrong serial, try again!”的開頭單詞“wrong”(注意這里查找內(nèi)容要區(qū)分大小寫)來查找,找到一處: 在我們找到的字串上右擊,再在出來的菜單上點擊“反匯編窗口中跟隨”,我們來到這里: 見上圖,為了看看是否還有其他的參考,可以通過選擇右鍵菜單查找參考-立即數(shù),會出來一個對話框: 分別雙擊上面標(biāo)出的兩個地址,我們會來到對應(yīng)的位置: 00440f79 |. ba 8c104400 mov edx,crackme3.0044108c ;

13、 ascii wrong serial,try again! 00440f7e |. a1 442c4400 mov eax,dword ptr ds:442c44 00440f83 |. 8b00 mov eax,dword ptr ds:eax 00440f85 |. e8 dec0ffff call crackme3.0043d068 00440f8a |. eb 18 jmp short crackme3.00440fa4 00440f8c | 6a 00 push 0 00440f8e |. b9 80104400 mov ecx,crackme3.00441080 ; ascii

14、beggar off! 00440f93 |. ba 8c104400 mov edx,crackme3.0044108c ; ascii wrong serial,try again! 00440f98 |. a1 442c4400 mov eax,dword ptr ds:442c44 00440f9d |. 8b00 mov eax,dword ptr ds:eax 00440f9f |. e8 c4c0ffff call crackme3.0043d068 我們在反匯編窗口中向上滾動一下再看看: 00440f2c |. 8b45 fc mov eax,dword ptr ss:ebp-

15、4 00440f2f |. ba 14104400 mov edx,crackme3.00441014 ; ascii registered user 00440f34 |. e8 f32bfcff call crackme3.00403b2c ; 關(guān)鍵,要用f7跟進(jìn)去 00440f39 |. 75 51 jnz short crackme3.00440f8c ; 這里跳走就完蛋 00440f3b |. 8d55 fc lea edx,dword ptr ss:ebp-4 00440f3e |. 8b83 c8020000 mov eax,dword ptr ds:ebx+2c8 00440f

16、44 |. e8 d7fefdff call crackme3.00420e20 00440f49 |. 8b45 fc mov eax,dword ptr ss:ebp-4 00440f4c |. ba 2c104400 mov edx,crackme3.0044102c ; ascii gfx-754-ier-954 00440f51 |. e8 d62bfcff call crackme3.00403b2c ; 關(guān)鍵,要用f7跟進(jìn)去 00440f56 |. 75 1a jnz short crackme3.00440f72 ; 這里跳走就完蛋 00440f58 |. 6a 00 push

17、 0 00440f5a |. b9 3c104400 mov ecx,crackme3.0044103c ; ascii crackme cracked successfully 00440f5f |. ba 5c104400 mov edx,crackme3.0044105c ; ascii congrats! you cracked this crackme! 00440f64 |. a1 442c4400 mov eax,dword ptr ds:442c44 00440f69 |. 8b00 mov eax,dword ptr ds:eax 00440f6b |. e8 f8c0fff

18、f call crackme3.0043d068 00440f70 |. eb 32 jmp short crackme3.00440fa4 00440f72 | 6a 00 push 0 00440f74 |. b9 80104400 mov ecx,crackme3.00441080 ; ascii beggar off! 00440f79 |. ba 8c104400 mov edx,crackme3.0044108c ; ascii wrong serial,try again! 00440f7e |. a1 442c4400 mov eax,dword ptr ds:442c44 0

19、0440f83 |. 8b00 mov eax,dword ptr ds:eax 00440f85 |. e8 dec0ffff call crackme3.0043d068 00440f8a |. eb 18 jmp short crackme3.00440fa4 00440f8c | 6a 00 push 0 00440f8e |. b9 80104400 mov ecx,crackme3.00441080 ; ascii beggar off! 00440f93 |. ba 8c104400 mov edx,crackme3.0044108c ; ascii wrong serial,t

20、ry again! 00440f98 |. a1 442c4400 mov eax,dword ptr ds:442c44 00440f9d |. 8b00 mov eax,dword ptr ds:eax 00440f9f |. e8 c4c0ffff call crackme3.0043d068 大家注意看一下上面的注釋,我在上面標(biāo)了兩個關(guān)鍵點。有人可能要問,你怎么知道那兩個地方是關(guān)鍵點?其實很簡單,我是根據(jù)查看是哪條指令跳到“wrong serial,try again”這條字串對應(yīng)的指令來決定的。如果你在 調(diào)試選項-cpu 標(biāo)簽中把“顯示跳轉(zhuǎn)路徑”及其下面的兩個“如跳轉(zhuǎn)未實現(xiàn)則顯示灰色

21、路徑”、“顯示跳轉(zhuǎn)到選定命令的路徑”都選上的話,就會看到是從什么地方跳到出錯字串處的: (未完待續(xù)/入門系列(二)字串參考(2))我們在上圖中地址 00440f2c 處按 f2 鍵設(shè)個斷點,現(xiàn)在我們按 f9 鍵,程序已運行起來了。我在上面那個編輯框中隨便輸入一下,如 ccdebuger,下面那個編輯框我還保留為原來的“754-gfx-ier-954”,我們點一下那個“register now !”按鈕,呵,ollydbg 跳了出來,暫停在我們下的斷點處。我們看一下信息窗口,你應(yīng)該發(fā)現(xiàn)了你剛才輸入的內(nèi)容了吧?我這里顯示是這樣: 堆棧 ss:0012f9ac=00d44db4, (ascii cc

22、debuger) eax=00000009 上面的內(nèi)存地址 00d44db4 中就是我們剛才輸入的內(nèi)容,我這里是 ccdebuger。你可以在 堆棧 ss:0012f9ac=00d44db4, (ascii ccdebuger) 這條內(nèi)容上左擊選擇一下,再點右鍵,在彈出菜單中選擇“數(shù)據(jù)窗口中跟隨數(shù)值”,你就會在下面的數(shù)據(jù)窗口中看到你剛才輸入的內(nèi)容。而 eax=00000009 指的是你輸入內(nèi)容的長度。如我輸入的 ccdebuger 是9個字符。如下圖所示: 現(xiàn)在我們來按 f8 鍵一步步分析一下: 00440f2c |. 8b45 fc mov eax,dword ptr ss:ebp-4 ;

23、把我們輸入的內(nèi)容送到eax,我這里是“ccdebuger” 00440f2f |. ba 14104400 mov edx,crackme3.00441014 ; ascii registered user 00440f34 |. e8 f32bfcff call crackme3.00403b2c ; 關(guān)鍵,要用f7跟進(jìn)去 00440f39 |. 75 51 jnz short crackme3.00440f8c ; 這里跳走就完蛋 當(dāng)我們按 f8 鍵走到 00440f34 |. e8 f32bfcff call crackme3.00403b2c 這一句時,我們按一下 f7 鍵,進(jìn)入這個

24、call,進(jìn)去后光標(biāo)停在這一句: 我們所看到的那些 push ebx、 push esi 等都是調(diào)用子程序保存堆棧時用的指令,不用管它,按 f8 鍵一步步過來,我們只關(guān)心關(guān)鍵部分: 00403b2c /$ 53 push ebx 00403b2d |. 56 push esi 00403b2e |. 57 push edi 00403b2f |. 89c6 mov esi,eax ; 把eax內(nèi)我們輸入的用戶名送到 esi 00403b31 |. 89d7 mov edi,edx ; 把edx內(nèi)的數(shù)據(jù)“registered user”送到edi 00403b33 |. 39d0 cmp eax

25、,edx ; 用“registered user”和我們輸入的用戶名作比較 00403b35 |. 0f84 8f000000 je crackme3.00403bca ; 相同則跳 00403b3b |. 85f6 test esi,esi ; 看看esi中是否有數(shù)據(jù),主要是看看我們有沒有輸入用戶名 00403b3d |. 74 68 je short crackme3.00403ba7 ; 用戶名為空則跳 00403b3f |. 85ff test edi,edi 00403b41 |. 74 6b je short crackme3.00403bae 00403b43 |. 8b46 f

26、c mov eax,dword ptr ds:esi-4 ; 用戶名長度送eax 00403b46 |. 8b57 fc mov edx,dword ptr ds:edi-4 ; “registered user”字串的長度送edx 00403b49 |. 29d0 sub eax,edx ; 把用戶名長度和“registered user”字串長度相減 00403b4b |. 77 02 ja short crackme3.00403b4f ; 用戶名長度大于“registered user”長度則跳 00403b4d |. 01c2 add edx,eax ; 把減后值與“register

27、ed user”長度相加,即用戶名長度 00403b4f | 52 push edx 00403b50 |. c1ea 02 shr edx,2 ; 用戶名長度值右移2位,這里相當(dāng)于長度除以4 00403b53 |. 74 26 je short crackme3.00403b7b ; 上面的指令及這條指令就是判斷用戶名長度最少不能低于4 00403b55 | 8b0e mov ecx,dword ptr ds:esi ; 把我們輸入的用戶名送到ecx 00403b57 |. 8b1f mov ebx,dword ptr ds:edi ; 把“registered user”送到ebx 004

28、03b59 |. 39d9 cmp ecx,ebx ; 比較 00403b5b |. 75 58 jnz short crackme3.00403bb5 ; 不等則完蛋 根據(jù)上面的分析,我們知道用戶名必須是“registered user”。我們按 f9 鍵讓程序運行,出現(xiàn)錯誤對話框,點確定,重新在第一個編輯框中輸入“registered user”,再次點擊那個“register now !”按鈕,被 ollydbg 攔下。因為地址 00440f34 處的那個 call 我們已經(jīng)分析清楚了,這次就不用再按 f7 鍵跟進(jìn)去了,直接按 f8 鍵通過。我們一路按 f8 鍵,來到第二個關(guān)鍵代碼處:

29、00440f49 |. 8b45 fc mov eax,dword ptr ss:ebp-4 ; 取輸入的注冊碼 00440f4c |. ba 2c104400 mov edx,crackme3.0044102c ; ascii gfx-754-ier-954 00440f51 |. e8 d62bfcff call crackme3.00403b2c ; 關(guān)鍵,要用f7跟進(jìn)去 00440f56 |. 75 1a jnz short crackme3.00440f72 ; 這里跳走就完蛋 大家注意看一下,地址 00440f51 處的 call crackme3.00403b2c 和上面我們分析

30、的地址 00440f34 處的 call crackme3.00403b2c 是不是匯編指令都一樣???這說明檢測用戶名和注冊碼是用的同一個子程序。而這個子程序 call 我們在上面已經(jīng)分析過了。我們執(zhí)行到現(xiàn)在可以很容易得出結(jié)論,這個 call 也就是把我們輸入的注冊碼與 00440f4c 地址處指令后的“gfx-754-ier-954”作比較,相等則 ok。好了,我們已經(jīng)得到足夠的信息了?,F(xiàn)在我們在菜單 查看-斷點 上點擊一下,打開斷點窗口(也可以通過組合鍵 alt+b 或點擊工具欄上那個“b”圖標(biāo)打開斷點窗口): 為什么要做這一步,而不是把這個斷點刪除呢?這里主要是為了保險一點,萬一分析錯誤

31、,我們還要接著分析,要是把斷點刪除了就要做一些重復(fù)工作了。還是先禁用一下,如果經(jīng)過實際驗證證明我們的分析是正確的,再刪不遲?,F(xiàn)在我們把斷點禁用,在 ollydbg 中按 f9 鍵讓程序運行。輸入我們經(jīng)分析得出的內(nèi)容: 用戶名:registered user 注冊碼:gfx-754-ier-954 點擊“register now !”按鈕,呵呵,終于成功了: (三)函數(shù)參考現(xiàn)在進(jìn)入第三篇,這一篇我們重點講解怎樣使用 ollydbg 中的函數(shù)參考(即名稱參考)功能。仍然選擇 鏡像打包中的一個名稱為 crackhead 的crackme。老規(guī)矩,先運行一下這個程序看

32、看:呵,竟然沒找到輸入注冊碼的地方!別急,我們點一下程序上的那個菜單“shit”(真是 shit 啊,呵呵),在下拉菜單中選“try it”,會來到如下界面:我們點一下那個“check it”按鈕試一下,哦,竟然沒反應(yīng)!我再輸個“78787878”試試,還是沒反應(yīng)。再試試輸入字母或其它字符,輸不進(jìn)去。由此判斷注冊碼應(yīng)該都是數(shù)字,只有輸入正確的注冊碼才有動靜。用 peid 檢測一下,結(jié)果為 masm32 / tasm32,怪不得程序比較小。信息收集的差不多了,現(xiàn)在關(guān)掉這個程序,我們用 ollydbg 載入,按 f9 鍵直接讓它運行起來,依次點擊上面圖中所說的菜單,使被調(diào)試程序顯示如上面的第二個圖

33、。先不要點那個“check it”按鈕,保留上圖的狀態(tài)。現(xiàn)在我們沒有什么字串好參考了,我們就在 api 函數(shù)上下斷點,來讓被調(diào)試程序中斷在我們希望的地方。我們在 ollydbg 的反匯編窗口中右擊鼠標(biāo),在彈出菜單中選擇 查找-當(dāng)前模塊中的名稱 (標(biāo)簽),或者我們通過按 ctr+n 組合鍵也可以達(dá)到同樣的效果(注意在進(jìn)行此操作時要在 ollydbg 中保證是在當(dāng)前被調(diào)試程序的領(lǐng)空,我在第一篇中已經(jīng)介紹了領(lǐng)空的概念,如我這里調(diào)試這個程序時 ollydbg 的標(biāo)題欄顯示的就是“cpu - 主線程, 模塊 - crackhea”,這表明我們當(dāng)前在被調(diào)試程序的領(lǐng)空)。通過上面的操作后會彈出一個對話框,如

34、圖:對于這樣的編輯框中輸注冊碼的程序我們要設(shè)斷點首選的 api 函數(shù)就是 getdlgitemtext 及 getwindowtext。每個函數(shù)都有兩個版本,一個是 ascii 版,在函數(shù)后添加一個 a 表示,如 getdlgitemtexta,另一個是 unicode 版,在函數(shù)后添加一個 w 表示。如 getdlgitemtextw。對于編譯為 uncode 版的程序可能在 win98 下不能運行,因為 win98 并非是完全支持 unicode 的系統(tǒng)。而 nt 系統(tǒng)則從底層支持 unicode,它可以在操作系統(tǒng)內(nèi)對字串進(jìn)行轉(zhuǎn)換,同時支持 ascii 和 unicode 版本函數(shù)的調(diào)用。

35、一般我們打開的程序看到的調(diào)用都是 ascii 類型的函數(shù),以“a”結(jié)尾。又跑題了,呵呵?,F(xiàn)在回到我們調(diào)試的程序上來,我們現(xiàn)在就是要找一下我們調(diào)試的程序有沒有調(diào)用 getdlgitemtexta 或 getwindowtexta 函數(shù)。還好,找到一個 getwindowtexta。在這個函數(shù)上右擊,在彈出菜單上選擇“在每個參考上設(shè)置斷點”,我們會在 ollydbg 窗口最下面的那個狀態(tài)欄里看到“已設(shè)置 2 個斷點”。另一種方法就是那個 getwindowtexta 函數(shù)上右擊,在彈出菜單上選擇“查找輸入函數(shù)參考”(或者按回車鍵),將會出現(xiàn)下面的對話框:看上圖,我們可以把兩條都設(shè)上斷點。這個程序只

36、需在第一條指令設(shè)斷點就可以了。好,我們現(xiàn)在按前面提到的第一條方法,就是“在每個參考上設(shè)置斷點”,這樣上圖中的兩條指令都會設(shè)上斷點。斷點設(shè)好后我們轉(zhuǎn)到我們調(diào)試的程序上來,現(xiàn)在我們在被我們調(diào)試的程序上點擊那個“check it”按鈕,被 ollydbg 斷下:00401323 |. e8 4c010000 call ; getwindowtexta00401328 |. e8 a5000000 call crackhea.004013d2 ; 關(guān)鍵,要按f7鍵跟進(jìn)去0040132d |. 3bc6 cmp eax,esi ; 比較0040132f |. 75 42 jnz short crackh

37、ea.00401373 ; 不等則完蛋00401331 |. eb 2c jmp short crackhea.0040135f00401333 |. 4e 6f 77 20 7 ascii now write a keyg00401343 |. 65 6e 20 61 6 ascii en and tut and y00401353 |. 6f 75 27 72 6 ascii oure done.,00040135f | 6a 00 push 0 ; style = mb_ok|mb_applmodal00401361 |. 68 0f304000 push crackhea.004030

38、0f ; title = crudds crack head00401366 |. 68 33134000 push crackhea.00401333 ; text = now write a keygen and tut and youre done.0040136b |. ff75 08 push dword ptr ss:ebp+8 ; howner0040136e |. e8 19010000 call ; messageboxa從上面的代碼,我們很容易看出 00401328 地址處的 call crackhea.004013d2 是關(guān)鍵,必須仔細(xì)跟蹤。而注冊成功則會顯示一個對話框,

39、標(biāo)題是“crudds crack head”,對話框顯示的內(nèi)容是“now write a keygen and tut and youre done.”現(xiàn)在我按一下 f8,準(zhǔn)備步進(jìn)到 00401328 地址處的那條 call crackhea.004013d2 指令后再按 f7 鍵跟進(jìn)去。等等,怎么回事?怎么按一下 f8 鍵跑到這來了:00401474 $- ff25 2c204000 jmp dword ptr ds: ; user32.getwindowtexta0040147a $- ff25 30204000 jmp dword ptr ds: ; user32.loadcursora

40、00401480 $- ff25 1c204000 jmp dword ptr ds: ; user32.loadicona00401486 $- ff25 20204000 jmp dword ptr ds: ; user32.loadmenua0040148c $- ff25 24204000 jmp dword ptr ds: ; user32.messageboxa原來是跳到另一個斷點了。這個斷點我們不需要,按一下 f2 鍵刪掉它吧。刪掉 00401474 地址處的斷點后,我再按 f8 鍵,呵,完了,跑到 user32.dll 的領(lǐng)空了??匆幌?ollydbg 的標(biāo)題欄:“cpu -

41、主線程, 模塊 - user32,跑到系統(tǒng)領(lǐng)空了,ollydbg 反匯編窗口中顯示代碼是這樣:77d3213c 6a 0c push 0c77d3213e 68 a021d377 push user32.77d321a077d32143 e8 7864feff call user32.77d185c0怎么辦?別急,我們按一下 alt+f9 組合鍵,呵,回來了:00401328 |. e8 a5000000 call crackhea.004013d2 ; 關(guān)鍵,要按f7鍵跟進(jìn)去0040132d |. 3bc6 cmp eax,esi ; 比較0040132f |. 75 42 jnz shor

42、t crackhea.00401373 ; 不等則完蛋光標(biāo)停在 00401328 地址處的那條指令上?,F(xiàn)在我們按 f7 鍵跟進(jìn):004013d2 /$ 56 push esi ; esi入棧004013d3 |. 33c0 xor eax,eax ; eax清零004013d5 |. 8d35 c4334000 lea esi,dword ptr ds:4033c4 ; 把注冊碼框中的數(shù)值送到esi004013db |. 33c9 xor ecx,ecx ; ecx清零004013dd |. 33d2 xor edx,edx ; edx清零004013df |. 8a06 mov al,byt

43、e ptr ds:esi ; 把注冊碼中的每個字符送到al004013e1 |. 46 inc esi ; 指針加1,指向下一個字符004013e2 |. 3c 2d cmp al,2d ; 把取得的字符與16進(jìn)制值為2d的字符(即“-”)比較,這里主要用于判斷輸入的是不是負(fù)數(shù)004013e4 |. 75 08 jnz short crackhea.004013ee ; 不等則跳004013e6 |. ba ffffffff mov edx,-1 ; 如果輸入的是負(fù)數(shù),則把-1送到edx,即16進(jìn)制ffffffff004013eb |. 8a06 mov al,byte ptr ds:esi

44、; 取“-”號后的第一個字符004013ed |. 46 inc esi ; 指針加1,指向再下一個字符004013ee | eb 0b jmp short crackhea.004013fb004013f0 | 2c 30 sub al,30 ; 每位字符減16進(jìn)制的30,因為這里都是數(shù)字,如1的ascii碼是“31h”,減30h后為1,即我們平時看到的數(shù)值004013f2 |. 8d0c89 lea ecx,dword ptr ds:ecx+ecx*4 ; 把前面運算后保存在ecx中的結(jié)果乘5再送到ecx004013f5 |. 8d0c48 lea ecx,dword ptr ds:eax

45、+ecx*2 ; 每位字符運算后的值與2倍上一位字符運算后值相加后送ecx004013f8 |. 8a06 mov al,byte ptr ds:esi ; 取下一個字符004013fa |. 46 inc esi ; 指針加1,指向再下一個字符004013fb | 0ac0 or al,al004013fd |. 75 f1 jnz short crackhea.004013f0 ; 上面一條和這一條指令主要是用來判斷是否已把用戶輸入的注冊碼計算完004013ff |. 8d040a lea eax,dword ptr ds:edx+ecx ; 把edx中的值與經(jīng)過上面運算后的ecx中值相加

46、送到eax00401402 |. 33c2 xor eax,edx ; 把eax與edx異或。如果我們輸入的是負(fù)數(shù),則此處功能就是把eax中的值取反00401404 |. 5e pop esi ; esi出棧??吹竭@條和下一條指令,我們要考慮一下這個esi的值是哪里運算得出的呢?00401405 |. 81f6 53757a79 xor esi,797a7553 ; 把esi中的值與797a7553h異或0040140b . c3 retn函數(shù)參(2)這里留下了一個問題:那個 esi 寄存器中的值是從哪運算出來的?先不管這里,我們接著按 f8 鍵往下走,來到 0040140b 地址處的那條 r

47、etn 指令(這里可以通過在調(diào)試選項的“命令”標(biāo)簽中勾選“使用 ret 代替 retn”來更改返回指令的顯示方式),再按一下 f8,我們就走出 00401328 地址處的那個 call 了?,F(xiàn)在我們回到了這里:0040132d |. 3bc6 cmp eax,esi ; 比較0040132f |. 75 42 jnz short crackhea.00401373 ; 不等則完蛋光標(biāo)停在了 0040132d 地址處的那條指令上。根據(jù)前面的分析,我們知道 eax 中存放的是我們輸入的注冊碼經(jīng)過計算后的值。我們來看一下信息窗口:esi=e6b5f2f9eax=ff439ebe左鍵選擇信息窗口中的

48、esi=e6b5f2f9,再按右鍵,在彈出菜單上選“修改寄存器”,我們會看到這樣一個窗口:可能你的顯示跟我不一樣,因為這個 crackme 中已經(jīng)說了每個機器的序列號不一樣。關(guān)掉上面的窗口,再對信息窗口中的 eax=ff439ebe 做同樣操作:由上圖我們知道了原來前面分析的對我們輸入的注冊碼進(jìn)行處理后的結(jié)果就是把字符格式轉(zhuǎn)為數(shù)字格式。我們原來輸入的是字串“12345666”,現(xiàn)在轉(zhuǎn)換為了數(shù)字 12345666。這下就很清楚了,隨便在上面那個修改 esi 圖中顯示的有符號或無符號編輯框中復(fù)制一個,粘貼到我們調(diào)試的程序中的編輯框中試一下:呵呵,成功了。且慢高興,這個 crackme 是要求寫出注

49、冊機的。我們先不要求寫注冊機,但注冊的算法我們要搞清楚。還記得我在前面說到的那個 esi 寄存器值的問題嗎?現(xiàn)在看看我們上面的分析,其實對做注冊機來說是沒有多少幫助的。要搞清注冊算法,必須知道上面那個 esi 寄存器值是如何產(chǎn)生的,這弄清楚后才能真正清楚這個 crackme 算法。今天就先說到這里,關(guān)于如何追出 esi 寄存器的值我就留到下一篇 ollydbg 入門系列(四)內(nèi)存斷點 中再講吧。(四)內(nèi)存斷點還記得上一篇ollydbg 入門系列(三)函數(shù)參考中的內(nèi)容嗎?在那篇文章中我們分析后發(fā)現(xiàn)一個 esi 寄存器值不知是從什么地方產(chǎn)生的,要弄清這個問題必須要找到生成這個 esi 值的計算部分。今天我們的任務(wù)就是使用 ollydbg 的內(nèi)存斷點功能找到這個地方,搞清楚這個值是如何算出來的。這次分析的目標(biāo)程序還是上一篇的那個 crackme,附件我就不再上傳了,用上篇中的附件就可以了。下面我們開始:還記得我們上篇中所說的關(guān)鍵代碼的地方嗎?溫習(xí)一下:00401323 |. e8 4c010000 call ; getwindowtexta00401328 |. e8 a5000000 call crackh

溫馨提示

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

最新文檔

評論

0/150

提交評論