CE使用指南之扫雷棋盘扫描
2.3第三次作業
?“掃雷”游戲逆向分析
2.3.1棋盤內存地址范圍
2.3.1.1 初級棋盤內存地址
1.取消“快速掃描”,掃描類型選擇“未知的初始值”,點擊棋盤第一個格子,隨后點擊“首次掃描”。
2.點擊“笑臉”,刷新棋盤,再次點擊棋盤第一個格子,若數值與上一次相同,則掃描類型選擇“未變動的數值”,若數值與上次不同,則掃描類型選擇“變動的數值”。
????
?
如上圖所示數值未變動,則選擇“未變動的數值”,點擊“再次掃描”。第二步操作反復進行,最后看到綠色的基址。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?
3.將該記錄添加到下方,右鍵選擇“瀏覽相關內存區域”,相關內容如圖所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
點擊“笑臉”,再點擊棋盤第一個格子,觀察下方內存數據的變化,我們可以得出第一個格子的地址為01005362。
?
?
4.同理找到棋盤的最后一個格子地址為01005468。
?
?
因此最后得出初級棋盤地址范圍是01005362 ~ 01005468。
2.3.1.2 ?其他級別棋盤內存地址
同理找出中級棋盤和高級棋盤的地址范圍為:
中級棋盤地址范圍 01005362?~ 01005551;
高級棋盤地址范圍 01005362?~?0100555Frr。
2.3.2 游戲中各變量的內存地址
2.3.2.1 雷數的內存地址
1.找旗子的地址。(中級棋盤)查看左上角雷的個數共40個,右側輸入40,掃描類型選擇“精確數值”,點擊“首次掃描”,如圖所示。
?
任一格子放置旗子,數量變為39,輸入39進行“再次掃描”,得出找出了旗子的基址為01005194。
?
?
2.掃描雷的內存地址。因為旗子和雷的初始數據是一樣的,所以先掃描旗子的數據,第一次掃初級棋盤的旗子數量10,轉換到中級棋盤,再次輸入旗子數量40,得出三個基址。
?
我們發現,這三個地址中,有一個和旗子地址一樣,則排除該地址。剩余兩個地址,我們分別修改數值為1,然后點擊棋盤。修改01005330地址的數值發現棋盤沒有變化,則排除,具體內容如圖所
示。
?
?
?
修改010056A4地址的數值為1,刷新棋盤,點擊某一格子,發現可通關,則該地址為雷數的內存地址。
?
2.3.2.2 笑臉的內存地址
1.選擇掃描類型為“未知的初始值”,此時表情狀態為“笑臉”,點擊“首次掃描”。
?
2.點擊棋盤,改變表情的狀態,若表情變化,則掃描類型修改為“變動的數值”;若未變化,則選擇“未變動的數值”。隨后點擊“再次掃描”,反復操作。最后得出地址為009759DB。
?
2.3.2.3 計時器的內存地址
1.輸入游戲時間“0”,選擇“精確數值”,開始游戲,游戲時間會開始變動,掃描類型則選擇“變動的數值”,點擊“再次掃描”,反復操作。最后得出地址0100579C。
?
?
2.3.3地雷存放的算法
輸入參數:
int height, int width, int mineCount
輸出參數:
void
初始化:
int size = height * width;
算法:
| ?對每一個Element進行以下步驟: ????1、生成一個隨機數random ????2、if (random * size?<= mineCount){mineCount--;//設Element的狀態為MINE} ????3、size-- ????4、進入下一個Element |
2.3.4 工作原理
1.n*n網格,一定數目的雷,如Windows7 Minesweeper游戲;
2.雷的位置隨機分配到網格上;
3.網格上不是雷的位置上 顯示的方塊上顯示周圍上下左右四個角的有雷的個數;
4.雷數計數器顯示余下的未發現的雷數。
總結
以上是生活随笔為你收集整理的CE使用指南之扫雷棋盘扫描的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DXP设计PCB过程中批量修改元件符号大
- 下一篇: cpu门禁电梯卡复制测试过程