ce 扫雷实验报告,棋盘布局,雷数,笑脸,计时器内存地址,思维导图分析。.

如果有帮到大家,哥哥姐姐不要吝啬点个关注呗!后续会更新更多其他有关汇编,逆向和web的实操超详细解析。谢谢大家!

目录

一、实验工具介绍...

二、针对“扫雷”游戏...

2.1分析“初级”、“中级”和“高级”的棋盘内存地址范围...

2.2找出“雷数”、“笑脸”和“计时器”的内存地址...

2.2.1 “雷数”的内存地址...

2.2.2 “笑脸”的内存地址...

2.2.3 “计时器”的内存地址...

2.3分析雷存放算法...

2.4利用思维导图分析“扫雷”游戏软件的工作原理(设计原理)

一、实验工具介绍

Cheat Engine是一款专注于游戏的修改器。它可以用来扫描游戏中的内存,并允许修改它们。Cheat Engine的用法也不是很复杂,首先是要先打开游戏,然后打开Cheat Engine,点击左上角的那个电脑图标,在弹出来的框中选择游戏进程,然后选择扫描类型和数值类型,进行扫描并修改。内存扫描是Cheat Engine的最主要功能之一,它可以扫描指定数值的内存地址,通过修改这些数值来达到修改游戏数据的目的,从而达到诸如无限生命、时间或弹药等优势。

二、针对“扫雷”游戏

2.1分析“初级”、“中级”和“高级”的棋盘内存地址范围

分析:扫雷有空白和数字,我们可以选择未知的初始值进行扫描,然后把重置后的数值与之前的进行比较,采用变动的数值/未变动的数值进行扫描

这里我们选择xp版的扫雷进行这个经典的试验

取消快速扫描→扫描类型→选择→未知的初始值→点击初级棋盘上第一格→进行首次扫描

1.首次扫描后已经有了很多条结果,点击“游戏”,然后新开一局(前排温馨提示:按f2键可快速开启新局,效率翻倍)

2.观察第一个格子的内容,发现和上一局一样是空白

3.选择“未变动的数值”,点“再次扫描”

当遇到第一格有数字的情况时(当出现的数字不一样时,也代表它发生了变化),证明这一格数据发生了变化

选择“变动的数值”

再次扫描

一直重复上述步骤,直到出现基址

扫描到结果后将其记录,用同样的方法找到最后一格的基址

初级棋盘第一格和最后一个地址:

中级棋盘第一格和最后一个地址:

高级棋盘第一格和最后一个地址:

可得棋盘的地址范围为:

初级棋盘 0100535E ~ 01005469

中级棋盘 0100535E ~ 01005550

高级棋盘 0100535E ~0100555E

也可以进入内存,找到对应的地址进行查看,如图所示:

2.2找出“雷数”、“笑脸”和“计时器”的内存地址

2.2.1 “雷数”的内存地址

地雷数在一局中是不会改变的,但是在改变难度的时候雷数会改变(初级:10个 中级:40个 高级:99个),可以在改变难度后搜索变化的值,在难度不变的时候搜索不变的值,最终筛选出基址。

1.点击“游戏”打开“自定义”

2.查看当前雷数

3.输入数据,开始扫描

修改雷数数值,继续搜索,最终留下三个基址,将三个数据一起拉入工作区。

我们可以尝试先找到旗子的地址。插一个旗子之后,观察三个基址,发现旗子的地址

因此可以排除上述三个基址中的一个

改变其中一个数据的数值然后新开一局,观察左上显示雷数的数值是否变为和输入的值相同。若是相同,则可以确定该地址为雷数基址(本实验中三个值查找出的地址都显示为绿色,即三个地址都是基址,所以不需要再查找每个地址的偏移值。若是查找出的地址为黑色,则必须找到该值真正的基址,通过查找“是什么访问了这个地址”或者“是什么改变了这个地址”来查找上一级地址,重复多次相同的操作后找到绿色的地址,这是查找基址的任务才完成);若不同,则继续测试下一个地址。本实验中将这三个基址都改为“1”雷数,以此可以快速验证雷数是否修改成功。

最终这里雷数内存地址为:010056A4

2.2.2 “笑脸”的内存地址

