前段时间看了这个帖子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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)