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