【文章标题】: 微软扫雷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,估计只有初学者感兴趣就发到这里吧。有耐心看完的说明你有时间,特别是有耐心或者是同情
心。附近中是我改好的一个,无聊时可以拿来玩玩。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课