[转]OllyDBG 入门系列(二)-字串参考
生活随笔
收集整理的這篇文章主要介紹了
[转]OllyDBG 入门系列(二)-字串参考
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
| 標(biāo) 題:?【原創(chuàng)】OllyDBG 入門系列(二)-字串參考 作 者:?CCDebuger 時(shí) 間:?2006-02-14,13:34 鏈 接:?http://bbs.pediy.com/showthread.php?t=21308 引用: 感謝?chuxuezhe?朋友的反饋: http://bbs.pediy.com/showthread.php?s=&threadid=24703 經(jīng)檢查才發(fā)現(xiàn)原來是寫文章前曾用修改過的?Ultra?String?Reference?插件查找過字串,這個(gè)修改后的插件會(huì)把找到的字串自動(dòng)添加到代碼后面作為注釋,且所有字母都一律小寫,導(dǎo)致原來文章寫的時(shí)候注釋中的大小寫分不清楚,比較混亂。這次把文章一些地方修改了一下,全部用OD自帶功能進(jìn)行操作,重新制作了幾個(gè)圖片。因?yàn)槲易约旱氖д`,在此對(duì)給大家造成了閱讀中的困惑表示抱歉! OllyDBG?入門系列(二)-字串參考 作者:CCDebuger 上一篇是使用入門,現(xiàn)在我們開始正式進(jìn)入破解。今天的目標(biāo)程序是看雪兄《加密與解密》第一版附帶光盤中的?crackmes.cjb.net?鏡像打包中的?CFF?Crackme?#3,采用用戶名/序列號(hào)保護(hù)方式。原版加了個(gè)?UPX?的殼。剛開始學(xué)破解先不涉及殼的問題,我們主要是熟悉用?OllyDBG?來破解的一般方法。我這里把殼脫掉來分析,附件是脫殼后的文件,直接就可以拿來用。先說一下一般軟件破解的流程:拿到一個(gè)軟件先別接著馬上用?OllyDBG?調(diào)試,先運(yùn)行一下,有幫助文檔的最好先看一下幫助,熟悉一下軟件的使用方法,再看看注冊(cè)的方式。如果是序列號(hào)方式可以先輸個(gè)假的來試一下,看看有什么反應(yīng),也給我們破解留下一些有用的線索。如果沒有輸入注冊(cè)碼的地方,要考慮一下是不是讀取注冊(cè)表或?Key?文件(一般稱?keyfile,就是程序讀取一個(gè)文件中的內(nèi)容來判斷是否注冊(cè)),這些可以用其它工具來輔助分析。如果這些都不是,原程序只是一個(gè)功能不全的試用版,那要注冊(cè)為正式版本就要自己來寫代碼完善了。有點(diǎn)跑題了,呵呵。獲得程序的一些基本信息后,還要用查殼的工具來查一下程序是否加了殼,若沒殼的話看看程序是什么編譯器編的,如?VC、Delphi、VB?等。這樣的查殼工具有?PEiD?和?FI。有殼的話我們要盡量脫了殼后再來用?OllyDBG?調(diào)試,特殊情況下也可帶殼調(diào)試。下面進(jìn)入正題: 我們先來運(yùn)行一下這個(gè)?crackme(用?PEiD?檢測(cè)顯示是?Delphi?編的),界面如圖: 這個(gè)?crackme?已經(jīng)把用戶名和注冊(cè)碼都輸好了,省得我們動(dòng)手^_^。我們?cè)谀莻€(gè)“Register?now?!”按鈕上點(diǎn)擊一下,將會(huì)跳出一個(gè)對(duì)話框: ? 好了,今天我們就從這個(gè)錯(cuò)誤對(duì)話框中顯示的“Wrong?Serial,?try?again!”來入手。啟動(dòng)?OllyDBG,選擇菜單?文件->打開?載入?CrackMe3.exe?文件,我們會(huì)停在這里: ? 我們?cè)诜磪R編窗口中右擊,出來一個(gè)菜單,我們?cè)?查找->所有參考文本字串?上左鍵點(diǎn)擊: 當(dāng)然如果用上面那個(gè)?超級(jí)字串參考+?插件會(huì)更方便。但我們的目標(biāo)是熟悉?OllyDBG?的一些操作,我就盡量使用?OllyDBG?自帶的功能,少用插件。好了,現(xiàn)在出來另一個(gè)對(duì)話框,我們?cè)谶@個(gè)對(duì)話框里右擊,選擇“查找文本”菜單項(xiàng),輸入“Wrong?Serial,?try?again!”的開頭單詞“Wrong”(注意這里查找內(nèi)容要區(qū)分大小寫)來查找,找到一處: ? 在我們找到的字串上右擊,再在出來的菜單上點(diǎn)擊“反匯編窗口中跟隨”,我們來到這里: 見上圖,為了看看是否還有其他的參考,可以通過選擇右鍵菜單查找參考->立即數(shù),會(huì)出來一個(gè)對(duì)話框: 分別雙擊上面標(biāo)出的兩個(gè)地址,我們會(huì)來到對(duì)應(yīng)的位置: 00440F79?|.?BA?8C104400?????MOV?EDX,CrackMe3.0044108C?????????????;?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?"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 我們?cè)诜磪R編窗口中向上滾動(dòng)一下再看看: 00440F2C?|.?8B45?FC?????????MOV?EAX,DWORD?PTR?SS:[EBP-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] 00440F44?|.?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?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?F8C0FFFF?????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] 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?"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 大家注意看一下上面的注釋,我在上面標(biāo)了兩個(gè)關(guān)鍵點(diǎn)。有人可能要問,你怎么知道那兩個(gè)地方是關(guān)鍵點(diǎn)?其實(shí)很簡單,我是根據(jù)查看是哪條指令跳到“wrong?serial,try?again”這條字串對(duì)應(yīng)的指令來決定的。如果你在?調(diào)試選項(xiàng)->CPU?標(biāo)簽中把“顯示跳轉(zhuǎn)路徑”及其下面的兩個(gè)“如跳轉(zhuǎn)未實(shí)現(xiàn)則顯示灰色路徑”、“顯示跳轉(zhuǎn)到選定命令的路徑”都選上的話,就會(huì)看到是從什么地方跳到出錯(cuò)字串處的: 我們?cè)谏蠄D中地址?00440F2C?處按?F2?鍵設(shè)個(gè)斷點(diǎn),現(xiàn)在我們按?F9?鍵,程序已運(yùn)行起來了。我在上面那個(gè)編輯框中隨便輸入一下,如?CCDebuger,下面那個(gè)編輯框我還保留為原來的“754-GFX-IER-954”,我們點(diǎn)一下那個(gè)“Register?now?!”按鈕,呵,OllyDBG?跳了出來,暫停在我們下的斷點(diǎn)處。我們看一下信息窗口,你應(yīng)該發(fā)現(xiàn)了你剛才輸入的內(nèi)容了吧?我這里顯示是這樣: 堆棧?SS:[0012F9AC]=00D44DB4,?(ASCII?"CCDebuger") EAX=00000009 上面的內(nèi)存地址?00D44DB4?中就是我們剛才輸入的內(nèi)容,我這里是?CCDebuger。你可以在?堆棧?SS:[0012F9AC]=00D44DB4,?(ASCII?"CCDebuger")?這條內(nèi)容上左擊選擇一下,再點(diǎn)右鍵,在彈出菜單中選擇“數(shù)據(jù)窗口中跟隨數(shù)值”,你就會(huì)在下面的數(shù)據(jù)窗口中看到你剛才輸入的內(nèi)容。而?EAX=00000009?指的是你輸入內(nèi)容的長度。如我輸入的?CCDebuger?是9個(gè)字符。如下圖所示: ? 現(xiàn)在我們來按?F8?鍵一步步分析一下: 00440F2C?|.?8B45?FC?????????MOV?EAX,DWORD?PTR?SS:[EBP-4]??????????;?把我們輸入的內(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?這一句時(shí),我們按一下?F7?鍵,進(jìn)入這個(gè)?CALL,進(jìn)去后光標(biāo)停在這一句: ? 我們所看到的那些?PUSH?EBX、?PUSH?ESI?等都是調(diào)用子程序保存堆棧時(shí)用的指令,不用管它,按?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,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?FC?????????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?????????????????????????;?把減后值與“Registered?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 00403B59?|.?39D9????????????CMP?ECX,EBX?????????????????????????;?比較 00403B5B?|.?75?58???????????JNZ?SHORT?CrackMe3.00403BB5?????????;?不等則完蛋 根據(jù)上面的分析,我們知道用戶名必須是“Registered?User”。我們按?F9?鍵讓程序運(yùn)行,出現(xiàn)錯(cuò)誤對(duì)話框,點(diǎn)確定,重新在第一個(gè)編輯框中輸入“Registered?User”,再次點(diǎn)擊那個(gè)“Register?now?!”按鈕,被?OllyDBG?攔下。因?yàn)榈刂?00440F34?處的那個(gè)?CALL?我們已經(jīng)分析清楚了,這次就不用再按?F7?鍵跟進(jìn)去了,直接按?F8?鍵通過。我們一路按?F8?鍵,來到第二個(gè)關(guān)鍵代碼處: 00440F49?|.?8B45?FC?????????MOV?EAX,DWORD?PTR?SS:[EBP-4]?????????;?取輸入的注冊(cè)碼 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?和上面我們分析的地址?00440F34?處的?CALL?CrackMe3.00403B2C?是不是匯編指令都一樣啊?這說明檢測(cè)用戶名和注冊(cè)碼是用的同一個(gè)子程序。而這個(gè)子程序?CALL?我們?cè)谏厦嬉呀?jīng)分析過了。我們執(zhí)行到現(xiàn)在可以很容易得出結(jié)論,這個(gè)?CALL?也就是把我們輸入的注冊(cè)碼與?00440F4C?地址處指令后的“GFX-754-IER-954”作比較,相等則?OK。好了,我們已經(jīng)得到足夠的信息了。現(xiàn)在我們?cè)诓藛?查看->斷點(diǎn)?上點(diǎn)擊一下,打開斷點(diǎn)窗口(也可以通過組合鍵?ALT+B?或點(diǎn)擊工具欄上那個(gè)“B”圖標(biāo)打開斷點(diǎn)窗口): 為什么要做這一步,而不是把這個(gè)斷點(diǎn)刪除呢?這里主要是為了保險(xiǎn)一點(diǎn),萬一分析錯(cuò)誤,我們還要接著分析,要是把斷點(diǎn)刪除了就要做一些重復(fù)工作了。還是先禁用一下,如果經(jīng)過實(shí)際驗(yàn)證證明我們的分析是正確的,再刪不遲。現(xiàn)在我們把斷點(diǎn)禁用,在?OllyDBG?中按?F9?鍵讓程序運(yùn)行。輸入我們經(jīng)分析得出的內(nèi)容: 用戶名:Registered?User 注冊(cè)碼:GFX-754-IER-954 點(diǎn)擊“Register?now?!”按鈕,呵呵,終于成功了: -------------------------------------------------------------------------------- 【版權(quán)聲明】?本文純屬技術(shù)交流,?轉(zhuǎn)載請(qǐng)注明作者并保持文章的完整,?謝謝! |
| cffo-3.rar?(2006-02-14?13:36, 0, 16467 次下載) |
作者贊賞
?
當(dāng)當(dāng)計(jì)算書籍 5-8折
剛做的招標(biāo)網(wǎng):八爪魚招標(biāo)網(wǎng)?請(qǐng)大家多意見 分類:?軟件工程 標(biāo)簽:?OllyDBG
本文轉(zhuǎn)自Sam Lin博客博客園博客,原文鏈接:http://www.cnblogs.com/samlin/archive/2009/04/01/1427460.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的[转]OllyDBG 入门系列(二)-字串参考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 东风本田新战略:预计至 2027 年将不
- 下一篇: 英雄联盟云顶之弈天使几级出