扫雷分析笔记 总结 多种方式定位雷区 通过替换窗口过程函数或Inlien Hook的方法实现作弊 + 自写DLL注入器
笔记来自:科锐40班某一天的作业
作业要求:当鼠标移动到雷上的时候修改窗口标题为 扫雪
预备知识
在分析一款软件的时候 必然先了解一下这款软件的功能 想要分析这款软件就要先学会使用这款软件 要对软件有一个大概的了解
笔者默认读者都是熟悉扫雷的
从开发者的角度思考问题
老师之前讲过 做逆向要从开发者的角度来思考问题
首先我们先想一下以下几个问题
如果是我们自己开发的话我们应该用什么数据结构存储雷区的数据呢
如果是我开发的话 肯定会定义一个二维数组来做为雷区并且把高度 宽度 雷数 倒计时 放到一起来存储(可能会定义为结构体)
通过相关数据来定位雷区
上面我们讲到 如果是我开发的话 肯定会定义一个二维数组来做为雷区并且把高度 宽度 雷数 倒计时 放到一起来存储(可能会定义为结构体) 那么我们可以尝试一下搜索内存法 先搜索到已知的内存所存放的地址 然后在附近通过肉眼来找雷区
打开CE 附件进程选择扫雷
我们通过雷区的高度来搜索 看图 先搜索16
然后修改一下雷区的高度 改为10
然后在搜索10 很快就赛选出来啦
我们把这个地址给它记录起来 01005338 010056A8
然后使用OD附件 进行查看 我们发现有一块数据很整齐 只有10 0F 8F 三个值
猜测 少的数值应该是雷区 多的应该是安全的 那么我们可以点击一下8F的地方 看看是不是这样的 已确认完毕 确实是这样子的(具体请看确认数据的方法)
通过Command消息定位雷区
当我们调整游戏难度的时候 游戏会重新绘制窗口 在重新绘制窗口的时候是不是会重新初始化雷区呢 这时候我们对Command消息下断点(不知道Command消息是干嘛的 请百度)
先点击Winddows窗口
右键在ClsProc上设置消息断点 选择Command消息 点击确定
这时我们调整一下游戏的难度 这时OD 的断点会命中
接着我们想一下游戏初始化的时候 会不会使用循环 由于游戏是二维数组 它肯定会用到二层循环
F8往下跟 找两层的循环 一直F8到这个地方 我们发现前面并没有循环且这是我们遇到的第一个Call 也是最后一个Call 因为jmp 01001F4A 明显是个Break 这个Call在不跟进去就Break到Switch结尾啦 所以我们F7跟进去
由于我们要找循环 那么我们就关注箭头向上指的跳转(循环只会向上跳)
F8向下走会发现两个向上跳的跳转且位置相同 明显是嵌套的关系 说明这就是我们要找的循环 接着我们继续分析一下 既然是初始化那么是不是要对二维数组进行赋值呢
那么我们找对内存地址进行赋值的指令 右键 数据窗口跟随 选择立即数
发现窗口整整齐齐的 这就是雷区
通过随机数定位雷区
根据游戏经验我们知道 雷区是随机的生成的 应该会用到随机数的函数吧 那么通过随机数的函数 可不可以定位到雷区呢
点击Executable Modules 模块窗口 点击主程序 win.exe 也就算扫雷.exe
然后右键 查找 当前模块名称 或者按快捷键 CTRL+N键 上下看一看 有没有随机数相关的
我们发现有一个C库函数Rand 那么我对Rand 右键 在每个参考上设置断点
然后点击扫雷的笑脸或者更改游戏难度 让游戏进行初始化 接着断点已命中
关键代码应该就在Rand的返回地址处 我们F8跟出函数 发现直接中奖
这个还是跟上面Command消息的位置是一样的 右键 数据窗口跟随 选择立即数即可
这就是雷区
通过鼠标消息来定位雷区
当我们鼠标点击雷区的时候 它会对雷区进行访问来判断是不是雷 先打开Windows窗口 右键点击刷新 然后对扫雷主窗口 右键在ClassProc上设置消息断点
找到 鼠标左键点击的消息 设置断点
点击雷区 这时会断下来
然后我们看堆栈 000DFCEC的地址是我们的鼠标的X Y坐标 它肯定是拿我们的X Y坐标进行进行寻址的 所以我们下硬件访问断点
右键下一个硬件访问断点 F9运行
然后断点来到这里 并把我们的坐标作为参数传进去了 所以这个Call 我们要进去看看
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-10-24 22:25
被旺仔_小可爱编辑
,原因: