首页
社区
课程
招聘
[讨论]扫雷游戏的分析以及一键扫雷脚本
发表于: 2021-12-1 09:30 16860

[讨论]扫雷游戏的分析以及一键扫雷脚本

2021-12-1 09:30
16860

很经典的一个游戏,虽然已经被大家分析的不能再透了,我还是自己动手学习了一下

1,打开exeinfo,将程序拖进exeinfo

13

2,该程序编译器版本为VC7.1

2.2.1 在CE中改变雷的数量,搜索结果

12

2.2.2在OD中找到地雷数量的地址验证是否正确

得到以下结果

1005330

1005194 插完旗子后的数量(没用)

10056A4 雷的数量

2.2.3在雷数量这个位置的上方,发现了一堆内存疑似游戏地图

11

2.2.4向上查看,找到起始位置

10

2.2.5经测试此处就是棋盘的位置

2.3.1分析地图构成

在od查看地图内存区域,发现第一行都是10,并且每个两行就有10

猜测10是地图的边界,用来区分行,并且每段的开头和结尾都是10,

所以每一行最多应该是30个格子,在扫雷中自定义棋盘大小为5050

得到的大小是3024,所以高度最多24格,猜想正确

2.3.2分析地图数据意义

在刚初始化的时候,数据只有0F和8F

16

点击第一个格子,原来的0f变为42,棋盘的数字是2

9

再次刷新点击,很多格子变成空格,内存变成40

8

再次刷新点击,第一个格子是1,内存对应为41

7

重新设置雷的数量,在一个位置插旗,8f变为8e

14

将插旗的位置变成问号,内存中变成了8d

2.3.3验证雷的位置

现在第一个位置是雷,但是在我点击第一个位置后,原来的雷消失了,

对比前后的数据截图,发现原来第一个位置雷变到了另一个位置

6

那么,一键扫雷,是不是把内存的8f雷变成8e就可以过关了呢?验证一下!

把8f改成8e后,原来是雷的位置就点不动了,不是雷的位置可以点击,所有方块都点完后就会过关。

但是改变内存的方式还需要把所有的位置都点击一遍,应该是不如直接根据位置在棋盘上操作的的方式简单。

地雷提示:在鼠标悬浮在格子上时显示是否有地雷,通过判断格子的坐标和地图的内存数据进行比对,有雷就设置窗口标题是有雷。

一键扫雷:按F7键后判断内存内的地雷位置,没有地雷的发送点击消息,有地雷的就跳过,所有的没地雷的位置都点了就过关了

5

15

SHR算数右移,这里是取高16位

MOVZX 指令

格式: MOVZX OPD,OPS

功能: 将8位或16位的OPS零扩展为16位或32位,在传给OPD.

所谓零扩展,就是把新扩展的高位字节填0,这可以保证无符号数扩展后还是原来

的无符号数.

此处的意思应该为从ebp+14的位置上取16位当作低16位,并把高16位填零,

得到的就是lprama的高16位

这里的操作是经过计算得到X,Y的对应的棋盘上数组的下标位置。

x = (x + 4) >> 4;

​ y = (y - 0x27) >> 4;

定义一个地图类,并且构造函数中初始化

4

一键扫雷:

3

在消息回调函数中判断按下F7,对比内存中的地雷位置,循环向主窗口发送消息

如果不是地雷就模拟点击,是地雷就什么都不做


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-12-1 12:51 被wx_Van_Zovy编辑 ,原因: 上传附件
上传的附件:
收藏
免费 3
支持
分享
最新回复 (2)
雪    币: 0
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了,如果可以把源码放出来就更好了
2021-12-1 10:46
0
雪    币: 544
活跃值: (796)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
kofcoco 学习了,如果可以把源码放出来就更好了
源码已经更新到附件了。把dll注入扫雷进程。F7扫雷
2021-12-1 12:49
0
游客
登录 | 注册 方可回帖
返回
//