如何使用winDbg在掃雷小游戲中獲勝
winmine是一個Windows自帶的一個小游戲,用來操練windbg很合適,
比較糟糕的是微軟把winmine小程式的PDB從符號服務器給洗掉了(不知道微軟出于什么心態),只能找前些年已經下載的人那里獲取,下面是一個獲取地址:
http://advdbg.org/books/download/wdbglabs.zip
windbg的下載途徑:
1. 騰訊電腦管家里面的軟體管理,搜索windbg,可以下載一個,不過是2010年的x64版本,有點老,
2.百度windbg,可以找到一個x86/x64的全集,是2017年的,比較新,
這兩個都不需要安裝,解壓后直接使用,
3.安裝visual studio 2019可以,可以選擇安裝windows kits工具套裝,里面有debugger,帶著最新的windbg,x86/x64全套,目前是2019年3月的,最新,
工具和研究物件齊備,我們就可以開始了,
挖雷程式破解關鍵是找到正確的存盤區,先打開后加載符號,然后從符號中查找:
0:000> lm
start end module name
01000000 01020000 winmine (pdb symbols) D:\windbg3264\WinDbg(x86)\sym\winmine.pdb\3B7D84751\winmine.pdb
顯示已經加載成功了,奇怪,這個目錄我并未設定,難道是自己從符號服務器下載的嗎?
0:000> ld winmine
Symbols already loaded for winmine
確認已經加載
0:000> x winmine!*
01001004 winmine!_imp__RegSetValueExW = <no type information>
0100511c winmine!yCur = <no type information>
01005b8c winmine!__onexitend = <no type information>
......
010021f0 winmine!WinMain = <no type information>
......
0100347c winmine!GameOver = <no type information>
......
01005340 winmine!rgBlk = <no type information>
......
01005194 winmine!cBombLeft = <no type information>
......
0100367a winmine!StartGame = <no type information>
......
01003512 winmine!StepSquare = <no type information>
......
0100140c winmine!FLocalButton = <no type information>
010041fc winmine!_NULL_IMPORT_DESCRIPTOR = <no type information>
上面幾個重要的函式和變數
首先比較明確的是winmine!GameOver,這肯定是游戲結束的標記,先從這里找線索
0:000>bp winmine!GameOver
g運行后,點擊雷爆炸,很快命中GameOver
0:000> k
ChildEBP RetAddr
000cfcf4 010035b0 winmine!GameOver
000cfd0c 010038b6 winmine!StepSquare+0x9e
000cfd18 0100200a winmine!DoButton1Up+0xd5
000cfd6c 7562630a winmine!MainWndProc+0x441
看名字是計算區域的,重新設定斷點:bp winmine!StepSquare 并去掉第一個斷點bc 0
點擊雷區就命中,反匯編視窗:
winmine!StepSquare:
01003512 8b442408 mov eax,dword ptr [esp+8] ss:002b:000cfd18=00000007
01003516 53 push ebx
01003517 55 push ebp
01003518 56 push esi
01003519 8b742410 mov esi,dword ptr [esp+10h]
0100351d 8bc8 mov ecx,eax
0100351f c1e105 shl ecx,5
01003522 8d943140530001 lea edx,winmine!rgBlk (01005340)[ecx+esi]
01003529 f60280 test byte ptr [edx],80h
0100352c 57 push edi
0100352d 7466 je winmine!StepSquare+0x83 (01003595)
0100352f 833da457000100 cmp dword ptr [winmine!cBoxVisit (010057a4)],0
其中的記憶體操作就是winmine!rgBlk,所以推斷winmine!rgBlk 是雷的記憶體區域,那雷是如何表示的呢?查看記憶體區:

發現主要是0f和8f,故而猜測0f表示沒有地雷,8f表示地雷,為了證實想法挖雷試試,看看第12列是否有雷,g繼續運行,果然如此:

然后就是要標記地雷,取什么值?重新運行,標記一個試試:

第4列是個地雷,g運行,標記一下,然后再看記憶體:

變成了8e,說明標記雷在記憶體中就是8e
如果把winmine!rgBlk區域的8f全部修改為8e,雷就都標記出來了,采用winDbg強大的腳本功能:
.for(r @$t0=0; @$t0<240; r @$t0=@$t0+1) {.if (by(winmine!rgBlk+@$t0) == 0x8f) {eb winmine!rgBlk+@$t0 0x8e}}
結果:

雷都顯示出來了,可以明挖了,OK,可以再進一步,每次點擊開始時,都通過條件斷點把上面的流程執行一遍,從中感覺一下winDbg的強大:
bp StartGame "gu; .for(r @$t0=0; @$t0<240; r @$t0=@$t0+1) {.if (by(winmine!rgBlk+@$t0) == 0x8f) {eb winmine!rgBlk+@$t0 0x8e}}; g"
gu表示在StartGame函式執行完畢后,中斷執行記憶體修改,然后繼續執行,表達能力真是強悍:試試:
每次點擊重啟游戲,就會觸發標記雷的動作:

感覺很酷! winDbg要多練習,才能感受其奇妙之處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278161.html
標籤:其他
上一篇:牛客小白月賽33