通过分析可得“笑脸”一共有四种表情,分别是在平时普通的笑脸,胜利时戴墨镜的脸,失败时悲伤的脸,点击格子时张嘴的脸。分析出这四种表情以后,就可以通过改变笑脸的表情来搜索变化的值找到控制笑脸的数值(通过编写程序的经验,对于这类只有三四个选项的变量时,往往会编写一个变量,每个值代表一个选项,而且根据经验而谈,这类flag值一般都设为个位数,即0,1,2,3…通过对扫雷的逆向分析推导出该变量的编码),找到值后,就可以找到基址。由于雷数太多导致实验时间太长,所以提前修改我们上一个找的雷数值,将其修改为2,这样可以加速试验的时间。

1.这里建议通过ce,修改为2

2.老规矩,取消快速,选择未知,点击扫描

中间的一般都是雷,可以插旗子控制输赢,或者踩雷来控制“笑脸”

开始时笑脸不变,搜索“未知的数值”,在胜利时笑脸带墨镜,踩雷时表情变化,(在搜索笑脸时最好搜索胜利时的墨镜脸和失败时的悲伤脸,点击时的张口脸由于太快可能CE修改器无法捕捉到,不过可以在测试一个地址是否为笑脸基址时使用,这个数值比较少见可以代表改变表情的特征)表情变化时搜索“变化的数值”,表情不变时搜索“未改变的数值”。

可以在中间表情不变的时候或者结果数量一直不变的时候,搜索几次“未变动的数值”,可以筛除掉很多数据

重复多次,找到四个结果,修改结果观察笑脸表情是否变化(此处需要再次点击格子刷新),若变化,则该地址为笑脸基址;若没有变化则继续测试下一个地址。

最终找到笑脸的内存地址01005160

2.2.3 “计时器”的内存地址

计时器无法搜索精确数值,只能通过它的特性来查找,经过观察可得,计时器在不断增长,一次我们得知可以查找“增加的数值”,要注意的是开局之后点击一次格子,计时器才开始计时,在重置棋盘之后到点击第一个格子之前这段时间里计数器一直为0,此时若是可选数据有很多,可以精确搜索0,来筛选数据。

搜索“未知的初始值”,点击一个格子,开始计时后搜索“增加的数值”,多次搜索。

找到与页面计时器同步增长的数值,那该地址即为计时器基址。

最终找到计时器的内存地址0100579C。

2.3分析雷存放算法

在整个扫雷软件的项目中,一定存在一种用于布雷的算法,它主要决定了每一局中雷所放的位置,它被主函数调用的时机也决定了扫雷游戏中存雷的算法。分析他的算法对于理解扫雷游戏的运行有很大帮助。

首先我们要知道布雷函数被主函数调用的时机,根据观察可得,打开扫雷游戏之后,自动生成初级扫雷游戏,那么软件会在这个时候就调用布雷函数将雷的位置定好了吗?咱们做一个实验:打开扫雷软件点击固定位置的一个格子,点击一个格子后就点击f2重置棋盘,再次点击上次点击的格子,多次实验。

结合之前咱们ce找各种内存地址时候的经验,我们不难发现,每开局第一次点击的格子都是安全地带,无数次试验中没有一次第一次就踩到地雷。如果主函数在最初就调用布雷函数,那么一次就踩到雷的概率应该是40/256(中级棋盘),而实际测试出的结果是0,大概率说明我们一开始的假设——认为在棋盘初始化后就已经调用布雷函数的观点是错误的。

所以我又做了第二个实验,测试第二次是否能踩到雷。和第一个实验的流程相同,同样是选取了两个固定的格子,进行了50次实验,总结实验数据后发现第二次踩雷的概率基本与理论上的概率拟合(40/255)。

甚至咱们还可以利用之前搜索到的“雷数内存地址”,不能白搜是吧。

中级棋盘一共256个格子,游戏设定上限是225个雷,通过修改咱们改为255个雷!看看第一格格子会不会直接踩到。

 

结果可想而知。

通过实验的结果比对,可以得出一个结论:主函数在第一次点击棋盘上任意一个格子之前没有调用布雷函数,也就是说无论玩家第一次点击棋盘上任一格子都不会踩到雷,因为此时的棋盘上还不存在地雷,而在玩家点击第一个格子之后到点击第二个格子之前已经调用布雷函数,这时棋盘上的地雷才布置好。

