安全测试之探索windows游戏扫雷

京东云开发者
• 阅读 325

作者:京东工业 宛煜昕

扫雷游戏相信很多人都从小玩过,在那个电脑游戏并不多的时代,扫雷成为玩的热度蛮高的一款游戏之一,然而就在有一次,接触到了一次不寻常的扫雷过程,使得后来我也有了这个冲动,也来做一次。通过动态调试,逆向和C来写一个扫雷辅助工具从而提高逆向与编码技能。

动态调试(分析)

首先进行扫雷程序的动态调试(分析):

打开OD(ollydebug工具),把扫雷拖放到OD中,F9运行;ctrl+G输入要跟随的表达式,输入rand,点击【确定】,跳转到该函数调用处,F2设置断点,此次是想通过API rand函数来找寻突破口。在扫雷窗口的雷区中任意点击一个位置(图片中出现2的位置),再点击还原(【笑脸】按钮-),如下图:

安全测试之探索windows游戏扫雷

此时OD会在刚设置的rand处的断点断下来,如下图:

安全测试之探索windows游戏扫雷

通过找到随机函数rand,下面进行栈回溯,回到上级函数中,来找到push(压入栈)的参数,也就是说随机生成函数(rand)是随机生成的高,宽,雷数。点击K(调用堆栈),弹出K调用堆栈窗口,查看堆栈窗口信息,找到返回地址,双击K调用堆栈窗口中的返回地址,返回到上一层,此过程称为栈回溯。仔细观察下图的堆栈信息010036D2(返回地址)。

安全测试之探索windows游戏扫雷

安全测试之探索windows游戏扫雷

安全测试之探索windows游戏扫雷

单步F8,观察寄存器,数据窗口和堆栈窗口变化,dword ptr ss:[esp+0x4]或dword ptr ds:[XXX]数据窗口跟踪数值(000DFC44值是09),如下图:

安全测试之探索windows游戏扫雷

返回到上层函数后,分析这里面的指令,得知刚才随机rand生成的宽(09),如下图,注意观察地址010036C7。

安全测试之探索windows游戏扫雷

首先从这个函数返回的结果着手分析eax,单步后,可以看到往堆栈中(地址010036D2)压入了一个数字09,如下图:

安全测试之探索windows游戏扫雷

通过以上分析,基本可以猜测得到周边的随机函数rand生成是高,雷数。可以试着改变扫雷设置(自定义雷区),如下图,来准确定位rand函数及传参,点击【确定】,再点击【还原(笑脸-)】按钮。

安全测试之探索windows游戏扫雷

观察OD,如下图:

安全测试之探索windows游戏扫雷

发现push 0C(000DFC84值为0C),可以确定这个rand函数push 0C就是雷区的高度。同时在内存区域也能明确看到一个大致的雷区图形,通过以上方法,大致可以猜测0x80就是雷。或者与IDA共同分析,通过静态分析,可以更直观的看到程序逻辑。得到如下数据:基地址,雷数等信息,如下图:

安全测试之探索windows游戏扫雷

安全测试之探索windows游戏扫雷

安全测试之探索windows游戏扫雷

以上代码大概意思是先设置了全局宽0x09,高0x0C,雷数0x0A的变量,通过判断两层循环,随机生成了宽和高。得地图基地址:0x01005340。通过分析下图得知无雷是0x0F,有雷是0x8F,墙壁是0x10。

安全测试之探索windows游戏扫雷

安全测试之探索windows游戏扫雷

通过宽,高的地址,打印出扫雷区域和雷数,并可以更直观的区分边墙,雷。

下面开始要想如何标记雷了,通过假设WinProc(通过栈回溯到消息回调函数)中看到有关GetDC函数,大致猜测会用到Bitblt,在OD中ctrl+g输入要跟随的表达式,录入“BitBlt”,按F2设置断点,点击扫雷区域任意一个位置,OD会断在BitBlt位置。

在BitBlt中还有一个BitBlt函数,初步判断觉得是用双缓冲方式绘图,

