上帝保佑 - God4

God Bless

  :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

  扫雷大家都知道吧,如果不知道也不要紧,下面的压缩包里带了一个。

  前几天上午没事做的,写了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

posted on 2008-06-26 21:44  God4  阅读(3353)  评论(0)    收藏  举报