我是一只小菜鸟,分享自己一点心得
以前看看雪论坛
有一些大侠关于扫雷的分析
基本上都是先分析扫雷的过程,找到雷区的矩阵,用ReadProcessMemory读取
模拟发送鼠标消息,完成自动扫雷过程
根据前人分析
能不能把扫雷PEDIY,让程序自己就有这个功能

下面来开始pediy
开始扫雷pediy
在rand()函数下断点,来到布雷区域
010036C7  |> /FF35 34530001 PUSH DWORD PTR DS:[1005334]              ;  布雷开始,雷区的宽度
010036CD  |. |E8 6E020000   CALL winmine.01003940                    ;  生成随机坐标x
010036D2  |. |FF35 38530001 PUSH DWORD PTR DS:[1005338]              ;  雷区的高度
010036D8  |. |8BF0          MOV ESI,EAX
010036DA  |. |46            INC ESI
010036DB  |. |E8 60020000   CALL winmine.01003940                    ;  生成随机坐标y
010036E0  |. |40            INC EAX
010036E1  |. |8BC8          MOV ECX,EAX
010036E3  |. |C1E1 05       SHL ECX,5
010036E6  |. |F68431 405300>TEST BYTE PTR DS:[ECX+ESI+1005340],80    ;  检验(x,y)坐标是否已经布雷
010036EE  |.^ 75 D7         JNZ SHORT winmine.010036C7
010036F0  |. |C1E0 05       SHL EAX,5
010036F3  |. |8D8430 405300>LEA EAX,DWORD PTR DS:[EAX+ESI+1005340]
010036FA  |. |8008 80       OR BYTE PTR DS:[EAX],80                  ;  在坐标(x,y)布雷
010036FD  |. |FF0D 30530001 DEC DWORD PTR DS:[1005330]
01003703  |.^\75 C2         JNZ SHORT winmine.010036C7

名称  宽  长  雷区矩阵
地址  01005334  01005338  01005340
观察扫雷前后的矩阵数据
经前人的总结分析和自己检验(看雪论坛精华9,打造扫雷终极外挂)
8F = 雷
    8E = 有雷 AND 小红旗
    0E = 无雷 AND 小红旗
已经开采了的是对应的ASCII吗,比如那个地方的数字是1,则矩阵中的数据是 0x41

