第 三 章 “扫雷”游戏逆向分析

3.1 游戏介绍

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

以windows XP自带扫雷winmine.exe为例(其它版本的扫雷游戏与之大同小异)。游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。

游戏的基本操作包括左键单击(Left Click)、右键单击(Right Click)、双击(Chording)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:

左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。

右键单击:在判断为地雷的方块上按下右键,可以标记地雷(显示为小红旗)。重复一次或两次操作可取消标记(如果在游戏菜单中勾选了“标记(?)”,则需要两次操作来取消标雷)。

双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时使用双击无效。若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“ ×”。

3.2 游戏逆向分析

我们这次的任务是:

(1)分析“初级”、“中级”和“高级”的棋盘内存地址范围;

(2)找出“雷数”、“笑脸”和“计时器”的内存地址。

接下来是具体的操

3.2.1 “雷数”

雷的数量与选择的难度有关,所以可以用精确值扫描然后再改变难度,再扫描当前难度的雷的数量。

(1)选择简单难度,扫描精确值扫描10,再改为困难难度扫描99,会发现有三个结果。

 (2)不确定哪个为炸弹的地址,所以我们可以将它们加入地址栏试着改变它们为1,然后重新开一把游戏,如果直接过关这个值就是炸弹数量。

 

2.2.2 “笑脸”

笑脸有四种状态,未点击时,点击时,过关时,失败时,这四种状态都是用数值表示的,所以先用位置初始值来扫描,在表情改变时,再扫描变动的值。

(1)用上面的的方法可以找到笑脸地址

 

(2)不难发现未点击时,点击时,失败时,过关时,这四种状态分别对应的数字为0,1,2,3。

3.2.3 “计时器”

因为计时器时随时变化的所以我们可以开始游戏,在扫描栏输入一个快要达到的时间然后等到计时器变为该数值时立刻点击首次扫描,然后观察哪个地址的值一直变化即可找出计时器的地址。

(1)设置值然后等待

 

(2)等到计数器为这个值时扫描。

(3)在结果中找到数值一直加一的地址,就是这个地址。

 

3.2.4 棋盘内存地址范围分析

    棋盘分为“9*9”“16*16”“16*30”分别对应初级,中级,高级三种难度,每种难度的棋盘大小不同,分析可得棋盘内存地址范围应该也不同,随难度增加所占内存增加。因为点击之后的位置相比之前未点击时存储的信息不同,我们可以点击棋盘的第一个位置与最后一个位置,从而观察内存的变化来判断棋盘的内存地址范围,理论成立实践开始。

初级:

(1)首先我们先确定第一个位置的地址,选择初级难度,点击一个方格,打开内存浏览。

(2)点开第一个位置的方框,我们可以知道如果为空会带动附近的方格解锁,所以我们不断重开直到第一个位置的值为一个数字,会发现除了一直变化的数值只有一个位置的值发生了变化。

 

 (3)同理找到第一行最后一个方框的地址。

    最后一个格子也是一样的方法:

 

 

 

  1. 双击会显示地址

第一行最后一个地址为

第一行第一个地址为

最后一行最后一个地址为

所以可推出初级的棋盘地址为01005361 ~ 01005469

同理可得其它级别的棋盘地址:

 

                 中级的棋盘地址为01005361 ~ 01005550

                 高级的棋盘地址为01005361 ~ 0100555E

通过观察图 2.11 中的棋盘图和内存图,我们可以发现,方格被点击后有以下几种内
存值:
1 40 :方格下无数字且无雷;
(2) 41 :方格下数字为 1
(3) 42 :方格下数字为 2
(4) 43 :方格下数字为 3
(5) 4n :方格下数字为 n (0≤ n 8 );
(6) CC :地雷爆炸;
(7) 8A :方格下为地雷(未被点击)。
我们可以根据棋盘每个个对应的地址,通过浏览内存区域的数值来,快速过关。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值