此时我们知道了布雷函数在主函数的调用时机是在点击第一个格子之后,那么在布雷的时候就要避免将雷布置在第一个格子上,否则在玩家点击第二个格子之后会直接按踩雷结算。那么就需要在布雷函数中传递一个表示当前第一个格子的坐标的参数。我们先假设棋盘上的每一个格子位置都是由二维数组存储的,这样在传参时只需传递横坐标的值和纵坐标的值即可。
经过第二次实验我发现每次重置后地雷的布置基本上没有规律可循,我们先假设每次都是随机布置地雷位置,那么我们可以用srand函数产生随机数种子,以便在之后随机分配横纵坐标。以中级难度为例,我们需要提前知道需要多少雷数以及棋盘的长和宽,所以在调用布雷函数时也要把所需雷数和棋盘的长宽传参过来。知道雷数后设一个循环函数知道所需雷数全部布置好。同时要注意需要跳过在前文中提到的第一次点击格子位置,我所猜测的扫雷布雷算法的循环体结构如下:

其中row和col为第一次点击格子的横纵坐标,m_uMineNum为所需地雷数,m_uYNum和m_uXNum分别为棋盘的长和宽。因为随机数的产生没有限制范围,所以会出现超过已有棋盘范围的可能,为了解决这个问题,我对产生的随机数取余,使其永远在棋盘限制的范围内。对于调过第一个格子的问题,我采用条件语句加continue跳过本次循环的语句来解决,经过编译证实其与原版扫雷软件的效果相同。

现在我们已经找到了符合要求数量的雷的位置,接下来我们需要做的是埋雷,根据经验我们需要在循环体中设置一个埋雷语句。做这个工作时我们要注意随机数会出现重复数据的现象,我们不需要在已经埋好雷的位置再次埋入新雷,所以我们需要避开已经埋过雷的位置。我所编写的猜测代码如下:
ATTRIB_MINE为地雷的标识码,如果一个格子的标志值uAttrib与ATTIB_MINE相同的话,这个格子处埋着地雷。我使用了一个条件语句避开已经埋过雷的格子。将循环体的index放入这个条件语句中是因为只有找到一个没有埋过雷的格子才算埋好雷,若是将index放在条件语句之外,会导致还没有埋够所需要的雷数就已经停止循环,无法达到需求。

到这里为止猜测布雷函数的基本功能已经编写完毕,经过实验验证,用这个猜测函数做出来的扫雷游戏与原版扫雷游戏规则与功能基本相似,可以证明扫雷软件的布雷算法基本与我们所猜测的一致。

2.4利用思维导图分析“扫雷”游戏软件的工作原理(设计原理)

点击工具栏的“游戏”,在等级区可以选择难度,选择初级显示的是99的棋盘和10个地雷,选择中级显示的是1616的棋盘和40个地雷,选择高级显示的是16*30的棋盘和99个地雷,选择自定义可以弹出一个弹窗自主输入长度、宽度和雷数。

点击工具栏的“游戏”,取消“颜色”的选择,整个界面变为灰白色。

点击工具栏的“游戏”,选择“声音”,玩游戏时音效出现。

点击工具栏的“游戏”,选择“扫雷英雄榜”,可以查看每个难度最高纪录,选择左下角“重新计数”,所有记录清零。

点击工具栏的“游戏”,选择开局,重置棋盘。左键点击棋盘任意一个格子给这个格子插上旗子,同时显示的雷数变少,当所有雷所在的格子被插上旗子,则判断胜利。

右键点击棋子任意一个格子,如果是第一次点击格子,不会踩到雷。之后再点击格子,如果这个格子里是雷,那么判定失败;如果这个格子周围8个格子中有雷,那么显示周围雷的个数(只有1,2,3这三种可能);如果这个格子周围无雷,自动打开周围8个格子。若是周围8个格子的外围有雷则隐藏含雷的格子,打开其他无雷的格子,以此类推。

