生活随笔
收集整理的這篇文章主要介紹了
WinDbg学习笔记(二)--字符串访问断点
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
| 標(biāo) 題:?【原創(chuàng)】WinDbg學(xué)習(xí)筆記(二)--字符串訪問斷點(diǎn) 作 者:?gaorqing 時 間:?2009-07-25,21:39:04 鏈 接:?http://bbs.pediy.com/showthread.php?t=94326 WinDbg學(xué)習(xí)筆記(二)--字符串訪問斷點(diǎn) 一、前言 ????本文是我自己學(xué)習(xí)WinDbg的過程,因?yàn)槟繕?biāo)是逆向分析一個驅(qū)動文件,但現(xiàn)在對驅(qū)動開發(fā)的知識還不是很熟悉,所以先在用戶級練習(xí)一下破解,熟悉一下操作。我選擇的破解程序是《OllyDBG?入門系列(二)-字串參考》中的Crack3.exe,也模仿一下在OllyDbg破解的流程,在WinDbg實(shí)現(xiàn)一遍。 二、調(diào)試思想 ???《OllyDBG?入門系列(二)-字串參考》一文中是使用字符串參考來找到關(guān)鍵的地方,但是很可惜WinDbg沒有字串參考的功能,不能直接模仿。雖然我不太知道OllyDbg得到字串參考的原理,不過我想一般的程序都會把要顯示的字符串放在內(nèi)存里。所以,猜想一下只要在內(nèi)存里找到對應(yīng)的字符串的位置,然后下內(nèi)存訪問斷點(diǎn),那么程序在要調(diào)用該字符串時就會被斷下來。而在程序被斷下來后一般都是在系統(tǒng)函數(shù)里,所以回到用戶代碼,在返回的地方附近就應(yīng)該能找到關(guān)鍵的代碼。下面利用Crack3.exe嘗試一下。 三、調(diào)試步驟 1、先運(yùn)行程序,熟悉一下程序的操作。運(yùn)行Crack3.exe,界面如下: 點(diǎn)擊一下“Register now”,就會彈出一個對話框: 我們這里就是從這個對話框里顯示的字符串入手。 2、點(diǎn)擊“Quit the CrackMe”退出Crack,然后啟動WinDbg。【File】?【Open Executable】?選擇Crack3.exe。WinDbg載入程序后會自動中斷下來: 3、下入口斷點(diǎn) 到這里,就會發(fā)現(xiàn)跟OllyDbg載入程序時不一樣。為什么程序會停在系統(tǒng)代碼區(qū)域里而不是在用戶代碼里?為什么入口地址不一樣的? 其實(shí)我也是不太知道為什么會停在這里,不過大概這時Crack3已經(jīng)載入內(nèi)存里,只不過要等用戶操作才進(jìn)行下一步。 那怎樣才能到程序的入口點(diǎn)? WinDbg里有個偽寄存器叫$exentry,里面記錄了程序的入口點(diǎn)。所以我們只要在命令輸入欄里輸入 bp $exentry (bp就是用來下斷點(diǎn)的命令,詳細(xì)用法可以參考WinDbg的幫助文檔) 在輸入完命令并敲擊Enter后,在命令輸入行的前端一般會顯示“*BUSY*”的字樣。這時因?yàn)閃inDbg要從目錄或網(wǎng)站上找到對應(yīng)的符號文件。如果網(wǎng)速慢的話可能會等好一陣子。如圖: 在WinDbg找完符號文件后,就會變成: 什么,提示錯誤? 不過可以放心,這里不是說斷點(diǎn)設(shè)置失敗。我英文不太好,不過也可以大概理解說模塊加載成功,但image00400000處的符號不能加載。這個對于我們沒什么關(guān)系,因?yàn)槲覀冋{(diào)試的是沒有源代碼的程序,^_^。 這里也補(bǔ)充一下。要查看當(dāng)前已經(jīng)設(shè)置的斷點(diǎn),可以在命令欄輸入? bl?,如圖: 如圖上所示,現(xiàn)在我們設(shè)置里一個斷點(diǎn),斷點(diǎn)位置在?0041270。在00441270前的字母?e 代表斷點(diǎn)是被激活的。而在最前面的0代表的是第0個斷點(diǎn),可以說是斷點(diǎn)的編號。對于斷點(diǎn),還有其它經(jīng)常用到的操作,例如: be???激活斷點(diǎn) bd???禁用斷點(diǎn) bc???刪除某個斷點(diǎn) 詳細(xì)的用法和其它操作可參考WinDbg幫助文檔(在索引里輸入?user-space breakpoints)。 其實(shí)我們不一定要用到$exentry寄存器,因?yàn)槲覀冏约阂部梢运愠龀绦虻娜肟诘刂贰S肧tud_PE或其它PE工具,找到ImageBase和EntryPoint,那么ImageBase+EntryPoint就是入口地址了。對于Crack3,情況就是00400000+00041270=00441270(注意是16進(jìn)制)。 使用bp下斷點(diǎn): bp? 00441270 得到的結(jié)果是一樣的。 4、運(yùn)行到入口點(diǎn) 按F5(或輸入g),那么程序就會停在正式的入口點(diǎn),如圖: 現(xiàn)在貌似熟悉多了,終于回到用戶代碼了。 5、查找字符串 在步驟1我們運(yùn)行程序時就記錄了提示注冊錯誤的字符串“Wrong Serial, try again!”,現(xiàn)在我們就要在內(nèi)存找到該字符串的位置。 輸入命令 s?–a 00400000 L53000?“Wrong” 該命令的意思是以ASCII碼形式在內(nèi)存地址00400000往后53000個字節(jié)搜索字符串“Wrong”。 s,就是要調(diào)用查找的命令 -a,指定使用ASCII碼的形式查找 00400000,指定要開始尋找的內(nèi)存地址。 L53000,說明要在00400000往后的53000字節(jié)搜索。這個數(shù)值和00400000都可以從Stud_PE獲得。00400000是程序的裝入地址,而53000是映像的大小,也就是程序載入內(nèi)存后占用的內(nèi)存大小。使用這兩個數(shù)值,基本上可以搜索到程序使用的整個內(nèi)存范圍。 “Wrong”,就不用多解釋了,就是我們要尋找的字符串。不過WinDbg不支持模糊搜索,所以這里輸入的字符串必定要完全正確。 具體用法可以參考幫助文檔 最后,命令窗口輸出: 表示在0044108c的地方找到我們想要的字符串。 6、下內(nèi)存訪問斷點(diǎn) WinDbg中,ba命令代表Break On Access,即訪問時中斷。 我們在命令行輸入: ba r 1 0044108c 命令的意思是在內(nèi)存0044108c的位置下字節(jié)的讀斷點(diǎn)。命令中各元素的含義可以參考幫助文檔,這里不啰嗦。 輸入bl,查看斷點(diǎn)使用情況: 7、按F5或輸入命令g運(yùn)行程序,點(diǎn)擊“Register now”,程序被中斷下來 可以看到,程序中斷在系統(tǒng)代碼區(qū)域。然后連續(xù)幾次按或Shift+F11,又或者在命令行輸入gu,直到程序彈出注冊失敗的窗口。點(diǎn)擊?確定,繼續(xù)shift+F11,直到用戶回到用戶代碼區(qū)域。 到這里的話可能就需要借助IDA的幫忙了。因?yàn)樵赪inDbg的反匯編窗口里,跳轉(zhuǎn)指令的調(diào)用不太明顯,很難找出關(guān)鍵的跳轉(zhuǎn)。而借用IDA,則可以很方便找出。如果不用IDA幫忙當(dāng)然也可以,就是尋找起來可能稍微吃力點(diǎn)而已。 復(fù)制多一份Crack3.exe,再使用IDA,這樣就不會影響到當(dāng)前的調(diào)試。 用IDA載入Crack3的復(fù)件后,跳到0043d14b的地方(IDA不會用?那就隨便看看IDA的一些教程,反正這里只用到IDA的一點(diǎn)點(diǎn)功能),如圖: 什么,我們剛才進(jìn)入的就是MessageBoxA?為什么WinDbg沒有顯示的?這也沒辦法,WinDbg本身就是這樣,所以說結(jié)合IDA分析方便很多。其實(shí)也不能說WinDbg沒提示,只要我們跟蹤進(jìn)MessageBoxA就知道了。下面實(shí)現(xiàn)一下: 重新載入Crack3,并在0043d146處(剛才調(diào)用MessageBoxA的地方)下斷點(diǎn),運(yùn)行程序。點(diǎn)擊“Register Now”后程序斷了下來: 按或F11,進(jìn)入函數(shù) 看看,這里就不一樣了,這里就可以提示是MessageBoxA了。 8、尋找關(guān)鍵跳轉(zhuǎn) 在找到顯示“Wrong Serial, try again!”的地方后,就嘗試一下在代碼附近有沒有可以跳過顯示這句提示的跳轉(zhuǎn)指令。借用IDA,可以看到在當(dāng)前函數(shù)里都沒有一句跳轉(zhuǎn)可以跳過提示,那么就說明當(dāng)前函數(shù)整個都是注冊錯誤后才調(diào)用的函數(shù)。 直接按跳出當(dāng)前函數(shù) 借助IDA查看: 可以看到原來有兩處地方調(diào)用剛才顯示注冊失敗的函數(shù)。所以,我們要找的就是尋找一些可以跳過這兩個地方的跳轉(zhuǎn)指令。 關(guān)于怎樣尋找,只要看一下IDA的那些跳轉(zhuǎn)流程線就會很容易得到結(jié)果。而在這里,我直接給出關(guān)鍵的跳轉(zhuǎn),它們分別是00440F39?的jnz?和00440F56?的jnz。只要把這兩個位置的jnz指令nop掉,就可以爆破成功。 9、修改指令 按重新載入Crack3,然后分別使用 bp 00440F39 bp 00440F56 在關(guān)鍵的跳轉(zhuǎn)下斷點(diǎn)。按運(yùn)行程序,點(diǎn)擊“Register Now”,程序中斷下來 現(xiàn)在就要修改這條指令。WinDbg提供命令a來修改指令。 簡要用法是確認(rèn)到當(dāng)前要執(zhí)行的指令, 首先,輸入a,Enter 然后,輸入要修改成的指令 最后,Enter,結(jié)束 在修改指令時要注意,修改后的指令占用的空間應(yīng)該比原來的小,不然的話就會影響下面的指令。例如原來00440f39處的指令實(shí)際為?7551?,占用兩個字節(jié),而我們修改后的指令占用空間必須小于或等于兩個字節(jié),多出的用90(nop)替代。這里我們要使用nop指令取代,也就是要替換成兩個nop。 所以,我們接下來的操作是 在命令輸入行: 輸入a,Enter 輸入nop,Enter 輸入nop,Enter 直接Enter,結(jié)束 結(jié)果為: 00440F56處的指令采取的處理一樣。最后按F5運(yùn)行程序 提示注冊成功。 到這里,就遇到一個問題。OllyDbg可以將修改后的指令保存到文件,而WinDbg怎么辦?很遺憾,到現(xiàn)在我還沒找到一個好的方法,不過可以根據(jù)要修改的地址,然后根據(jù)PE文件里的數(shù)據(jù),算出對應(yīng)的文件偏移,然后用Hex Workshop等工具把相應(yīng)位置上的值改掉。這樣貌似比較麻煩,不過也沒辦法,我能力就到這里。有人能提示一種更好的辦法嗎? 本文只是作為菜鳥的我初次接觸WinDbg做的筆記,也是為了后面自己做驅(qū)動的逆向反匯編做準(zhǔn)備。這里用到的破解方法不是很先進(jìn),不過就是為熟悉一下WinDbg的命令操作而已。 第一次發(fā)貼,見笑了,也請大家多多包涵,多多指教 上傳的附件 | | CrackMe3.rar?(125.1 KB, 324?次下載) | [誰下載?] | |
總結(jié)
以上是生活随笔為你收集整理的WinDbg学习笔记(二)--字符串访问断点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。