安全测试之探索 windows 游戏扫雷
作者:京东工业 宛煜昕
扫雷游戏相信很多人都从小玩过,在那个电脑游戏并不多的时代,扫雷成为玩的热度蛮高的一款游戏之一,然而就在有一次,接触到了一次不寻常的扫雷过程,使得后来我也有了这个冲动,也来做一次。通过动态调试,逆向和C来写一个扫雷辅助工具从而提高逆向与编码技能。
动态调试(分析)
首先进行扫雷程序的动态调试(分析):
打开OD(ollydebug工具),把扫雷拖放到OD中,F9运行;ctrl+G输入要跟随的表达式,输入rand,点击【确定】,跳转到该函数调用处,F2设置断点,此次是想通过API rand函数来找寻突破口。在扫雷窗口的雷区中任意点击一个位置(图片中出现2的位置),再点击还原(【笑脸】按钮-),如下图:
此时OD会在刚设置的rand处的断点断下来,如下图:
通过找到随机函数rand,下面进行栈回溯,回到上级函数中,来找到push(压入栈)的参数,也就是说随机生成函数(rand)是随机生成的高,宽,雷数。点击K(调用堆栈),弹出K调用堆栈窗口,查看堆栈窗口信息,找到返回地址,双击K调用堆栈窗口中的返回地址,返回到上一层,此过程称为栈回溯。仔细观察下图的堆栈信息010036D2(返回地址)。
单步F8,观察寄存器,数据窗口和堆栈窗口变化,dword ptr ss:[esp+0x4]或dword ptr ds:[XXX]数据窗口跟踪数值(000DFC44值是09),如下图:
返回到上层函数后,分析这里面的指令,得知刚才随机rand生成的宽(09),如下图,注意观察地址010036C7。
首先从这个函数返回的结果着手分析eax,单步后,可以看到往堆栈中(地址010036D2)压入了一个数字09,如下图:
通过以上分析,基本可以猜测得到周边的随机函数rand生成是高,雷数。可以试着改变扫雷设置(自定义雷区),如下图,来准确定位rand函数及传参,点击【确定】,再点击【还原(笑脸-)】按钮。
观察OD,如下图:
发现push 0C(000DFC84值为0C),可以确定这个rand函数push 0C就是雷区的高度。同时在内存区域也能明确看到一个大致的雷区图形,通过以上方法,大致可以猜测0x80就是雷。或者与IDA共同分析,通过静态分析,可以更直观的看到程序逻辑。得到如下数据:基地址,雷数等信息,如下图:
以上代码大概意思是先设置了全局宽0x09,高0x0C,雷数0x0A的变量,通过判断两层循环,随机生成了宽和高。得地图基地址:0x01005340。通过分析下图得知无雷是0x0F,有雷是0x8F,墙壁是0x10。
通过宽,高的地址,打印出扫雷区域和雷数,并可以更直观的区分边墙,雷。
下面开始要想如何标记雷了,通过假设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);// 指定操作方式计算雷的坐标(点击第一个扫雷的方块,查看坐标),需要注意边墙,如下图:
减去边墙的值:
-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)。
代码编写
通过以上大致的分析,可进行代码的编写了,
成果
输入3landmine位置,获取出landmine(10墙壁,8Flandmine,0F无雷)
输入2自动扫雷,标记雷并开出地图
通过这个小项目,首先加强了对软件的一种逆向思维,如:看到这一种面板,大概猜到是用数组来实现的,其次雷的布局是随机生成的,然后通过动态调试可以了解实现方法(开发者的一种实现思路),可找到关键的基地址,几种状态(无雷,有雷,墙壁),最后编码阶段可以理解内存的操作,几个重要的API,FindWindow获取句柄,OpenProcess打开句柄,ReadProcessMemory读取内存信息,PostMessage异步消息模式,CloseHandle关闭句柄。其中有一些分析有误或不到位的地方还请拍砖。多逆向,分析代码有很多帮助,不仅可以拓宽自己编程与测试的思维及水平,还能发现,开发及利用程序中的漏洞或给程序打补丁等。希望小伙伴们在这条任重而道远的路上加油,互勉。
安全测试之探索 windows 游戏扫雷的更多相关文章
- C++复现经典游戏——扫雷
国庆小长假,当大家都去看人山人海的时候,我独自一人狂码代码.这两天想要实现的内容是Windows上的一个经典游戏——扫雷.相信90后和一些上班族对此并不陌生.然而,从win8开始,扫雷就不再是Wind ...
- 【系统篇】从int 3探索Windows应用程序调试原理
探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...
- Windows游戏编程之从零开始d
Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...
- 探索Windows命令行系列(5):几个实用的命令例解
1.关机命令(shutdown) 2.管理 Windows 服务(sc) 3.管理任务进程(tasklist.taskkill) 4.显示 TCP/IP 配置值(ipconfig) 5.网络诊断工具( ...
- 探索Windows命令行系列(1):导航目录
探索Windows命令行系列(1):导航目录 探索Windows命令行系列(2):命令行工具入门 探索Windows命令行系列(3):命令行脚本基础 探索Windows命令行系列(4):通过命令操作文 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存
第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记2——透明贴图,动画技术
第5章 透明贴图 像这样直接贴图会产生这种情况,所以我们需要透明贴图. 透明遮罩法:主要利用BitBlt函数中Raser(光栅)值的运算,需要准备素材图和遮罩图: 这个方法的原理解释见书131页. 示 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记3——输入消息处理,物理建模与粒子系统初步
第7章 Windows游戏输入消息处理 1. 键盘消息处理 之前提到的窗口过程函数有两参数与消息输出有关——wParam和llParam LRESULT CALLBACK WindowProc( _I ...
- windows游戏编程 创建WIN32一个HelloWOrld程序
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22449085 作者:jadeshu 邮箱: jades ...
- Mac支持的网络游戏有哪些?怎么支持Windows游戏?
"游戏是这个世界上唯一能和女性争夺男朋友的东西(/滑稽,有不少女生也喜欢玩游戏)."虽然只是一句玩笑话,不过也可以看出游戏对大多数男生来说是必不可少的一项娱乐活动了.而网络游戏是游 ...
随机推荐
- 2020年第11届蓝桥杯C/C++B组 第二轮省赛
# JJU-干干 试题A :门牌制作[问题描述]小蓝要为一条街的住户制作门牌号.这条街一共有 2020 位住户,门牌号从 1 到 2020 编号.小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符 ...
- jquery 判断字符串长度
function titleLength(str) { var strLength = 0; var list = str.split(""); for (var i = 0; i ...
- #Python #字符画 #灰度图 使用Python绘制字符画及其原理
由于最近身体状况不太好所以更新会有点慢,请大家多多包涵.同时也提醒大家注意保重身体! 前提:默认大家已经正确安装了 Python,且正确将Python配置到了系统Path . 目录 1.字符画的概况 ...
- uniapp 全局注册组件注意事项
标准 根目录components 文件夹下建立 组件文件名文件夹 然后组件 autoscan 打开 别的用不到不写 全局使用 备注 因为不是vuecli 项目 只在H5 端生效 在app 上生 ...
- servlet - 从本地下载图片
import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet. ...
- 字典:求和计数(return知识巩固)
野餐用品计数 之前写过一段,字符在字符串中出现次数的代码 import pprint message = 'It was a bright cold day in April, ' \ 'and th ...
- C# Http 服务器get pos 请求 获取头信息 iOS 客户端联调
using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text ...
- (十三).CSS3中的变换(transform),过渡(transition),动画(animation)
1 变换 transform 1.1 变换相关 CSS 属性 CSS 属性名 含义 值 transform 设置变换方式 transform-origin 设置变换的原点 使用关键字或坐标设置位置 t ...
- php上传文件时出现 caution: request is not finished yet
其中的一个原因:是wamp64下的tmp文件夹中的临时文件太多,把这个文件夹的临时文件清理后就可以了.
- 基于5G边缘网关的智慧公交站台应用
发展智能物联网,有利于提高城市运行效率,优化居民生活体验,促进城市迸发活力.智能物联网已经融合进生活的方方面面,例如最常见.分布最广泛的公交站台,也能够通过物联网实现升级换代,为居民提供更丰富.更便捷 ...