一、实验的目的和意义
这次实验是为了让我们对CE的使用和对逆向思维有进一步的了解和认识,这次实验要求我们分析“初级”、“中级”和“高级”的棋盘内存地址范围;找出“雷数”、“笑脸”和“计时器”的内存地址;分析地雷存放的算法;以及利用思维导图分析“扫雷”游戏软件的工作原理。
二、雷数的内存地址
雷的数目是固定的,所以我们采用精确扫描的办法就可以找到雷数的内存地址,首先打开游戏的自定义,可以看到雷的默认数量默认为70,所以扫70。
因为扫描70得到的结果过于多,所以我们通过自定义将雷数修改为60,再次精确扫描60,可以看到扫描出了3个基址,此刻我们要做的就是判断哪一个基址才是雷数的内存地址。
判断雷数内存地址的方法就算从CE上修改地址的数值,观察扫雷自定义中的雷数是否会发生相应的改变。经过相应的操作可以判断出010056A4为雷数的内存地址。
三、时间的内存地址
(1)计数器的时间也是一个具体的值,所以我们也可以通过精确数值扫描出来,游戏开始之前计数器上的数是0,所以我们扫描0。
因为第一次扫描的结果太多,选择介于什么数值之间再次扫描,所以时间的内存地址为0100579C。
四、笑脸的内存地址
因为笑脸没有准确的数值,所以我们没有办法根据数值进行精确扫描,但是我们可以发现笑脸只有两个状态:一个是游戏进行的时候,一个是还原游戏的时候,所以我们通过0和1进行扫描,游戏进行状态输入1进行扫描,还原游戏之后输入0进行扫描,首先是游戏进行状态,输入1进行扫描。
点击笑脸,将游戏还原,输入0进行扫描。
点击一个小方块,输入1进行扫描。
点击笑脸,将游戏还原,输入0进行扫描,可以看出笑脸的内存地址为01005164,若想验证结果是否正确,可以将这个地址添加到地址栏中观察他的数值是否在游戏初始阶段为0,在游戏进行阶段为1。
五、“初级”、“中级”和“高级”的棋盘内存地址范围
1.初级棋盘的内存地址范围
将雷数的内存地址添加到地址栏后右键,点击浏览相关内存区域,然后点击棋盘在CE的内存区域上会闪红,我们应该明白的是棋盘是连续的所以棋盘地址也应该是连续的,点击相邻的棋盘观察内存区间上闪红的内存是否也连续,通过观察,初级棋盘的第一个内存地址为0100535421,最后一个内存地址为01005464D,所以中级期棋盘的内存地址范围为0100535421-01005464D9.
2.中级棋盘的内存地址范围
通过观察,中级棋盘的第一个内存地址为01005354F1,最后一个内存地址为0100554470,所以中级期棋盘的内存地址范围为01005354F1-0100554470。
3.高级棋盘的内存地址范围
通过观察,高级棋盘的第一个内存地址为01005354F1,最后一个内存地址为010055546E,所以中级期棋盘的内存地址范围为01005354F1-010055546E。
六、分析地雷存放的算法
- 随机生成雷区
这里我们使用随机函数来实现雷区的随机化,尽量保证每个格子生成雷的概率相等;每次从当前坐标点之后的二维数组中随机选择一个坐标,并将生成的随机坐标(randx,randy)与当前选择的坐标互换,实现一次随机选择;
2.计算每个格子周围的雷的数量
以当前坐标点为中心,对周围八个点进行遍历,每个雷的位置L[x][y]值为1,设置一个函数用于判断当前遍历的坐标点是否在二维数组范围内,将每个点周围的雷的数量存储在一个新的二维数组numbers中;
3.点击空白打开一片雷区的算法
对当前是空白的坐标点,对其周围上下左右四个方向进行深度优先遍历,碰到数字或者雷时停止向下的遍历
七、分析扫雷游戏软件的工作原理