BitBlt(hDestDC,//目的DC XDest, // 目的x坐标 YDest, // 目的y坐标 10, // 10, // 重绘区域的高和宽 hSrcDC, // 源DC 0, 0, SRCCOPY);// 指定操作方式计算雷的坐标(点击第一个扫雷的方块,查看坐标),需要注意边墙,如下图:

安全测试之探索windows游戏扫雷

安全测试之探索windows游戏扫雷

减去边墙的值:

-0x04=0x0C(12)-0x10(16)

0x27=0x37(55)-0x10(16)

得到坐标公式:x(XDest:12)=1_0x10(16)-0x04(4),y(YDest:55)=1_0x10(16)+0x27(39)。

代码编写

通过以上大致的分析,可进行代码的编写了,

安全测试之探索windows游戏扫雷

安全测试之探索windows游戏扫雷

安全测试之探索windows游戏扫雷

成果

安全测试之探索windows游戏扫雷

输入3landmine位置,获取出landmine(10墙壁,8Flandmine,0F无雷)

安全测试之探索windows游戏扫雷

输入2自动扫雷,标记雷并开出地图

安全测试之探索windows游戏扫雷

通过这个小项目,首先加强了对软件的一种逆向思维,如:看到这一种面板,大概猜到是用数组来实现的,其次雷的布局是随机生成的,然后通过动态调试可以了解实现方法(开发者的一种实现思路),可找到关键的基地址,几种状态(无雷,有雷,墙壁),最后编码阶段可以理解内存的操作,几个重要的API,FindWindow获取句柄,OpenProcess打开句柄,ReadProcessMemory读取内存信息,PostMessage异步消息模式,CloseHandle关闭句柄。其中有一些分析有误或不到位的地方还请拍砖。多逆向,分析代码有很多帮助,不仅可以拓宽自己编程与测试的思维及水平,还能发现,开发及利用程序中的漏洞或给程序打补丁等。希望小伙伴们在这条任重而道远的路上加油,互勉。

点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
2年前
手把手教你使用JavaScript打造一款扫雷游戏
大家好,我是皮皮。扫雷大家都玩过,今天我们就是用JavaScript来打造扫雷游戏。废话不多说,直接看下效果;上图是失败后的结果。一、思路分析我们新建一个首页,在首页放置一个点击开始游戏的按钮,动态生成100个小格,即100div;然后通过点击div进行扫雷操作,然后扫雷成功或者失败显示对应的结果;二、静态页面搭建2.1结构层
Stella981 Stella981
3年前
Linux下的小游戏
Linux下的小游戏非常丰富,除了有扫雷、纸牌等Windows下常见小游戏外,还有一些富有Linux特色的游戏,如数独、gbrainy等智力游戏。我们今天要介绍的是为众人喜闻乐见、容易上手的小游戏:五子棋、中国象棋、麻将连连看、宝石迷阵。1.五子棋。在“Ubuntu软件中心”里搜索bovo,安装即可。点击“新建”,即可开始新游戏。右下角选择难度。
Wesley13 Wesley13
3年前
Html5 Canvas 扫雷 (IE9测试通过)
扫雷是一个非常经典的游戏,记得在第一次接触的windows3.22上就有扫雷了,到现在的Win7,依然保留着这个经典的游戏,结合Html5Canvas,模仿Win7的UI,将老板扫雷进行了升级。在FireFox,Chrome,和IE9下测试通过。实现中设计的类:CellInfo,MineInfo,InfoProcess,Cell
Wesley13 Wesley13
3年前
Java学习笔记
基础常识软件:一系列按照特定顺序组织的计算机数据和指令的集合常见的软件:系统软件:如:DOS,windows,Linux等应用软件:如:扫雷,迅雷,QQ等软件的出现实现了人与计算机之间的更好的交互交互方式:图形化界面:这种方式简单直观,使用者易于接受,容易上手操作命令行方式:需要有一
Wesley13 Wesley13
3年前
C语言实战项目—扫雷小程序
扫雷游戏是微软自带的一款小游戏。扫雷游戏的玩法是,以9\9棋盘为例,棋盘上随机分布着10个地雷,玩家在棋盘上进行点击,如果被点击的格子是地雷,则玩家被炸“死”,游戏结束;如果被点击的格子上没有地雷,与被点击的格子相邻的格子(被点击格子的上下左右还有斜向,共八个格子)有地雷,则在被点击的格子上显示这些地雷的总数,如果与被点击的格子相邻的八个格子都没有地雷,则
Wesley13 Wesley13
3年前
C语言简易版扫雷
扫雷一、问题描述二、基本流程三、步骤1.菜单界面2.创建地图3.初始化地图4.打印地图5.玩家翻开坐标6.判断是否为地雷7.更新地图8.判断是否胜利四、代码实现一