扫雷大家都知道吧,如果不知道也不要紧,下面的压缩包里带了一个。
前几天上午没事做的,写了4个函数,采用MFC开发,用普通c语言和api也可以。用的是写作弊器基本的东西,但是下面第一部分是需要好好学汇编的,我现在汇编不强,所以就只能看扫雷这样的程序呵呵,第二部分不是太麻烦,后面有代码包可以看看。
就是实现两个功能,全部标记雷,和全部点开雷,步骤如下:
一,分析扫雷程序代码
用反汇编的软件,比如OD,打开扫雷,分析其实现原理,具体过程不说了,需要学习反汇编的东西。分析结果如下:
扫雷程序在内部用一个32*26的固定二维BYTE数组保存雷数据,实际上最大只用到30*24个单元,生成雷数据后,无雷的地方标识为0x0f,有雷的地方标志为0x8f,点击后会变化。周围用一圈0x10包围,标志边界,如图所示:
0 1 2 3 4 5 6 7 8 9 10 11 31
0 10 10 10 10 10 10 10 10 10 10 10 0F
0F
1 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 10 0F
0F
2 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 10 0F
0F
3 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 10 0F
0F
4 10 0F 0F 0F 0F 0F 8F 0F 0F 8F 10 0F
0F
5 10 0F 8F 0F 0F 0F 0F 0F 0F 0F 10 0F
0F
6 10 0F 8F 0F 0F 0F 8F 0F 8F 0F 10 0F
0F
7 10 8F 0F 0F 0F 8F 0F 0F 0F 0F 10 0F
0F
8 10 0F 0F 8F 0F 0F 0F 0F 0F 0F 10 0F
0F
9 10 0F 0F 0F 0F 0F 8F 0F 0F 0F 10 0F
0F
10 10 10 10 10 10 10 10 10 10 10 10 0F
0F
11 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
0F




























23 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
0F在屏幕上显示时,每个格子像素为16*16,特别要注意的是,当左键点第一下的时候,如果恰好点到雷,扫雷程序会将此雷移动到第一个不是雷的位置,所以第一下肯定点不到雷。
当点击的时候,窗口发送鼠标消息,扫雷程序根据消息的鼠标坐标计算是点在哪个格子里,计算出行号和列号,然后执行标记或者点开的动作。
二,编程实现所需功能
有了以上的分析和地址,就可以将雷区读取出来,先要打开扫雷的句柄,然后用ReadProcessMemory来读取,上面的例子就是这样读取出来的。
还有个问题就是,数组是固定的,但是具体每次扫雷的区域大小不一样,比如说最低级是9*9,高级是16*30,判断雷区的实际长度和宽度,一种方法是从扫雷内存中读取,这就必须知道要读取的地址,另一种方法是,直接根据边界标志0x10计算,省去了找地址的麻烦。
标记雷或者点击无雷的格子也有两种方式,一种是直接发送鼠标消息,另一种也是比较麻烦方式:直接调用扫雷程序里的子函数,就是输入行号和列号的函数,这不仅需要知道子函数的地址,还要通过注入等方式实现。
在本例中全部采用的简单方式。
示例程序在下面,里面写了部分注释,一共就4个函数吧我记得。
第一部分分析程序是比较难的,好多东西要学。

注意,如果编译出现错误,请将#define UNICODE去掉,我现在喜欢用UNICODE写程序赫赫。
/Files/God4/WinMiner.rar
一天一点进步

浙公网安备 33010602011771号