很容易得到WndProc的地址,来到消息处理WM_LBUTTONUP,
WM_LBUTTONUP消息负责完成点击过程
01001FDF   > \33FF          XOR EDI,EDI                           ;  Cases 202 (WM_LBUTTONUP),205 (WM_RBUTTONUP),208 (WM_MBUTTONUP) of switch 01001F5F
01001FE1   .  393D 40510001 CMP DWORD PTR DS:[1005140],EDI
01001FE7   .  0F84 BC010000 JE winmine.010021A9
01001FED   >  893D 40510001 MOV DWORD PTR DS:[1005140],EDI
01001FF3   .  FF15 D8100001 CALL DWORD PTR DS:[<&USER32.ReleaseCa>; [ReleaseCapture
01001FF9   .  841D 00500001 TEST BYTE PTR DS:[1005000],BL
01001FFF   .  0F84 B6000000 JE winmine.010020BB
01002005   .  E8 D7170000   CALL winmine.010037E1
0100200A   .  E9 9A010000   JMP winmine.010021A9
这段是处理WM_LBUTTONUP消息


01002005   .  E8 D7170000   CALL winmine.010037E1是核心函数
进来分析
010037E1  /$  A1 18510001   MOV EAX,DWORD PTR DS:[1005118]
010037E6  |.  85C0          TEST EAX,EAX
010037E8  |.  0F8E C8000000 JLE winmine.010038B6
010037EE  |.  8B0D 1C510001 MOV ECX,DWORD PTR DS:[100511C]
010037F4  |.  85C9          TEST ECX,ECX
010037F6  |.  0F8E BA000000 JLE winmine.010038B6
010037FC  |.  3B05 34530001 CMP EAX,DWORD PTR DS:[1005334]  宽度
01003802  |.  0F8F AE000000 JG winmine.010038B6
01003808  |.  3B0D 38530001 CMP ECX,DWORD PTR DS:[1005338]  高度

经过分析,看起来猜测,01005118和0100511C处存储的是当前点击的x坐标和y坐标
经验证准确无误
至于分析就差不多了,主要是知道几个重要的地址
不然太长了

具体实现思路出来了
1.  先增加一个菜单,这个用资源黑客(ResHacker.exe)就能搞定,自动扫雷,ID号是594
  MENUITEM "自动扫雷(&A)...",  594
2.  找到菜单处理的分支,改变程序流程
01001EDC  |> \2D 11020000   SUB EAX,211                    ;  Switch (cases 211..251)
01001EE1  |.  74 36         JE SHORT winmine.01001F19
01001EE3  |.  83E8 3D       SUB EAX,3D
01001EE6  |.  74 23         JE SHORT winmine.01001F0B
01001EE8  |.  48            DEC EAX
01001EE9  |.  74 1A         JE SHORT winmine.01001F05
01001EEB  |.  48            DEC EAX
01001EEC  |.  74 11         JE SHORT winmine.01001EFF
01001EEE  |.  48            DEC EAX
01001EEF  |.  0F85 B4020000 JNZ winmine.010021A9

找到一段空白地址写代码
找到空白地址是01004A60
把01001EEF  处的代码改成JMP 01004A60
在那里写代码
3.  写代码
代码的具体流程是
I = 0
J = 0
先判断扫雷是否完成
Wihle ( I < Hight) 
{
J = 0;
Wihle( j < Width)
{
  If((i,j)处没有雷,而且没被开采)
  {  
    把(i,j)的坐标传入地址1005118,100511C
    CALL winmine.010037E1
}
}
}


这是自己添加的代码

01004A60   >^\0F84 8FD4FFFF JE winmine.01001EF5
01004A66   .  A1 A4570001   MOV EAX,DWORD PTR DS:[10057A4]     ;  自动扫雷开始; Default case of switch 01001EDC
01004A6B   .  8B1D A0570001 MOV EBX,DWORD PTR DS:[10057A0]
01004A71   .  3BC3          CMP EAX,EBX                        ;  判断扫雷是否已经完成
01004A73   .^ 0F84 42D7FFFF JE winmine.010021BB
01004A79   .  8B0D 38530001 MOV ECX,DWORD PTR DS:[1005338]     ;  雷区的高度
01004A7F   .  B8 01000000   MOV EAX,1
01004A84   >  51            PUSH ECX
01004A85   .  8B0D 34530001 MOV ECX,DWORD PTR DS:[1005334]     ;  雷区的宽度
01004A8B   .  BB 01000000   MOV EBX,1
01004A90   >  BE 40530001   MOV ESI,winmine.01005340
01004A95   .  51            PUSH ECX
01004A96   .  8BF8          MOV EDI,EAX
01004A98   .  C1E7 05       SHL EDI,5
01004A9B   .  03FB          ADD EDI,EBX
01004A9D   .  803C3E 0F     CMP BYTE PTR DS:[ESI+EDI],0F       ;  判断是否有雷
01004AA1   .  77 16         JA SHORT winmine.01004AB9
01004AA3   .  50            PUSH EAX
01004AA4   .  53            PUSH EBX
01004AA5   .  90            NOP
01004AA6   .  90            NOP
01004AA7   .  A3 1C510001   MOV DWORD PTR DS:[100511C],EAX
01004AAC   .  891D 18510001 MOV DWORD PTR DS:[1005118],EBX
01004AB2   .  E8 2AEDFFFF   CALL winmine.010037E1              ;  处理这个雷
01004AB7   .  5B            POP EBX
01004AB8   .  58            POP EAX
01004AB9   >  59            POP ECX
01004ABA   .  43            INC EBX
01004ABB   .^ E2 D3         LOOPD SHORT winmine.01004A90
01004ABD   .  40            INC EAX
01004ABE   .  59            POP ECX
01004ABF   .^ E2 C3         LOOPD SHORT winmine.01004A84
01004AC1   .^ E9 F5D6FFFF   JMP winmine.010021BB


至此PEDIY的过程结束了

上传的附件 winmine.rar