32位匯編第五講,逆向實戰干貨,(OD)快速定位掃雷內存.


 

      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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM