首页
社区
课程
招聘
[旧帖] windows自带扫雷添加探测器(求邀请码) 0.00雪花
发表于: 2010-10-31 14:54 1816

[旧帖] windows自带扫雷添加探测器(求邀请码) 0.00雪花

2010-10-31 14:54
1816
【文章标题】: 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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
有用吗,有什么用呢?
2010-10-31 16:07
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错~~~~~~~~~~~~
2010-10-31 16:32
0
雪    币: 258
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
学习了,谢谢分享~!
2010-11-1 00:10
0
游客
登录 | 注册 方可回帖
返回
//