search
利用OD通過Call調用實現掃雷(win7旗艦版32位)

利用OD通過Call調用實現掃雷(win7旗艦版32位)

一直對逆向感興趣,就拿最簡單的掃雷開始,對於XP系統中的掃雷,雷的數目以及雷區的地址都是固定的,可以直接通過Cheat Engine搜索出來,然後在OD中直接下內存訪問斷點,找到掃雷整個區域,獲得行數和列數,再順藤摸瓜找到左鍵點擊的處理函數和右鍵點擊的處理函數,讀取雷區數據,一一比較如果是雷就右鍵標記,如果不是可以直接左鍵點開,即可完成秒殺。

經過了大概半個月的時間,終於在查閱各種帖子和不斷的摸索下,實現了Win7 32位系統掃雷的秒殺,哈哈,太開心了!

因為XP系統的掃雷中雷區的地址是固定的,可以通過CE進行搜索出來,但Win7系統的掃雷是用C++寫的,雷區不再是固定的,而是在滑鼠第一次點擊之後再產生雷的位置。對win7掃雷一開始沒有一點思路,後來看了很多牛人寫的帖子,在他們的基礎上才能慢慢的入手。可以參考:

《Vista的掃雷》:http://bbs.pediy.com/thread-40295.htm

《Win7自動掃雷》:http://bbs.pediy.com/thread-120152.htm

這2篇文章里的思路都是通過對rand函數下斷,分析找到雷存放的地址,每個格子里存放0或1,如果是1則是雷,是0則不是雷,發送消息模擬滑鼠的單機,進行自動掃雷。其中,在《Vista的掃雷》提到了重定位的處理,解決方案2對於Win7 32位下的掃雷並不適用,這篇文章中提到:

「假設掃雷入口地址設為dwCodeAddress,則[3931B8] 這個地址得到的方法是: ( dwCodeAddress & 0xFFFF0000 ) + 0x531B8」

但是在Win7 32位的掃雷中,並不是這樣的,用PEiD打開掃雷

可以看到,掃雷的入口點是0x0002e08f,用OD打開掃雷,停在了入口點,代碼是

001CE08F > $ E8 B5050000 call MineSwee.001CE649

001CE094 .^ E9 4DFDFFFF jmp MineSwee.001CDDE6

所以掃雷中地址的計算方法是:掃雷模塊地址+偏移

入口點地址0x1ce08f = 掃雷模塊地址+0x2e08f,所以此次載入掃雷模塊地址為

MineSweeper.exe = 0x1A0000

在此我找到了一種可以去除重定位的方法,PE頭中的文件頭的Characteristics欄位指定了文件的類型,佔用2位元組,其第0比特為1,即表示文件中不存在重定位信息,用C32Asm打開掃雷,找到該欄位

該欄位為0x0102,其第0比特為0,即存在重定位信息,將其修改為1,將會給我們分析帶來很大的方便(地址固定),即將該欄位修改為0x0103,在下面的分析中我就用修改後的文件進行分析,該修改並不影響分析結果,同樣適用於沒修改的掃雷(因為偏移是固定的)。分析前面的過程在《Vista的掃雷》和《Win7自動掃雷》中講得很詳細,在此不做贅述,簡單走一遍,看過的可以直接跳過。

首先,用OD載入掃雷,對rand函數下斷:bp rand,然後先將該斷點禁止,按F9運行起來,啟動該斷點,掃雷斷下

一看便知該模塊不是掃雷的模塊,而是msvcrt。在堆棧窗口中看到,

在第1行處反彙編跟隨(按Enter),到

滑鼠點到該函數第一行,OD在反彙編窗口下方會有提示

「本地調用來自 01020176, 01023169, 01023177, 01023BB3, 01027466, 010275B9, 01027E86, 01027E98」

對這8個call都進行下斷,F9,會發現一直斷在

刪除這個斷點,繼續F9,回到遊戲,不會中斷了,開始遊戲並點擊一個格子,斷在如下位置

往上看,則如《Vista的掃雷》中一樣,是根據第一次點擊的格子產生序號並保存序號的代碼,在此列舉一下,看過的可以跳過

