首页
社区
课程
招聘
[原创]我也玩扫雷
发表于: 2011-8-1 14:24 6742

[原创]我也玩扫雷

2011-8-1 14:24
6742

前段时间看了这个帖子http://bbs.pediy.com/showthread.php?t=136362
忽然发先,原来高手都是这么玩扫雷的。不过CE什么的都不怎么用,以至于都不会用 so....还是哪OD自己跟吧。
这篇文章的思路就是,首先提出自己想要跟踪什么代码,然后使用OD定位到要跟踪的代码,至于代码分析,请大家参考本文开头提到的帖子。

1。寻找棋盘初始化函数。
邓韬同学的文章的开头提到一个图,但是我实在是木有找到那个图在哪。。。。
定位棋盘初始化,我的思路是,先找到一处对棋盘的操作,然后下内存写断点。按照前辈们的理论:程序 = 数据结构 + 对数据结构的操作。那么我推测棋盘最有可能的存储方式是一个数组。然后结合寻址方式,基址变址寻址,也就是应该长得类似这个样子[xxxx + yyy*dd]类似这种形式的mov或lea指令都是需要注意的。
好了,思路简单说明完毕,现在开搞。
OD load扫雷,f9,按快捷工具栏的W那个图标,找到窗口的消息处理函数,双击定位到消息处理函数,shift + f2下条件断,条件为[esp + 0x08] == 0x201,也就是wm_lbuttondown消息。为了保险,你也可以断buttonup消息,这个大家看自己喜好。
切换会扫雷,随便点一个格子,od断下,这时在cpu窗口中右键,RUN跟踪,添加函数过程中的分支。OK,f9让程序自己跑去吧。等OD提示当前状态为运行的时候,再次在cpu窗口中点右键,run跟中,当前模块统计。这里我们只看调用次数为1的代码片段。

01001FA6  |> \393D 48510001 cmp dword ptr ds:[1005148],edi                ;  Case 201 (WM_LBUTTONDOWN) of switch 01001F5F
01001FAC  |.^ 75 D6         jnz short winmine.01001F84
01001FAE  |.  FF75 14       push [arg.4]
01001FB1  |.  E8 56F4FFFF   call winmine.0100140C
01001FB6  |.  85C0          test eax,eax
01001FB8  |.^ 0F85 A0FCFFFF jnz winmine.01001C5E
01001FBE  |.  841D 00500001 test byte ptr ds:[1005000],bl
01001FC4  |.  0F84 DF010000 je winmine.010021A9
01001FCA  |.  8B45 10       mov eax,[arg.3]
01001FCD  |.  24 06         and al,6
01001FCF  |.  F6D8          neg al
01001FD1  |.  1BC0          sbb eax,eax
01001FD3  |.  F7D8          neg eax
01001FD5  |.  A3 44510001   mov dword ptr ds:[1005144],eax
01001FDA  |.  E9 80000000   jmp winmine.0100205F
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.ReleaseCapture>]  ; [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

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]
0100380E  |.  0F8F A2000000 jg winmine.010038B6
01003814  |.  53            push ebx
01003815  |.  33DB          xor ebx,ebx
01003817  |.  43            inc ebx
01003818  |.  833D A4570001>cmp dword ptr ds:[10057A4],0
0100381F  |.  75 4A         jnz short winmine.0100386B
01003821  |.  833D 9C570001>cmp dword ptr ds:[100579C],0
01003828  |.  75 41         jnz short winmine.0100386B
0100382A  |.  53            push ebx
0100382B  |.  E8 BD000000   call winmine.010038ED
01003830  |.  FF05 9C570001 inc dword ptr ds:[100579C]
01003836  |.  E8 7AF0FFFF   call winmine.010028B5
0100383B  |.  6A 00         push 0                                        ; /Timerproc = NULL
0100383D  |.  68 E8030000   push 3E8                                      ; |Timeout = 1000. ms
01003842  |.  53            push ebx                                      ; |TimerID
01003843  |.  FF35 245B0001 push dword ptr ds:[1005B24]                   ; |hWnd = 00050134 ('扫雷',class='扫雷')
01003849  |.  891D 64510001 mov dword ptr ds:[1005164],ebx                ; |
0100384F  |.  FF15 B4100001 call dword ptr ds:[<&USER32.SetTimer>]        ; \SetTimer
01003855  |.  85C0          test eax,eax
01003857  |.  75 07         jnz short winmine.01003860
01003859  |.  6A 04         push 4
0100385B  |.  E8 F0000000   call winmine.01003950
01003860  |>  A1 18510001   mov eax,dword ptr ds:[1005118]
01003865  |.  8B0D 1C510001 mov ecx,dword ptr ds:[100511C]
0100386B  |>  841D 00500001 test byte ptr ds:[1005000],bl
01003871  |.  5B            pop ebx
01003872  |.  75 10         jnz short winmine.01003884
01003874  |.  6A FE         push -2
01003876  |.  59            pop ecx
01003877  |.  8BC1          mov eax,ecx
01003879  |.  890D 1C510001 mov dword ptr ds:[100511C],ecx
0100387F  |.  A3 18510001   mov dword ptr ds:[1005118],eax
01003884  |>  833D 44510001>cmp dword ptr ds:[1005144],0
0100388B  |.  74 09         je short winmine.01003896
0100388D  |.  51            push ecx
0100388E  |.  50            push eax
0100388F  |.  E8 23FDFFFF   call winmine.010035B7
01003894  |.  EB 20         jmp short winmine.010038B6
01003896  |>  8BD1          mov edx,ecx
01003898  |.  C1E2 05       shl edx,5
0100389B  |.  8A9402 405300>mov dl,byte ptr ds:[edx+eax+1005340]
010038A2  |.  F6C2 40       test dl,40
010038A5  |.  75 0F         jnz short winmine.010038B6
010038A7  |.  80E2 1F       and dl,1F
010038AA  |.  80FA 0E       cmp dl,0E
010038AD  |.  74 07         je short winmine.010038B6
010038AF  |.  51            push ecx
010038B0  |.  50            push eax
010038B1  |.  E8 5CFCFFFF   call winmine.01003512
010038B6  |>  FF35 60510001 push dword ptr ds:[1005160]
010038BC  |.  E8 52F0FFFF   call winmine.01002913
010038C1  \.  C3            retn


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
硬是没看懂。。。。。
2011-8-1 16:53
0
雪    币: 93
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
写3个原创也是YJ帖
2011-8-1 19:57
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
至于你信不信上面是初始化代码片段,反正我是信了
2011-8-1 23:18
0
雪    币: 152
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
至于你看懂or不懂,反正我懂了
2011-8-2 23:42
0
雪    币: 713
活跃值: (480)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不懂哦。。。
2011-8-4 12:27
0
游客
登录 | 注册 方可回帖
返回
//