-
-
[原创]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期)