【文章标题】: 微软扫雷PEDIY尝试
【文章作者】: 浮海观云
【作者邮箱】: cc_sz@163.com
【作者主页】: www.ifgoogle.com
【作者QQ号】: 250341858
【软件名称】: windows自带
【软件大小】: 120K
【下载地址】: 电脑上就有啊
【加壳方式】: 无
【保护方式】: 无
【编写语言】: VC
【使用工具】: OD,Winhex,ResHacker.exe
【操作平台】: WINDOWS
【软件介绍】: 扫雷就是电脑上那个扫雷啊
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
      扫雷程序原来就有隐藏的作弊模式(xyzzy),现在通过PEDIY来修改一下玩个新花样,功力有限只做点小改动,剪刀加糨糊
  让扫雷程序可以发声音报警。
      先用OD分析程序,找到下面几处作弊点:
      1,可以秒表停止的地方
  01002FE0  /$  833D 64510001>CMP DWORD PTR DS:[1005164],0
  01002FE7  |.  74 1E         JE SHORT winmine.01003007
  01002FE9  |.  813D 9C570001>CMP DWORD PTR DS:[100579C],3E7
  01002FF3  |.  7D 12         JGE SHORT winmine.01003007
  01002FF5      FF05 9C570001 INC DWORD PTR DS:[100579C]               ;  加1秒的地方
  01002FFB  |.  E8 B5F8FFFF   CALL winmine.010028B5
  01003000  |.  6A 01         PUSH 1
  01003002  |.  E8 E6080000   CALL winmine.010038ED
  01003007  \>  C3            RETN
  
      2,下面比较连续输入的字符是不是"XYZZY",是则计数加1,否则变0,当DWORD PTR DS:[1005154]=5时进入作弊等
  待模式,以后按下shift键可以开关作弊
  01001CBF  |.  66:8B0C45 34500001   MOV CX,WORD PTR DS:[EAX*2+1005034]                  ;  作弊码XYZZY(宽字符)
  01001CC7  |.  66:2B4D 10           SUB CX,WORD PTR SS:[EBP+10]
  01001CCB  |.  40                   INC EAX
  01001CCC  |.  66:F7D9              NEG CX
  01001CCF  |.  1BC9                 SBB ECX,ECX
  01001CD1  |.  F7D1                 NOT ECX
  01001CD3  |.  23C8                 AND ECX,EAX
  01001CD5      890D 54510001        MOV DWORD PTR DS:[1005154],ECX                      ;  当DS:[1005154] 里的值为5时,进入作弊模式
  01001CDB      E9 C9040000          JMP winmine.010021A9
  
  010020C1  |> \A1 54510001   MOV EAX,DWORD PTR DS:[1005154]           ;  作弊是否
  
  01001D40  |> \833D 54510001>CMP DWORD PTR DS:[1005154],5             ;  Case 10 of switch 01001C9D
  01001D47  |.  0F8C 5C040000 JL winmine.010021A9
  01001D4D  |.  8335 54510001>XOR DWORD PTR DS:[1005154],14            ;作弊开关
  01001D54  |.  E9 50040000   JMP winmine.010021A9
  
  01001CA0  |. /0F84 9A000000 JE winmine.01001D40                      ;  是不是按下了shif键(ASCII-16)
  
      3,原来的作弊方法是在屏幕的左上角画一个象素的黑/白点
  01002126  |.  57            PUSH EDI                                 ; /hWnd
  01002127  |.  FF15 2C110001 CALL DWORD PTR DS:[<&USER32.GetDC>]      ; \GetDC
  0100212D  |.  8B0D 18510001 MOV ECX,DWORD PTR DS:[1005118]
  01002133  |.  8BF0          MOV ESI,EAX
  01002135  |.  A1 1C510001   MOV EAX,DWORD PTR DS:[100511C]
  0100213A  |.  C1E0 05       SHL EAX,5
  0100213D  |.  8A8408 405300>MOV AL,BYTE PTR DS:[EAX+ECX+1005340]     ;0F没雷,8F有雷
  01002144  |.  24 80         AND AL,80
  01002146  |.  F6D8          NEG AL
  01002148  |.  1BC0          SBB EAX,EAX
  0100214A  |.  25 010000FF   AND EAX,FF000001
  0100214F  |.  05 FFFFFF00   ADD EAX,0FFFFFF                          ;EAX值决定画黑点还是白点
  01002154  |.  50            PUSH EAX                                 ; /Color
  01002155  |.  57            PUSH EDI                                 ; |Y
  01002156  |.  57            PUSH EDI                                 ; |X
  01002157  |.  56            PUSH ESI                                 ; |hDC
  01002158  |.  FF15 58100001 CALL DWORD PTR DS:[<&GDI32.SetPixel>]    ; \SetPixel
  0100215E  |.  56            PUSH ESI                                 ; /hDC
  0100215F  |.  57            PUSH EDI                                 ; |hWnd
  01002160  |.  FF15 28110001 CALL DWORD PTR DS:[<&USER32.ReleaseDC>]  ; \ReleaseDC
  01002166  |.  EB 41         JMP SHORT winmine_.010021A9
  
      4,看一个播放声音的地方
  010038ED  /$  833D B8560001>CMP DWORD PTR DS:[10056B8],3
  010038F4  |.  75 47         JNZ SHORT winmine.0100393D
  010038F6  |.  8B4424 04     MOV EAX,DWORD PTR SS:[ESP+4]
  010038FA  |.  48            DEC EAX                                  ;  Switch (cases 1..3)
  010038FB  |.  74 2A         JE SHORT winmine.01003927
  010038FD  |.  48            DEC EAX
  010038FE  |.  74 15         JE SHORT winmine.01003915
  01003900  |.  48            DEC EAX
  01003901  |.  75 3A         JNZ SHORT winmine.0100393D
  01003903  |.  68 05000400   PUSH 40005                               ;  Case 3 of switch 010038FA
  01003908  |.  FF35 305B0001 PUSH DWORD PTR DS:[1005B30]              ;  winmine.01000000
  0100390E  |.  68 B2010000   PUSH 1B2
  01003913  |.  EB 22         JMP SHORT winmine.01003937               ;  跳去播放炸雷声音
  01003915  |>  68 05000400   PUSH 40005                               ;  Case 2 of switch 010038FA
  0100391A  |.  FF35 305B0001 PUSH DWORD PTR DS:[1005B30]              ;  winmine.01000000
  01003920  |.  68 B1010000   PUSH 1B1
  01003925  |.  EB 10         JMP SHORT winmine.01003937               ;  播放另一种怪声
  01003927  |>  68 05000400   PUSH 40005                               ;  Case 1 of switch 010038FA
  0100392C  |.  FF35 305B0001 PUSH DWORD PTR DS:[1005B30]              ;  winmine.01000000
  01003932  |.  68 B0010000   PUSH 1B0                                 ;  秒表嘀哒声
  01003937  |>  FF15 68110001 CALL DWORD PTR DS:[<&WINMM.PlaySoundW>]  ;  WINMM.PlaySoundW
  0100393D  \>  C2 0400       RETN 4                                   ;  Default case of switch 010038FA
  
  现在来改一下功能,PEDIY一下。可以增加一下菜单命令添加作弊选项,我用reshacker
    POPUP "游戏(&G)"
  {
    MENUITEM "开局(&N)\tF2",  510
    MENUITEM SEPARATOR
    MENUITEM "初级(&B)",  521
    MENUITEM "中级(&I)",  522
    MENUITEM "高级(&E)",  523
    MENUITEM "自定义(&C)...",  524
          MENUITEM "探雷器",  525             (自己添加一项,编译保存)
    MENUITEM SEPARATOR
    MENUITEM "标记(?)(&M)",  527
    MENUITEM "颜色(&L)",  529
    MENUITEM "声音(&S)",  526
    MENUITEM SEPARATOR
    MENUITEM "扫雷英雄榜(&T)...",  528
    MENUITEM SEPARATOR
    MENUITEM "退出(&X)",  512
  }
  
  这样游戏下拉菜单中就多出了一项作弊模式“探雷器”,用OD载入修过的”winmine.exe“,在下面一行下断点
  01001DBC  |> \0FB745 10     MOVZX EAX,WORD PTR SS:[EBP+10]           ;  Case 111 (WM_COMMAND) of switch 01001D5B
  01001DC0  |.  B9 10020000   MOV ECX,210                              ;扫雷英雄榜
  01001DC5  |.  3BC1          CMP EAX,ECX
  01001DC7  |.  0F8F 0F010000 JG winmine.01001EDC
  01001DCD  |.  0F84 FF000000 JE winmine.01001ED2
  01001DD3  |.  3D FE010000   CMP EAX,1FE                              ;开局
  01001DD8  |.  0F84 EA000000 JE winmine.01001EC8
  01001DDE  |.  3BC6          CMP EAX,ESI
  01001DE0  |.  0F84 B7000000 JE winmine.01001E9D
  01001DE6  |.  3D 08020000   CMP EAX,208
  01001DEB  |.  0F8E B8030000 JLE winmine.010021A9
  01001DF1  |.  3D 0B020000   CMP EAX,20B
  01001DF6  |.  7E 61         JLE SHORT winmine.01001E59                ;初级从这里跳走
  01001DF8  |.  3D 0C020000   CMP EAX,20C
  01001DFD  |.  74 50         JE SHORT winmine.01001E4F
  01001DFF  |.  3D 0E020000   CMP EAX,20E
  01001E04  |.  74 20         JE SHORT winmine.01001E26
  01001E06  |.  3D 0F020000   CMP EAX,20F
  01001E0B  |.  0F85 98030000 JNZ winmine.010021A9
  01001E11  |.  33C0          XOR EAX,EAX
  01001E13  |.  3905 BC560001 CMP DWORD PTR DS:[10056BC],EAX
  01001E19  |.  0F94C0        SETE AL
  01001E1C  |.  A3 BC560001   MOV DWORD PTR DS:[10056BC],EAX
  01001E21  |.  E9 24010000   JMP winmine.01001F4A
  
  运行winmine.exe,打开游戏菜单,选择“扫雷器”后,程序断在“01001DBC”(自己设定的断点) ,那么EAX将被赋值为:
  020D(十进制525)。下面增加一行判断如果等于525 就打开作弊模式。看了一下在这地方加点代码也麻烦,反正玩初级的
  是不太会玩的就把初级的变成作弊模式算了。
  01001E59  |> \8B45 10       MOV EAX,DWORD PTR SS:[EBP+10]         ;初级跳到这里设置参数
  01001E5C  |.  05 F7FDFFFF   ADD EAX,-209                          ;209就是521,EAX在这里变成了0
  01001E61  |.  66:A3 A056000>MOV WORD PTR DS:[10056A0],AX
  01001E67  |.  0FB7C0        MOVZX EAX,AX
  01001E6A  |.  8D0440        LEA EAX,DWORD PTR DS:[EAX+EAX*2]
  01001E6D  |.  C1E0 02       SHL EAX,2
  01001E70  |.  8B88 10500001 MOV ECX,DWORD PTR DS:[EAX+1005010]     ;初级的是十个雷吧?
  01001E76  |.  890D A4560001 MOV DWORD PTR DS:[10056A4],ECX         ;雷数放到DS:[10056A4]
  01001E7C  |.  8B88 14500001 MOV ECX,DWORD PTR DS:[EAX+1005014]     ;9行
  01001E82  |.  8B80 18500001 MOV EAX,DWORD PTR DS:[EAX+1005018]     ;9列
  01001E88  |.  890D A8560001 MOV DWORD PTR DS:[10056A8],ECX
  01001E8E  |.  A3 AC560001   MOV DWORD PTR DS:[10056AC],EAX
  01001E93  |.  E8 E2170000   CALL winmine.0100367A
  01001E98  |.  E9 AD000000   JMP winmine.01001F4A                   ; 改为:jmp 01004a76
  
  改动方案:在程序中找一块空白处(如:01004a76),添加代码:
  
  01004A76      C705 54510001>MOV DWORD PTR DS:[1005154],5
  01004A80    ^ E9 C5D4FFFF   JMP winmine.01001F4A
  
  现在程序已经实现,打开一下初级模式就开通了作弊模式,以后我们只要按‘SHIFT’键就可以打开关闭“黑白点”提示了!
  
  接下来,改成声音报警的
  方案1,用系统的BEEP,优点是没有声卡也能听到或者说没有耳机也能听到声音?、、
  改成下面的代码,原代码看上面的第3条,优点
  0100214F  |.  05 FFFFFF00               ADD EAX,0FFFFFF                          ;  修改下面的
  01002154      85C0                      TEST EAX,EAX
  01002156      75 51                     JNZ SHORT winmine.010021A9
  01002158      05 00010000               ADD EAX,100
  0100215D      90                        NOP
  0100215E      50                        PUSH EAX
  0100215F      50                        PUSH EAX
  01002160      FF15 C411B176             CALL DWORD PTR DS:[<&KERNEL32.Beep>]     ;  kernel32.Beep
  01002166  |.  EB 41                     JMP SHORT winmine.010021A9
  01002168  |>  393D 4C510001             CMP DWORD PTR DS:[100514C],EDI
  0100216E  |.^ 0F85 EAFAFFFF             JNZ winmine.01001C5E
  
   方案2,用程序中使用的WINMM.PlaySoundW
  修改代码如下:
  
  0100213D      8A8408 40530001            MOV AL,BYTE PTR DS:[EAX+ECX+1005340]                ;  0F没雷与8F有雷
  01002144      04 71                      ADD AL,71
  01002146      85C0                       TEST EAX,EAX
  01002148      75 5F                      JNZ SHORT winmine.010021A9
  0100214A      68 05000400                PUSH 40005
  0100214F      FF35 305B0001              PUSH DWORD PTR DS:[1005B30]                         ;  winmine.01000000
  01002155      68 B2010000                PUSH 1B2
  0100215A      FF15 68110001              CALL DWORD PTR DS:[<&WINMM.PlaySoundW>]             ;  WINMM.PlaySoundW
  01002160      90                         NOP
  01002161      90                         NOP
  01002162      90                         NOP
  01002163      90                         NOP
  01002164      90                         NOP
  01002165      90                         NOP
  
  然后保存修改内容到可执行文件,用winhex修改对应的字节就行了。
  运行程序享受一下PEDIY的成果吧。爽吗?。。。。不爽?那声音是不是太烦人了,戴着声音听那爆炸声可不是种享受,换
  一下喜欢的音乐吧,哈哈。
  打开ResHacker.exe替换增加一下WAVE资源Action->add a new resource,选择自己喜欢的wav文件,资料类型为WAVE,资源
  名称为435(1B3),然后把下面的代码改一下:
  01002155      68 B2010000                PUSH 1B2    改成push 1B3 就是自己喜欢的声音啦。
  好了,先写到这吧。
  终于过了吧PEDIY的ying,估计只有初学者感兴趣就发到这里吧。有耐心看完的说明你有时间,特别是有耐心或者是同情
  心。附近中是我改好的一个,无聊时可以拿来玩玩。

上传的附件 winmine.rar