需要hook掉回调函数,响应WM_MOUSEMOVE
消息
怎么判断鼠标所在的位置是不是有雷?
有了思路之后,进行具体的实现
找界面的区域大小和雷的数量的数据应该是最好找的
查看是否有重定位(如果有就关掉),上CE
然后找宽度的基址
同样的经过几次尝试之后,发现
这两个地址就该就是跟宽度相关的地址
找雷数的基址
步骤一样
但是这里发现了3条数据,上面都是2条,有点不符合规律,所有就测试一下,到底这3个地址是不是全部都跟地雷数量有关(暂且按下不表,具体中od去看到底哪个才是)
根据地址的连续性,稍微整理了一下
找初始化地图数据的地址
找到了地雷和区域大小的基址,那么只要找到更改这个对区域进行更改的函数,猜想应该可以找到布雷的方法和各种雷等数据的判断类型
关键是如何找到这个函数,首先要想明白的一件事是,游戏对初始化的时候,肯定是会对数据进行调用的,那么是不是可以通过游戏初始化的时候,访问或者更改这里面的代码从而找到调用的地址,试一下把
通过故意还原游戏,从而找到了一访问某个数据的地址,或得这个地址的 数据为
01003712
这个时候,上od去看一下,是不是跟我们猜想的一样
通过od可以看到上面的代码,验证是不是真的,下个断点还原下场景,看看是不是回断下来
结果是断下来,说明这个地方很可能就是对界面进行初始化的函数,先来大致的分析一下这个函数到底做了什么
第一遍大体流程分析
接下来对几个关键函数进行分析,比如产生随机雷之前有个有很多循环的函数,估计事初始化界面数组的函数,进去分析一下
通过分析可以看出,这个函数只是对空地和边界进行填充
通过上述的分析,大体知道了初始化雷区的的公式
划重点:
数组基址+0x20 +esi(高度*32),如果这个位置的opcode是0x8f,说明是雷,0xf说明是空地
然后去看一下内存图
从内存图可以看出,是每隔一行进行填充 ,因此可以总结数组的遍历公式
具体的某个x,y坐标下的值= 数组基址+ 高<<5(也就是+32,每隔一行进行填充)+x
而且通过填充的时候add eax ,2 等类似的消息可以看出,边界应该是0,内容是从1开始的,循环的时候要注意
现在去分析一下窗口回调函数(主要是找怎么把鼠标按下的点转换成数组下标的方法)
祭出 大微软的 spy ++
od直接定位到这个回调函数的位置
主要是想看看怎么把鼠标点击的屏幕坐标转换成数组下标的
定位之后发现 代码真长,可能超过300行了QAQ
只贴上回调函数的图了,其实还分析了很多的函数来掌握流程
通过
这几行的汇编代码可以看出,再LBUTTONDOWN消息中,通过lParam的高低分分别获得y,x轴坐标
然后通过公式转换为具体的数组下标,转换方式如下
地图填充的公式和屏幕坐标转换为数组下标的方式已经找到了,
总结一下找到的数据
数组基地址:0x1005340
高度基地址:0x10056A8
宽度基地址: 0x10056AC
地雷数基地址: 0x10056A4
查找具体某个数组下标中内容的公式:数组基址+ 高<<5(也就是+32,每隔一行进行填充)+宽
坐标与数组下标转换方法在上面
开写
MFC dll 静态编译
dll 注入代码就不贴了
看一下效果图 :标题栏显示坐标并提示有无雷,F5 一键扫雷
最后:迷之logo
//不知道图床正常加载了没
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课