【文章标题】: windows自带扫雷添加探测器(求邀请码)
【文章作者】: TSinper
【作者邮箱】: 819895119@qq.com
【作者主页】: www.tsinper.80.hk
【作者QQ号】: 819895119
【软件名称】: winmine.exe
【软件大小】: 117K
【下载地址】: windows自带
【加壳方式】: 无壳
【保护方式】: 无
【编写语言】: C
【使用工具】: ollyDbg, ResHacker
【操作平台】: Windows
【软件介绍】: 小游戏,娱乐之用。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
第一次在论坛发帖,希望各位大牛们多多关照,,,
这次的目的是在原有扫雷的基础上增加探测器功能,对于真正的游戏玩家来说可能没多大意思,游戏要是开了挂就没那么好玩了,
不过这次纯粹是技术研究。。。。
我改的时候是这么想的,在它的.text段后面增加一个WM_**的消息处理,然后让程序执行窗口过程前跳到这里,执行探测过程,处
理完后再跳回去就行了。界面方面只需在原有菜单项中增加一项“开启探测”就行了,这个可以用ResHacker很容易做到,另外为了
使用方便,又定义了一个加速键F8作为开启探测的功能键。
最终的效果是这样的,用户在游戏过程中按下F8或者选择菜单项->帮助->开启探测器,然后将鼠标移动到需要探测的方块,如果有
雷,会听到音响发出警报声。。。关掉探测器在按下F8或选择菜单项就行。
以下是具体实现:
反复地跟踪调试发现这里是处理窗口消息的
01001BC9 . 55 push ebp ;窗口过程入口
01001BCA . 8BEC mov ebp, esp
01001BCC . 83EC 40 sub esp, 40
01001BCF . 8B55 0C mov edx, dword ptr [ebp+C]
01001BD2 . 8B4D 14 mov ecx, dword ptr [ebp+14]
01001BD5 . 53 push ebx
01001BD6 . 56 push esi
01001BD7 . 33DB xor ebx, ebx
01001BD9 . 57 push edi
01001BDA . E9 D12E0000 jmp 01004AB0 ;原指令是mov esi,200,我们让它跳到我们的功能处理部分
01001BDF > 43 inc ebx ;附加功能处理完成后将返回这里继续执行
01001BE0 . 33FF xor edi, edi
01001BE2 . 3BD6 cmp edx, esi
01001BE4 . 0F87 75030000 ja 01001F5F
这里是扫雷的设定定时器代码,我们在1003836处让它跳转,因为我们需要添加一个定时器,如果鼠标位置有雷我们要以每秒3次的
警告声提醒用户
01003817 . 43 inc ebx
01003818 . 833D A4570001>cmp dword ptr [10057A4], 0
0100381F . 75 4A jnz short 0100386B
01003821 . 833D 9C570001>cmp dword ptr [100579C], 0
01003828 . 75 41 jnz short 0100386B
0100382A . 53 push ebx
0100382B . E8 BD000000 call 010038ED
01003830 . FF05 9C570001 inc dword ptr [100579C]
01003836 . E9 20130000 jmp 01004B5B
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 [1005B24] ; |hWnd = NULL
01003849 . 891D 64510001 mov dword ptr [1005164], ebx ; |
0100384F . FF15 B4100001 call dword ptr [<&USER32.SetTimer>] ; \SetTimer
01003855 . 85C0 test eax, eax
01003857 . 75 07 jnz short 01003860
这段是当用户点击中间的笑脸重新开始游戏时的处理代码,我们需要在这里重新初始化我们的探测器。所以在01001BDA处跳转。。
01001BC9 . 55 push ebp
01001BCA . 8BEC mov ebp, esp
01001BCC . 83EC 40 sub esp, 40
01001BCF . 8B55 0C mov edx, dword ptr [ebp+C]
01001BD2 . 8B4D 14 mov ecx, dword ptr [ebp+14]
01001BD5 . 53 push ebx
01001BD6 . 56 push esi
01001BD7 . 33DB xor ebx, ebx
01001BD9 . 57 push edi
01001BDA . E9 D12E0000 jmp 01004AB0
01001BDF > 43 inc ebx
01001BE0 . 33FF xor edi, edi
01001BE2 . 3BD6 cmp edx, esi
01001BE4 . 0F87 75030000 ja 01001F5F
01001BEA . 0F84 95040000 je 01002085
01001BF0 . B8 00010000 mov eax, 100
01001BF5 . 3BD0 cmp edx, eax
01001BF7 . 0F87 5C010000 ja 01001D59
01001BFD . 0F84 97000000 je 01001C9A
01001C03 . 8BC2 mov eax, edx
01001C05 . 48 dec eax ; Switch (cases 2..47)
01001C06 . 48 dec eax
以上就是全部我们需要的插入点,下面看看我们都插入了什么样的代码。
01004A60 > \60 pushad
01004A61 . 83F8 77 cmp eax, 77 ;用户按下F8或点击菜单项开启探测器
01004A64 . 75 21 jnz short 01004A87
01004A66 . E9 29010000 jmp 01004B94
01004A6B > 83F0 01 xor eax, 1
01004A6E . A3 005D0001 mov dword ptr [1005D00], eax ;【1005D00】处存放的是探测器状态值1/0
01004A73 . C1E0 03 shl eax, 3
01004A76 . 50 push eax ; /Flags
01004A77 . 6A 77 push 77 ; |ItemId = 77 (119.)
01004A79 . FF35 945A0001 push dword ptr [1005A94] ; |hMenu = NULL
01004A7F . FF15 C0100001 call dword ptr [<&USER32.CheckMenuIte>; \CheckMenuItem
01004A85 . EB 1B jmp short 01004AA2
01004A87 > 83F8 78 cmp eax, 78 ;用户点击About菜单项,弹出破解者信息
01004A8A . 75 16 jnz short 01004AA2
01004A8C . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
01004A8E . B8 00000201 mov eax, 01020000 ; |ASCII "About the Cracker..."
01004A93 . 50 push eax ; |Title => "About the Cracker..."
01004A94 . B8 20000201 mov eax, 01020020 ; |ASCII "This program is Cracked by TSinper!",CR,LF,"QQ:819895119",CR,LF,CR,LF,"Tip:Press F8 and then move the cursor to the mine field.",CR,LF,"You will hear warning tone if a mine is there!!"
01004A99 . 50 push eax ; |Text => "This program is Cracked by TSinper!",CR,LF,"QQ:819895119",CR,LF,CR,LF,"Tip:Press F8 and then move the cursor to the mine field.",CR,LF,"You will hear warning tone if a mine is there!!"
01004A9A . 6A 00 push 0 ; |hOwner = NULL
01004A9C . FF15 5AF00101 call dword ptr [101F05A] ; \MessageBoxA
01004AA2 > 61 popad
01004AA3 . B9 10020000 mov ecx, 210
01004AA8 .^ E9 18D3FFFF jmp 01001DC5
01004AAD 00 db 00
01004AAE 00 db 00
01004AAF 00 db 00
01004AB0 > 60 pushad
01004AB1 . 81FA 00020000 cmp edx, 200
01004AB7 . 75 11 jnz short 01004ACA
01004AB9 . 833D 005D0001>cmp dword ptr [1005D00], 1 ;改变探测器状态值
01004AC0 . 75 08 jnz short 01004ACA
01004AC2 . 8B45 14 mov eax, dword ptr [ebp+14]
01004AC5 . A3 045D0001 mov dword ptr [1005D04], eax
01004ACA > 61 popad
01004ACB . BE 00020000 mov esi, 200
01004AD0 .^ E9 0AD1FFFF jmp 01001BDF
01004AD5 00 db 00
01004AD6 00 db 00
01004AD7 00 db 00
01004AD8 00 db 00
01004AD9 00 db 00
01004ADA 00 db 00
01004ADB 00 db 00
01004ADC 00 db 00
01004ADD 00 db 00
01004ADE 00 db 00
01004ADF 00 db 00
01004AE0 /. 55 push ebp
01004AE1 |. 8BEC mov ebp, esp
01004AE3 |. 83EC 40 sub esp, 40
01004AE6 |. 53 push ebx
01004AE7 |. 56 push esi
01004AE8 |. 57 push edi
01004AE9 |. 8B55 0C mov edx, dword ptr [ebp+C]
01004AEC |. 833D 085D0001>cmp dword ptr [1005D08], 1 ;【1005D08】存放另外一个探测器状态值,当用户点击笑脸时改变
01004AF3 |. 75 5B jnz short 01004B50
01004AF5 |. 833D 005D0001>cmp dword ptr [1005D00], 1
01004AFC |. 75 52 jnz short 01004B50
01004AFE |. 66:833D 045D0>cmp word ptr [1005D04], 0C ;【1005D04】存放当前鼠标Y坐标
01004B06 |. 7E 48 jle short 01004B50 ;小于0C时鼠标位置无方块
01004B08 |. 66:833D 065D0>cmp word ptr [1005D06], 37 ;【1005D06】存放当前鼠标X坐标
01004B10 |. 7E 3E jle short 01004B50 ;小于37时鼠标位置无方块
01004B12 |. 0FB705 045D00>movzx eax, word ptr [1005D04]
01004B19 |. 83E8 0C sub eax, 0C
01004B1C |. B9 10000000 mov ecx, 10
01004B21 |. 33D2 xor edx, edx
01004B23 |. F7F1 div ecx
01004B25 |. 40 inc eax
01004B26 |. 8BD8 mov ebx, eax
01004B28 |. 0FB705 065D00>movzx eax, word ptr [1005D06]
01004B2F |. 83E8 37 sub eax, 37
01004B32 |. 33D2 xor edx, edx
01004B34 |. F7F1 div ecx
01004B36 |. 66:B9 2000 mov cx, 20
01004B3A |. 66:F7E1 mul cx
01004B3D |. 03C3 add eax, ebx
01004B3F |. 80B8 60530001>cmp byte ptr [eax+1005360], 8F ;8F指示有雷
01004B46 |. 75 08 jnz short 01004B50
01004B48 |. 6A 00 push 0 ; /BeepType = MB_OK
01004B4A |. FF15 19F00101 call dword ptr [<&USER32.MessageBeep>>; \MessageBeep警报声响起了。。。。
01004B50 |> 5F pop edi
01004B51 |. 5E pop esi
01004B52 |. 5B pop ebx
01004B53 |. C9 leave
01004B54 \. C2 1000 retn 10
01004B57 00 db 00
01004B58 00 db 00
01004B59 00 db 00
01004B5A 00 db 00
01004B5B > 60 pushad
01004B5C . 90 nop
01004B5D . 90 nop
01004B5E . 90 nop
01004B5F . 90 nop
01004B60 . 90 nop
01004B61 . 90 nop
01004B62 . 90 nop
01004B63 . 90 nop
01004B64 . 90 nop
01004B65 . C705 085D0001>mov dword ptr [1005D08], 1
01004B6F . 61 popad
01004B70 . E8 40DDFFFF call 010028B5
01004B75 .^ E9 C1ECFFFF jmp 0100383B
01004B7A 00 db 00
01004B7B 00 db 00
01004B7C > 60 pushad
01004B7D . C705 085D0001>mov dword ptr [1005D08], 0
01004B87 . 61 popad
01004B88 . A1 AC560001 mov eax, dword ptr [10056AC]
01004B8D .^ E9 EDEAFFFF jmp 0100367F
01004B92 00 db 00
01004B93 00 db 00
01004B94 > 60 pushad
01004B95 . 833D 005D0001>cmp dword ptr [1005D00], 1 ;改变探测器状态
01004B9C . 74 1A je short 01004BB8
01004B9E . 68 E04A0001 push 01004AE0 ; /Timerproc = winmine.01004AE0
01004BA3 . 68 2C010000 push 12C ; |Timeout = 300. ms
01004BA8 . 6A 02 push 2 ; |TimerID = 2
01004BAA . FF35 245B0001 push dword ptr [1005B24] ; |hWnd = NULL
01004BB0 . FF15 B4100001 call dword ptr [<&USER32.SetTimer>] ; \SetTimer
01004BB6 . EB 0E jmp short 01004BC6
01004BB8 > 6A 02 push 2 ; /TimerID = 2
01004BBA . FF35 245B0001 push dword ptr [1005B24] ; |hWnd = NULL
01004BC0 . FF15 3C110001 call dword ptr [<&USER32.KillTimer>] ; \KillTimer
01004BC6 > 90 nop
01004BC7 . 90 nop
01004BC8 . 90 nop
01004BC9 . 90 nop
01004BCA . 90 nop
01004BCB . 90 nop
01004BCC . 90 nop
01004BCD . 90 nop
01004BCE . 90 nop
01004BCF . 90 nop
01004BD0 . 61 popad
01004BD1 . A1 005D0001 mov eax, dword ptr [1005D00]
01004BD6 .^ E9 90FEFFFF jmp 01004A6B
上面有些代码中间有些nop,是不断改动中造成的。
另外改动过程中发现一个扫雷的小秘密,就是用户永远也不可能在第一步就点到雷,因为原作者做了一个判断,如果第一步就点到雷,
那么这颗雷会被移动到左上角去,如果左上角已经有雷,那么顺序往后挪动,就是说你开始一个游戏,在你还没有点开一个方格之前
雷区是没有初始化完毕的,这也是为什么探测器在第一个方格揭开之后才能开始工作。。。大家用的是后注意下。。
下面附上原版和修改后的文件。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2010年10月31日 14:48:47
[课程]Linux pwn 探索篇!