按Ctrl+F9 2次執行到返回,或在堆棧窗口中找到第2個「返回到」,跟隨到上上一層:

其中,call MineSwee.01021418中的代碼及註釋如下(看過的可以跳過)

到此得到了地址0x10868b4,查看入口點代碼

掃雷模塊地址為0x1000000,所以

方塊數據=[[[[[[[minesweeper.exe+0x868B4]+0x10]+0x40]+0x0C]+4*X坐標]+0x0C]+4*Y坐標];分析一下取值有 1~8數字 9未開 10旗 11問號 12空

雷地址 =[[[[[[[minesweeper.exe+0x868b4]+0x10]+0x44]+0x0c]+4*X坐標]+0x0c]+Y坐標] 1表示有雷 0表示沒雷

esi=[[minesweeper.exe+0x868B4]+0x10];minesweeper.exe表示掃雷模塊地址

[esi+0x4] => 雷數

[esi+0x8] => 行數

[esi+0xc] => 列數

[esi+0x18] => 滑鼠左鍵單擊次數

第一次點擊 列號:[esi+0x24]

行號:[esi+0x28]

然後找左鍵單擊打開格子Call,既然是左鍵單擊,該Call中的參數應該是點擊格子的X坐標和Y坐標,所以在該Call之前應該有如下類似操作:

push X坐標

push Y坐標

Call 0x……

在我們之前的分析中尋找,發現有2個地方可疑

第一處:

第二處:

對於第二處,有個跳轉,不是第一次點擊格子的話會跳過,因此排除。懷疑第一處是我們要找的Call,用CE載入掃雷,在自動彙編中寫入測試腳本:

執行,得到myscript=某個地址,記住該地址,打開創建線程,輸入該地址,確定,看掃雷打開了一大片,哈哈!這就是我們要找的左鍵單擊打開一個格子的Call。現在便可以實現一鍵自動掃雷了,但是為了能夠把雷標記出來,我們還可以找右鍵單擊的Call。

右鍵單擊格子會改變格子的狀態,10為旗,11為問號,在第一顆方塊數據處下硬體斷點,即X=0 Y=0處,[[[[[[[minesweeper.exe+0x868B4]+0x10]+0x40]+0x0C]+4*0]+0x0C]+4*0],右鍵單擊第一個格子,掃雷斷下,進行回溯跟蹤,在第二次返回后,找到了可疑的地方

和左鍵單擊一樣,也是壓入Y坐標和X坐標為參數,然後調用一個Call,但是調用之前給ecx進行了賦值,來源於esi,又要找esi,但是在上層中尋找,並沒有發現esi來源於什麼地址。不如跟進該Call看看

是不是很熟悉,原來ecx就是之前的那個指針,即[[minesweeper.exe+0x868b4]+0x10],在CE中寫腳本進行測試:

執行后,發現掃雷並沒有什麼反應,有點失望!但是在掃雷中其他格子右鍵單擊一下,發現第一個格子也變成被標記狀態了,哈哈,這就是我們要找的右鍵單擊格子Call,分析終於完成了!花了2周多時間,最後還是有點小激動,\(^o^)/

最後進行編程實現:

界面如上,首先點擊注入會獲得共有幾顆雷,並安裝鍵盤鉤子,按Home鍵進行一鍵掃雷,按F12進行全部標記。

最後,附一張掃雷自定義中難度最大時進行一鍵掃雷的截圖,如下,24*30,共668顆雷。

GetProcessBase.h代碼:

該函數是獲得掃雷模塊地址的函數,相比《Vista的掃雷》中尋找程序入口點,該函數效率更高一些。

DLL鉤子程序如下:

有不足之處,希望大家提出,歡迎討論!

本文由看雪論壇 Thvoifar 原創,轉載請註明來自看雪社區

  • Metasploit 演練

  • 工控安全入門之Ethernet/IP

  • [愛琴海]2017 最新 CTF Demo 試玩版題目 ------WriteUp

熱門推薦

本文由 一點資訊 提供 原文連結

一點資訊
寫了5860316篇文章,獲得23295次喜歡
留言回覆
回覆
精彩推薦