首页
社区
课程
招聘
[原创]window扫雷的PEDIY
发表于: 2009-5-1 13:54 13054

[原创]window扫雷的PEDIY

2009-5-1 13:54
13054

我是一只小菜鸟,分享自己一点心得
以前看看雪论坛
有一些大侠关于扫雷的分析
基本上都是先分析扫雷的过程,找到雷区的矩阵,用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的过程结束了


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (30)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
2
下载回来玩一下
2009-5-1 14:52
0
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不想投机取巧,一直用原版
2009-5-2 11:15
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
玩肯定是玩原版的,研究就不同嘛
2009-5-2 15:22
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这样玩才有意思,大哥好有想法哈
2009-5-2 15:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
做游戏外挂挺好的.
2009-5-2 23:30
0
雪    币: 336
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
发现一个问题
有插红旗的时候不能解决的时候不能解决
上传的附件:
2009-5-3 15:39
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主很强大,学习下
2009-5-3 17:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵楼主的确很强呀,我要学习一下。
2009-5-3 18:51
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
哈哈 我创纪录了!
2009-5-3 19:35
0
雪    币: 339
活跃值: (10)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
11
顶一个,牛啊
2009-5-3 20:43
0
雪    币: 339
活跃值: (10)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
12
终于知道那些记录是怎么破的了
2009-5-3 20:44
0
雪    币: 336
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
针对那个问题
做了一下修改
2009-5-4 17:39
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
解析的不错  要好好研究下
2009-5-4 17:46
0
雪    币: 336
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
15
对那个问题稍作修改稍作修改
上传的附件:
2009-5-4 17:48
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
早有这种想法但是……
现在有实现的了
谢了!
2009-5-5 07:54
0
雪    币: 427
活跃值: (65)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
学习了
2009-5-5 08:35
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
下来试试,呵呵
2009-5-5 11:27
0
雪    币: 413
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
只能说你太强了,做外挂应该可以。
2009-5-5 14:28
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
下载看看,楼主太强了!~
2009-5-5 16:36
0
雪    币: 217
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这贴要标记,回去好好学习一下!
2009-5-6 09:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
楼主厉害!顶一个~~~
2009-5-6 11:36
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
好想法,精神值得鼓励
2009-5-6 16:32
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢了,,满有意思
2009-5-6 18:47
0
雪    币: 0
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
很好很强大。
2009-5-7 10:42
0
游客
登录 | 注册 方可回帖
返回
//