很经典的一个游戏,虽然已经被大家分析的不能再透了,我还是自己动手学习了一下
1,打开exeinfo,将程序拖进exeinfo
2,该程序编译器版本为VC7.1
2.2.1 在CE中改变雷的数量,搜索结果
2.2.2在OD中找到地雷数量的地址验证是否正确
得到以下结果
1005330
1005194 插完旗子后的数量(没用)
10056A4 雷的数量
2.2.3在雷数量这个位置的上方,发现了一堆内存疑似游戏地图
2.2.4向上查看,找到起始位置
2.2.5经测试此处就是棋盘的位置
2.3.1分析地图构成
在od查看地图内存区域,发现第一行都是10,并且每个两行就有10
猜测10是地图的边界,用来区分行,并且每段的开头和结尾都是10,
所以每一行最多应该是30个格子,在扫雷中自定义棋盘大小为5050
得到的大小是3024,所以高度最多24格,猜想正确
2.3.2分析地图数据意义
在刚初始化的时候,数据只有0F和8F
点击第一个格子,原来的0f变为42,棋盘的数字是2
再次刷新点击,很多格子变成空格,内存变成40
再次刷新点击,第一个格子是1,内存对应为41
重新设置雷的数量,在一个位置插旗,8f变为8e
将插旗的位置变成问号,内存中变成了8d
2.3.3验证雷的位置
现在第一个位置是雷,但是在我点击第一个位置后,原来的雷消失了,
对比前后的数据截图,发现原来第一个位置雷变到了另一个位置
那么,一键扫雷,是不是把内存的8f雷变成8e就可以过关了呢?验证一下!
把8f改成8e后,原来是雷的位置就点不动了,不是雷的位置可以点击,所有方块都点完后就会过关。
但是改变内存的方式还需要把所有的位置都点击一遍,应该是不如直接根据位置在棋盘上操作的的方式简单。
地雷提示:在鼠标悬浮在格子上时显示是否有地雷,通过判断格子的坐标和地图的内存数据进行比对,有雷就设置窗口标题是有雷。
一键扫雷:按F7键后判断内存内的地雷位置,没有地雷的发送点击消息,有地雷的就跳过,所有的没地雷的位置都点了就过关了
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;
定义一个地图类,并且构造函数中初始化
一键扫雷:
在消息回调函数中判断按下F7,对比内存中的地雷位置,循环向主窗口发送消息
如果不是地雷就模拟点击,是地雷就什么都不做
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-12-1 12:51
被wx_Van_Zovy编辑
,原因: 上传附件