32位第五講,逆向實戰干貨,快速定位掃雷內存.
首先,在逆向之前,大家先對OD有一個認識.
一丶OD的使用
標號1: 反匯編窗口 (顯示代碼的地址,二進制指令,匯編代碼,注釋)
標號2: 寄存器窗口(顯示通用寄存器,段寄存器,以及浮點協處理器,32位中還有多媒體寄存器)
標號3: 信息窗口 (這個主要是顯示當你運行到的程序的位置處的信息)
標號4: 數據窗口 (內存中的數據,可以在這里查看內存)
標號5:堆棧窗口 (查看棧中的內容,以及變量的內容)
標號6,標號7,標號8 ,屬於工具窗口,不通的修改版OD有不同屬性
具體詳細OD介紹,請看資料中的chm
二丶快速定位掃雷數組(OD定位)
首先定位掃雷數組的時候,我們要明白掃雷游戲怎么玩,(這個不用說了,都會玩 :) 不會? 百度,Google :) )
1.思路,首先看下掃雷的界面
至此我們猜一下他可能用什么數據結構存儲,(這里利用到了開發的知識,正向的開發,決定了逆向的高度,不要忽略正向的知識)
二維數組存儲,為什么,我猜的 :)
全局的數組,還是棧中的數組,還是new的數組, 我猜是全局的數組(不管對不對,分析一下准沒錯)
為什么是全局數組,第一,我們按下的時候要訪問這個數組,第二,當掃雷繪制的時候也可能用這個數組.不然怎么會出來 1 2 3,這種提示?
首先我們點擊一個按鈕
變樣了,那么我們怎么快速定位到這個內存地址哪?
思路一: 當我按鈕按下的時候,它會訪問數組的元素,判斷是不是雷
思路二: 當繪制的時候,也就是繪制1 2 3 的時候,也會訪問數組,根據數組的內容繪制出1 還是2
那么思路一和思路二我們有了(當然,有可能有更好想思路,這里簡單就這兩個)
那么思路一的話,他會訪問,但是可能會處理很多邏輯,最重才會訪問到我們的數組
思路二,的話,他也有邏輯,但是感覺他是直接從數組中取出內容來繪制的,所以這里按照思路二的方式來分析
思路一的話,如果有興趣的也可以自己去分析一下, 對於OD怎么分析消息,這里簡單提一下
思路一的查找
1.首先打開掃雷
2.使用spy++掃描掃雷窗口,獲得函數過程
找到窗口過程
OD運行起來,點擊窗口
或者按上面的
,然后右鍵刷新
我們可以跟隨過去,去下條件斷點,但是OD的調試斷點會有毛病,有時候能下,有時候下不了,
那么我們可以在這里設置消息斷點.攔截下鼠標按下的消息
我們可以攔截鼠標消息,但是不好,因為鼠標消息有移動,按下 彈起等等,所以我們下拉,找到鼠標按下的消息
這里設計的不好,不能自己輸入 按鈕按下的消息值是201
https://zhidao.baidu.com/question/434863629.html 這個連接則是簡單的提了一下
,檢測按下的消息,只要鼠標按下即可捕獲,自己分析一下
思路二,繪制
繪制的思路,我們是捕獲繪制,那么怎么做
第一我們會想,他可能用雙緩沖繪圖 :) (為什么,我猜的) (不會雙緩沖的,可以Google一下什么意思,如果不會,跟着我走也一樣,不過簡單的明白一點還是好的)
那么開始我們的操作,首先我們知道雙緩沖繪圖最后一個肯定會用 BitBlt去復制,而BitBlt是屬於一個模塊的,我們不知道哪個模塊的,使用工具查看一下
,我們發現是Gdi32.dll里面的,那么開始執行下方的步驟
1.在OD中ALT + E 打開模塊,查找GID32.dll
那么我們右鍵查看函數名稱
跟隨過去,那么執行的是Bltbit的函數,那么我們猜想,他的上一層才會訪問數組,因為訪問了數組,才會繪制,咱們這個時候已經屬於繪制中,所以要到繪制前
這個是我們BitBlt執行的時候,我們跳出
跳出來可以看到,這個就是雙緩沖繪圖的步驟,那我們往上找一下,肯定會有訪問數組
先不要看我注釋,我們發現了,inc esi 是對它++,而后和內存的值比較,如果小於等於,繼續循環
那么我們由此得出,他可能在遍歷數組,那么我們現在是初級的,是9行9列,我們看下esi到9了會退出嗎
我們發現了,確實是到10了,也不循環了,那么繼續分析
我們發現它讀取 的1005338的值又去坐的判斷,那么我猜想內循環九次,外循環讀取一次,繼續一次大的循環,我猜想這個可能是行,我們看下我們的掃雷繪制的怎么樣了
是不是已經繪制出了9列了,把OD最小化
可以看出確實是繪制了9列,那么我們不用想也知道了,它是雙層for循環,而后一列一列的繪制
那么我們得出了行,和列 我們記錄下這來這兩個地址
列的地址: 0x1005334
行的地址: 0x1005338
那么怎么尋找出雷的所在的位置那,我們把斷點取消一下,我們開始運行起來掃雷,我們看下內存有什么變化
我們在第一行點擊之后,繪制了一個1,我們發現內存的這個地方也改成(ASI)的1了,那么我們點擊第二個,驗證我們的想法,
人品沒誰了,第二個就是地雷,但是我們發現都變成了8F 8F了,那么我們存在疑問(8F是地雷嗎?)我們再次從來看一下
由此確定,8F 代表的是地雷, 而40表示的是空,
接着我們看下這塊地址是哪里,
我們從這里開始,驗證一下掃雷
為了方便內存觀察,我們改為16 * 16的,也就是內存中也是16 *16代表一行
我們看上圖發現了第二個是雷我們可以直接點擊(但是掃雷有一個默認的動作,就是第第第一次點擊如果是雷,他也會讓你玩,就是如果是雷的話,它則會用算法幫我們修改成不是雷,那么我們點擊第一個0F,然后再點擊第二個看看是不是雷)
我們發現和第一張那個圖相比,(內存還沒變化,因為是第一張圖,也就是上一張)確實驗證了我的猜想,那么肯定這塊內存16 *16的大小就是掃雷的內存了
看下變化后的
出現了CC,CC代表的是 int 3指令,也就是拋出異常,調試器會用到這條指令.所以變為CC 掃雷程序就會停止了.
總結:
列的地址: 0x1005334
行的地址: 0x1005338
掃雷數組首地址: 0x1005361
掃雷的個數地址: (看內存,自己尋找,就在附近)
OD的下載: 對於OD網上有很多版本,自己去下一個就行,比如看雪論壇的
課堂資料下載:
鏈接:http://pan.baidu.com/s/1pLV0iEn 密碼:8x3o (包含掃雷,DLL查看,以及OllyDbg使用文檔.chm)