ce 扫雷实验报告,棋盘布局,雷数,笑脸,计时器内存地址,思维导图分析相关推荐

  1. 高等数学思维导图_直击高数重点!这份思维导图请收下

    点击蓝色字关注我们! Hello,同学们 今天是又来发福利的小渥 有需要的同学们在后台回复[高数]便可获取高清版噢 我们的数学老师整理了一份   高等数学  的思维导图 思维导图是一种简单而有效的学习 ...

  2. Xmind:高数第二章:导数与微分 思维导图

  3. 石灰吟思维导图视频_石灰实验分析

    石灰吟思维导图视频 Inaccurate experimentation analysis leads to suboptimal business decisions. As Lime grows, ...

  4. 产品体验报告——准备工作思维导图+模板转载

    PS:图片另存之后可以放大观看 思维导图以及模板均整理.转载于人人都是产品经理! (一)产品概述 (1)体验环境 对于app来说,无非就是体验产品所用的机型,系统,然后app版本,体验时间,体验人等方 ...

  5. 排列组合思维导图_排列组合——排列数专题

    在上篇关于排列组合主要考点的介绍中,正男老师提到:排列组合考点通常可以拆分为排列数考点和组合数考点.排列数考点相关试题可以细分为2类,分别为:穷举问题和限制条件问题.本期正男老师就从近六年内的5道涉及 ...

  6. android搜索框布局文件,android搜索框列表布局,流程及主要步骤思维导图

    android搜索框列表布局,流程及主要步骤思维导图 android搜索框列表布局,流程及主要步骤思维导图 activity_coin_search.xml ---------- android:id ...

  7. 2021新版个人征信报告将实施,这些坑一定不能踩!思维导图详细整理

    据悉2021年4月份,中国人民银行的新版征信报告就要上线了.在此之前,我国的征信系统早已成为世界上收录人数最多.数据规模最大,覆盖范围最广的征信系统,那么即将实施的第二代征信系统究竟加入了哪些内容?有 ...

  8. 思维导图---考研高数---中值定理---套路归纳---汤家凤

    思维导图---考研高数---中值定理---套路归纳---汤家凤 归纳的是目前视频在中值定理部分目前所有套路和内容(汤家凤基础) 太大可能不方便看,先上主要节点的框架(缩略图) 接下来是完整的:

  9. 高数————思维导图(上岸必备)(积分部分)

    高数----思维导图(上岸必备)(极限与连续). 高数----思维导图(上岸必备)(微分部分). 高数----思维导图(上岸必备)(积分部分). 高数----思维导图(上岸必备)(级数部分). 高数- ...

最新文章

  1. cartographer 配置过程
  2. 如何撰写好一篇论文?密歇根Andrew教授这篇《撰写高影响力论文指南》为你细致讲解论文写作,附视频与pdf...
  3. django html5 video,Django Web中的静态文件之HTML5第1篇
  4. pyqt5设置dialog的标题_PyQt5Day29--展示控件QDialog(对话框)
  5. java7 离线_java7 64位
  6. 属于我们的纪念日-相识一周年 - 生活至上,美容至尚!
  7. 皮一皮:同一样物件,不一样的时间...
  8. python怎么读取txt文件数据保存数组中-Python Numpy中数据的常用的保存与读取方法...
  9. leetcode_median of two sorted arrays
  10. 【Elasticsearch】Elasticsearch bouncing result 问题
  11. 设计师必收藏!!!让你灵感迸发的配色网站
  12. [CODEVS1911] 孤岛营救问题(分层图最短路)
  13. matlab状态方程 传递函数 可控性,matlab 控制系统仿真
  14. 好玩的软件 Aura 模拟自然界中的音效,让你置身大自然。
  15. 电子合同助力“在线教育”高效发展
  16. 思科路由器的基本配置
  17. 第六章-博弈论之Stackelberg博弈
  18. 今日恐慌与贪婪指数为22 恐慌程度有所缓解
  19. 不知道如何回复审稿人意见?回复模板来了!
  20. #让我们用python跑回归#Fama-French三因素模型(一)

热门文章

  1. 用HTML和CSS做一个携程旅游手机端布局含源码分享
  2. MacBook Pro,经过了一个多月的使用,实际体验到底如何?
  3. Vue进阶之Virtual DOM(虚拟DOM) 实现原理
  4. [js基础篇]模块化小结
  5. 新东方雅思词汇---7.2、warrant
  6. Kafka中steamAPi操作
  7. Federated Learning of Multi-branch Networks from Periodically Shifting Distributions
  8. 为理想而超越理想,Bespin Global的崛起之路
  9. 多交个朋友?罗永浩跳槽淘宝直播间;5分钟搞懂XGBoost算法;CUDA C++最佳实践指南;手写字体的倾斜校正;前沿论文 | ShowMeAI资讯日报
  10. 怎样阻止Linux服务器执行rm -rf /*命令