扫雷小游戏的相关简单分析
掃雷小遊戲的相關簡單分析By: Sound
前言: 好无聊啊,这个时间依然毫无困意。对网络游戏无爱的我,玩了会蜘蛛纸牌、扫雷 然后论坛版块查查违规,解决下求助问题。打发打发时间。
咦、这里提到了扫雷。 并且10个地雷 Beginner的已经满足不了我啦,去尝试下了下Exprt 99个地雷、唔,完蛋了。竟然被系统虐了,完全不能忍的我,又不屑于使用外挂。
于是 突然想把扫雷当做一个Crack Me 玩, 既然你不让我寻找地雷存在哪里、我就让你地雷显示出来,偶尔作下弊也是可以的嘛, (尤其是自己动手作弊)
-------------------------------------------------【正文】-------------------------------------------------
使用的工具只有OllyDbg 而已。 OllyDbg1.10.Modified 1.1.By.Sound
http://release.crack4r.cc/%5BR.E.T%5DTools/OllyDbg1.10.Modified1.1.By.Sound.7z
Run 后发现 默认的是 Beginner 显示10个地雷,
OllyDbg 载入 winmine.exe
Module Entry Point(模块入口点) EIP = 01003E21
01003E21 > $6A 70 PUSH 0x70
01003E23 .68 90130001 PUSH 01001390
01003E28 .E8 DF010000 CALL 0100400C01003E2D .33DB XOR EBX, EBX
01003E2F .53 PUSH EBX ; /pModule => NULL
01003E30 .8B3D 8C100001 MOV EDI, DWORD PTR DS:[<&KERNEL32.Ge>; |kernel32.GetModuleHandleA
01003E36 .FFD7 CALL EDI ; \GetModuleHandleA
01003E38 .66:8138 4D5ACMP WORD PTR DS:, 0x5A4D
01003E3D .75 1F JNZ SHORT 01003E5E
01003E3F .8B48 3C MOV ECX, DWORD PTR DS:
01003E42 .03C8 ADD ECX, EAX
01003E44 .8139 50450000 CMP DWORD PTR DS:, 0x4550
01003E4A .75 12 JNZ SHORT 01003E5E
01003E4C .0FB741 18 MOVZX EAX, WORD PTR DS:
01003E50 .3D 0B010000 CMP EAX, 0x10B
01003E55 .74 1F JE SHORT 01003E76
01003E57 .3D 0B020000 CMP EAX, 0x20B
01003E5C .74 05 JE SHORT 01003E63
01003E5E >895D E4 MOV DWORD PTR SS:, EBX
01003E61 .EB 27 JMP SHORT 01003E8A
Microsoft Visual C++ 7.x 入口点 既然是 Vc 7的程序
反汇编窗口 右键 Search For >> All intermodular calls查看所有模块间的函数调用。
寻找 Destination 为 msvcrt 模块的函数
Address Disassembly Destination
01003E21 PUSH 0x70 (Initial CPU selection)
01001C45 CALL DWORD PTR DS:[<&USER32.BeginPainuser32.BeginPaint
01003ABE CALL DWORD PTR DS:[<&msvcrt.srand>] msvcrt.srand
01003FA6 CALL DWORD PTR DS:[<&msvcrt._cexit>] msvcrt._cexit
01003FD5 CALL DWORD PTR DS:[<&msvcrt._c_exit>]msvcrt._c_exit
01003FA0 CALL DWORD PTR DS:[<&msvcrt.exit>] msvcrt.exit
01003FCF CALL DWORD PTR DS:[<&msvcrt._exit>] msvcrt._exit
01003EF4 CALL <JMP.&msvcrt._initterm> msvcrt._initterm
01003F2A CALL <JMP.&msvcrt._initterm> msvcrt._initterm
01003EB2 CALL DWORD PTR DS:[<&msvcrt.__p__commmsvcrt.__p__commode
01003EA4 CALL DWORD PTR DS:[<&msvcrt.__p__fmodmsvcrt.__p__fmode
01003940 CALL DWORD PTR DS:[<&msvcrt.rand>] msvcrt.rand
01003EDE CALL DWORD PTR DS:[<&msvcrt.__setusermsvcrt.__setusermatherr
01003E8F CALL DWORD PTR DS:[<&msvcrt.__set_appmsvcrt.__set_app_type
01003FBA CALL <JMP.&msvcrt._XcptFilter> msvcrt._XcptFilter
看到rand 与 srand
rand()函数是产生随机数的一个随机函数。
srand函数是随机数发生器的初始化函数。
srand和rand()配合使用产生伪随机数序列
玩过扫雷的都知道,每次的地雷存放位置都是不同的。那么我们就明确的知道了 扫雷这个小游戏其自身采用了srand与rand函数
Ollydbg Ctrl+G(Enter Expression to follow) 输入 Srand
77C371BC 8BFF MOV EDI, EDI
77C371BE 55 PUSH EBP
77C371BF 8BEC MOV EBP, ESP
77C371C1 E8 652D0000 CALL 77C39F2B
77C371C6 8B4D 08 MOV ECX, DWORD PTR SS:
77C371C9 8948 14 MOV DWORD PTR DS:, ECX
77C371CC 5D POP EBP
77C371CD C3 RETN
int3断点设置address =77C371CD
Ollydbg 执行Run(f9) 操作Eip位于
77C371CD C3 RETN
0007FEA8 01003AC4RETURN to winmine.01003AC4 from msvcrt.srand
0007FEAC 0000CED8
0007FEB0 7C80B741kernel32.GetModuleHandleA
0007FEB4 0010234D
0007FEB8/0007FF1C
0007FEBC|7C802015RETURN to kernel32.7C802015 from kernel32.7C802511
0007FEC0|01002206RETURN to winmine.01002206 from winmine.01003AB0
0007FEC4|7C80B741kernel32.GetModuleHandleA
堆栈窗口进行 Follow In Disassembler(Enter)回溯操作。返回到程序领空。
01003AB0 $51 PUSH ECX
01003AB1 .55 PUSH EBP
01003AB2 .56 PUSH ESI
01003AB3 .57 PUSH EDI
01003AB4 .FF15 84100001 CALL DWORD PTR DS:[<&KERNEL32.GetTickC>; [GetTickCount
01003ABA .0FB7C0 MOVZX EAX, AX
01003ABD .50 PUSH EAX ; /seed
01003ABE .FF15 AC110001 CALL DWORD PTR DS:[<&msvcrt.srand>] ; \srand
01003AC4 .59 POP ECX
01003AC5 .6A 20 PUSH 0x20
01003AC7 .33ED XOR EBP, EBP
01003AC9 .68 A05A0001 PUSH 01005AA0
01003ACE .45 INC EBP
01003ACF .55 PUSH EBP
01003AD0 .E8 12FFFFFF CALL 010039E7
01003AD5 .6A 20 PUSH 0x20
01003AD7 .68 E05A0001 PUSH 01005AE0
01003ADC .6A 07 PUSH 0x7
01003ADE .E8 04FFFFFF CALL 010039E7
01003AE3 .6A 20 PUSH 0x20
01003AE5 .68 405B0001 PUSH 01005B40
01003AEA .6A 08 PUSH 0x8
01003AEC .E8 F6FEFFFF CALL 010039E7
01003ABD .50 PUSH EAX ; /seed
01003ABE .FF15 AC110001 CALL DWORD PTR DS:[<&msvcrt.srand>] ; \srand
01003AC9 .68 A05A0001 PUSH 01005AA0
01003ABD 处 已经置随机种子
01003ABE 处 随机函数初始化
01003AC9 处 压入一个Unicode字串。
01003AC4 设置Int3断点
Ollydbg 执行 Run 操作 Eip 位于 01003AC4
01003AC4 .59 POP ECX
01003AC5 .6A 20 PUSH 0x20
01003AC7 .33ED XOR EBP, EBP
01003AC9 .68 A05A0001 PUSH 01005AA0
01003ACE .45 INC EBP
01003ACF .55 PUSH EBP
01003AD0 .E8 12FFFFFF CALL 010039E7
01003AD5 .6A 20 PUSH 0x20
Ollydbg 执行 Set Over(F8)操作到
01003AD0 .E8 12FFFFFF CALL 010039E7
Follow( 跟随 )E8 12FFFFFF CALL 010039E7
010039E7/$FF7424 0C PUSH DWORD PTR SS: ; /Count
010039EB|.0FB74424 08 MOVZX EAX, WORD PTR SS: ; |
010039F0|.FF7424 0C PUSH DWORD PTR SS: ; |Buffer
010039F4|.50 PUSH EAX ; |RsrcID
010039F5|.FF35 305B0001 PUSH DWORD PTR DS: ; |hInst = 01000000
010039FB|.FF15 D0100001 CALL DWORD PTR DS:[<&USER32.LoadString>; \LoadStringW
01003A01|.85C0 TEST EAX, EAX
01003A03|.75 0A JNZ SHORT 01003A0F
01003A05|.68 E9030000 PUSH 0x3E9 ; /Arg1 = 000003E9
01003A0A|.E8 41FFFFFF CALL 01003950 ; \winmine.01003950
01003A0F\>C2 0C00 RETN 0xC
清晰的看到几个参数。
F8 步过之后
01003AC9 .68 A05A0001 PUSH 01005AA0 ;UNICODE "Minesweeper"
01003AC9 处 压入标题Unicode 字串
Srand 随机数已经初始完毕。 时机有点晚了。。
找到Srand执行 相对虚拟地址的 断首
01003AB0 $51 PUSH ECX ;kernel32.7C802015
01003AB1 .55 PUSH EBP
01003AB2 .56 PUSH ESI
01003AB3 .57 PUSH EDI
鼠标选中 01003AB0
信息窗口显示 Local call from 01002201
或者执行Ollydbg 操作 Ctrl+R
Follow(跟随 )
010021F0/$55 PUSH EBP
010021F1|.8BEC MOV EBP, ESP
010021F3|.83EC 4C SUB ESP, 0x4C
010021F6|.8B45 08 MOV EAX, DWORD PTR SS:
010021F9|.53 PUSH EBX
010021FA|.56 PUSH ESI
010021FB|.57 PUSH EDI
010021FC|.A3 305B0001 MOV DWORD PTR DS:, EAX
01002201|.E8 AA180000 CALL 01003AB0
清除之前的所有Int3断点 新建立Int3断点位于 010021F0
Ctrl+F2 重新载入 Run
执行Set Over(F8)操作
01002235|.FF15 1C100001 CALL DWORD PTR DS:[<&COMCTL32.InitComm>; \InitCommonControlsEx
0100223B|.6A 64 PUSH 0x64 ; /RsrcName = 100.
0100223D|.FF35 305B0001 PUSH DWORD PTR DS: ; |hInst = 01000000
01002243|.FF15 AC100001 CALL DWORD PTR DS:[<&USER32.LoadIconW>>; \LoadIconW
应用程序可视化.创建窗口需要用到InitCommonControlsEx 其次载入图标
0100224F|.68 007F0000 PUSH 0x7F00 ; /RsrcName = IDC_ARROW
01002254|.57 PUSH EDI ; |hInst
01002255|.A3 285B0001 MOV DWORD PTR DS:, EAX ; |
0100225A|.897D B4 MOV DWORD PTR SS:, EDI ; |
0100225D|.C745 B8 C91B0>MOV DWORD PTR SS:, 01001BC9 ; |
01002264|.897D BC MOV DWORD PTR SS:, EDI ; |
01002267|.897D C0 MOV DWORD PTR SS:, EDI ; |
0100226A|.894D C4 MOV DWORD PTR SS:, ECX ; |
0100226D|.8945 C8 MOV DWORD PTR SS:, EAX ; |
0100225D|.C745 B8 C91B0>MOV DWORD PTR SS:, 01001BC9
跟随 01001BC9一直F8 看到
01001FED|> /893D 40510001 MOV DWORD PTR DS:, EDI
01001FF3|. |FF15 D8100001 CALL DWORD PTR DS:[<&USER32.ReleaseCapture>] ; [ReleaseCapture
01001FF9|. |841D 00500001 TEST BYTE PTR DS:, BL
01001FFF|. |0F84 B6000000 JE 010020BB
01001FF3 有捕获按键状态。。
取消所有断点设置断点01001FF3
Run
01001FFF|. /0F84 B6000000 JE 010020BB
01002005|. |E8 D7170000 CALL 010037E1
跟随E8 D7170000 CALL 010037E1
01003872|. /75 10 JNZ SHORT 01003884
01003874|. |6A FE PUSH -0x2
01003876|. |59 POP ECX
01003877|. |8BC1 MOV EAX, ECX
01003879|. |890D 1C510001 MOV DWORD PTR DS:, ECX
0100387F|. |A3 18510001 MOV DWORD PTR DS:, EAX
01003884|> \833D 44510001 00 CMP DWORD PTR DS:, 0x0
0100388B|.74 09 JE SHORT 01003896
0100388D|.51 PUSH ECX
0100388E|.50 PUSH EAX
0100388F|.E8 23FDFFFF CALL 010035B7
01003894|.EB 20 JMP SHORT 010038B6
01003896|>8BD1 MOV EDX, ECX
01003898|.C1E2 05 SHL EDX, 0x5
0100389B|.8A9402 40530001MOV DL, BYTE PTR DS:
数据窗口跟随
有个常量 0x1005340
0100389B
0100534010 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
0100535010 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
0100536010 41 0F 0F 0F 0F 8F 0F 8F 0F 0F 8F 0F 8F 8F 0FA?????
010053700F 0F 0F 8F 0F 0F 8F 0F 8F 0F 0F 0F 0F 0F 8F 10????
0100538010 8F 0F 0F 0F 0F 0F 0F 0F 8F 0F 0F 8F 0F 0F 0F???
010053900F 8F 0F 0F 8F 0F 0F 0F 8F 0F 0F 0F 0F 0F 0F 10???
010053A010 0F 0F 0F 0F 8F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F?
010053B00F 8F 8F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 10??
010053C010 8F 8F 0F 0F 8F 0F 0F 0F 8F 8F 0F 0F 0F 0F 41?????A
010053D041 42 42 42 0F 8F 8F 8F 0F 0F 8F 0F 0F 0F 0F 10ABBB????
010053E010 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 8F 41?A
010053F040 40 40 42 8F 0F 0F 0F 8F 0F 0F 0F 8F 0F 0F 10@@@B???
0100540010 0F 0F 8F 0F 0F 0F 0F 0F 0F 8F 8F 42 41 41 41???BAAA
0100541040 40 40 43 8F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 10@@@C?
0100542010 8F 0F 8F 0F 0F 8F 0F 0F 8F 0F 8F 42 40 40 40?????B@@@
0100543040 40 40 42 8F 0F 0F 0F 8F 0F 0F 0F 0F 0F 0F 10@@@B??
0100544010 0F 0F 8F 8F 0F 0F 8F 0F 0F 0F 42 41 40 40 41???BA@@A
0100545041 41 40 41 42 8F 0F 8F 0F 0F 0F 0F 0F 0F 0F 10AA@AB??
0100546010 0F 0F 0F 0F 0F 0F 0F 0F 0F 8F 41 40 40 40 42?A@@@B
010054708F 42 40 40 41 0F 8F 8F 8F 0F 0F 0F 8F 0F 0F 10?B@@A????
0100548010 0F 0F 0F 8F 8F 8F 0F 0F 0F 0F 42 40 40 40 42???B@@@B
010054908F 43 41 41 41 0F 43 43 42 42 8F 8F 0F 0F 0F 10?CAAACCBB??
010054A010 0F 0F 0F 0F 8F 8F 0F 0F 8F 8F 42 41 40 40 41????BA@@A
010054B00F 0F 8F 0F 0F 8F 41 40 40 41 42 42 41 42 8F 10??A@@ABBAB?
010054C010 0F 0F 0F 0F 0F 0F 8F 0F 8F 0F 8F 42 41 40 41???BA@A
010054D00F 0F 8F 0F 0F 0F 42 41 40 40 40 40 40 42 8F 10?BA@@@@@B?
010054E010 0F 0F 0F 0F 0F 0F 0F 0F 8F 0F 0F 8F 41 40 42??A@B
010054F08F 0F 8F 0F 8F 0F 8F 42 41 40 41 41 42 42 0F 10????BA@AABB
发现为已经点击后 扫雷的数据
0100388B处修改指令 不实现转移
跟进 010035B7 人品太好了 地雷一直不炸 为了方便地雷爆炸 我设置了自定义 最高 一共667个地雷。
010035D8|. /0F84 8C000000 JE 0100366A
010035DE|. |57 PUSH EDI
010035DF|. |56 PUSH ESI
修改 010035D8 不实现转移
来到
01003659|.3B05 A0570001 CMP EAX, DWORD PTR DS:
0100365F|.75 12 JNZ SHORT 01003673
01003661|.6A 01 PUSH 0x1
01003663|>E8 14FEFFFF CALL 0100347C
跟随E8 14FEFFFF CALL 0100347C
0100349E|.85F6 TEST ESI, ESI
010034A0|.0F95C0 SETNE AL
010034A3|.8D0485 0A000000LEA EAX, DWORD PTR DS:
010034AA|.50 PUSH EAX
010034AB|.E8 D0FAFFFF CALL 01002F80
步过 010034AB压入了一个参数0A
而 01005340 为地雷部署的数据 8F显示的都是地雷。
同时经过调试发现。根据所点击的值 每次程序都会执行到01002F80 并且重新运行初始地雷游戏的状态。
Ctrl+F2 重新载入 Run继续F8来到这里
01002148|.1BC0 SBB EAX, EAX
0100214A|.25 010000FF AND EAX, 0xFF000001
0100214F|.05 FFFFFF00 ADD EAX, 0xFFFFFF
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 010021A9
01002168|>393D 4C510001 CMP DWORD PTR DS:, EDI
0100216E|.^ 0F85 EAFAFFFF JNZ 01001C5E
01002174|.8B45 14 MOV EAX, DWORD PTR SS:
01002177|.C1E8 10 SHR EAX, 0x10
0100217A|.83E8 27 SUB EAX, 0x27
0100217D|.C1F8 04 SAR EAX, 0x4
无限循环在随机坐标
01002185|.83C0 04 ADD EAX, 0x4
01002188|.C1F8 04 SAR EAX, 0x4
0100218B|.50 PUSH EAX
0100218C|.E8 BE150000 CALL 0100374F
01002191|.^ E9 C8FAFFFF JMP 01001C5E
0100218C 设置Int3断点
01002270|.FF15 BC100001 CALL DWORD PTR DS:[<&USER32.LoadCursor>; \LoadCursorW
01002276|.53 PUSH EBX ; /ObjType
01002277|.8945 CC MOV DWORD PTR SS:, EAX ; |
0100227A|.FF15 60100001 CALL DWORD PTR DS:[<&GDI32.GetStockObj>; \GetStockObject
01002280|.8945 D0 MOV DWORD PTR SS:, EAX
载入光标资源检索句柄
01002292|.FF15 CC100001 CALL DWORD PTR DS:[<&USER32.RegisterCl>; \RegisterClassW
01002298|.66:85C0 TEST AX, AX
0100229B|.0F84 9A000000 JE 0100233B
010022A1|.68 F4010000 PUSH 0x1F4 ; /RsrcName = 0x1F4
010022A6|.FF35 305B0001 PUSH DWORD PTR DS: ; |hInst = 01000000
010022AC|.FF15 D4100001 CALL DWORD PTR DS:[<&USER32.LoadMenuW>>; \LoadMenuW
010022B2|.68 F5010000 PUSH 0x1F5 ; /TableName = 0x1F5
010022B7|.FF35 305B0001 PUSH DWORD PTR DS: ; |hInst = 01000000
010022BD|.A3 945A0001 MOV DWORD PTR DS:, EAX ; |
010022C2|.FF15 60110001 CALL DWORD PTR DS:[<&USER32.LoadAccele>; \LoadAcceleratorsW
RegisterClassW 注册后用于调用CreateWindow (创建窗口),其次加载菜单资源。调入键表。
010022E1|.57 PUSH EDI ; /lParam = NULL
010022E2|.FF35 305B0001 PUSH DWORD PTR DS: ; |hInst = 01000000
010022E8|.03C8 ADD ECX, EAX ; |
010022EA|.57 PUSH EDI ; |hMenu
010022EB|.57 PUSH EDI ; |hParent
010022EC|.51 PUSH ECX ; |Height
010022ED|.8B0D 905A0001 MOV ECX, DWORD PTR DS: ; |
010022F3|.03D1 ADD EDX, ECX ; |
010022F5|.52 PUSH EDX ; |Width
010022F6|.8B15 B4560001 MOV EDX, DWORD PTR DS: ; |
010022FC|.2BD0 SUB EDX, EAX ; |
010022FE|.A1 B0560001 MOV EAX, DWORD PTR DS: ; |
01002303|.52 PUSH EDX ; |Y
01002304|.2BC1 SUB EAX, ECX ; |
01002306|.50 PUSH EAX ; |X
01002307|.68 0000CA00 PUSH 0xCA0000 ; |Style = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_SYSMENU|WS_CAPTION
0100230C|.56 PUSH ESI ; |WindowName
0100230D|.56 PUSH ESI ; |Class
0100230E|.57 PUSH EDI ; |ExtStyle
0100230F|.FF15 5C110001 CALL DWORD PTR DS:[<&USER32.CreateWind>; \CreateWindowExW
消息响应 获取菜单句柄 压入宽度xy坐标 压入窗口风格
0100230F创建窗口
01002342|> \FF35 C4560001 PUSH DWORD PTR DS:
01002348|.E8 98190000 CALL 01003CE5
0100234D|.E8 28130000 CALL 0100367A
01002352|.53 PUSH EBX ; /ShowState
01002353|.FF35 245B0001 PUSH DWORD PTR DS: ; |hWnd = 0060012E ('Minesweeper',class='Minesweeper')
01002359|.FF15 34110001 CALL DWORD PTR DS:[<&USER32.ShowWindow>] ; \ShowWindow
0100235F|.FF35 245B0001 PUSH DWORD PTR DS: ; /hWnd = 0060012E ('Minesweeper',class='Minesweeper')
01002365|.FF15 58110001 CALL DWORD PTR DS:[<&USER32.UpdateWindow>] ; \UpdateWindow
0100236B|.8B35 54110001 MOV ESI, DWORD PTR DS:[<&USER32.GetMessageW>] ;user32.GetMessageW
01002371|.893D 385B0001 MOV DWORD PTR DS:, EDI
跟进 0100234DE8 28130000 CALL 0100367A
010036F0|.C1E0 05 SHL EAX, 0x5
010036F3|.8D8430 40530001LEA EAX, DWORD PTR DS:
010036FA|.8008 80 OR BYTE PTR DS:, 0x80
010036FD FF0D 30530001 DEC DWORD PTR DS:
01003703|.^ 75 C2 JNZ SHORT 010036C7
Int3 断点位于010036F3取消所有断点 重载
010036F3|.8D8430 40530001LEA EAX, DWORD PTR DS:
信息窗口显示
DS:=00000028
16进制的28 转换下10进制=40
010036F3|.8D8430 40530001LEA EAX, DWORD PTR DS:
010036FA|.8008 80 OR BYTE PTR DS:, 0x80
010036FD FF0D 30530001 DEC DWORD PTR DS:
01003703|.^ 75 C2 JNZ SHORT 010036C7
01003705|.8B0D 38530001 MOV ECX, DWORD PTR DS:
01003703一直循环在置入地雷 循环一共置入40个地雷
010053B0 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
010053C0 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
010053D0 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
010053E0 10 0F 0F 0F 0F 0F 0F 0F 0F 8F 0F 0F 0F 0F 0F 0F?
010053F0 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
01005400 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 8F 0F?
01005410 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
01005420 10 8F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F?
01005430 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
01005440 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
01005450 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
01005460 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 8F 0F 0F 0F 0F 0F?
01005470 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
01005480 10 0F 0F 0F 0F 0F 0F 8F 8F 0F 0F 0F 0F 0F 0F 0F??
01005490 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
010054A0 10 0F 0F 0F 0F 0F 0F 0F 8F 0F 0F 0F 0F 0F 0F 0F?
010054B0 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
010054C0 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
010054D0 0F 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
010054E0 10 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
010054F0 0F 10 0F 0F 0F 0F 0F 0F 0F
可以清晰的看到 地雷已经置入啦。
01002353|.FF35 245B0001 PUSH DWORD PTR DS: ; |hWnd = 0063012E ('Minesweeper',class='Minesweeper')
01002359|.FF15 34110001 CALL DWORD PTR DS:[<&USER32.ShowWindow>] ; \ShowWindow
0100235F|.FF35 245B0001 PUSH DWORD PTR DS: ; /hWnd = 0063012E ('Minesweeper',class='Minesweeper')
01002365|.FF15 58110001 CALL DWORD PTR DS:[<&USER32.UpdateWindow>] ; \UpdateWindow
0100236B|.8B35 54110001 MOV ESI, DWORD PTR DS:[<&USER32.GetMessageW>] ;user32.GetMessageW
01002371|.893D 385B0001 MOV DWORD PTR DS:, EDI
01002377|.EB 2B JMP SHORT 010023A4
01002379|>8D45 DC /LEA EAX, DWORD PTR SS:
0100237C|.50 |PUSH EAX ; /pMsg
0100237D|.FF75 14 |PUSH DWORD PTR SS: ; |hAccel
01002380|.FF35 245B0001 |PUSH DWORD PTR DS: ; |hWnd = 0063012E ('Minesweeper',class='Minesweeper')
开始显示窗口 然后更新窗口。。
随机数的地雷都置入了也初始完了 窗口都即将显示 01002353压入了常量 0x1005B24 再次压入 0x1005B24
找段空代码 最后修改如下
01002380|.FF35 245B0001
Patch
01002380 /E9 F5260000 JMP 01004A7A
01002385 |90 NOP
01004A7A FF35 245B0001 PUSH DWORD PTR DS:
01004A80 6A 0A PUSH 0xA
01004A82 E8 F9E4FFFF CALL 01002F80
01004A87^ E9 F9D8FFFF JMP 01002385
01004A8C 0000 ADD BYTE PTR DS:, AL
Done..
BTW: 没走捷径,这个程序我只是盲目的F8 F7 分析。 把他当做一个Crack Me来玩 最后达到自己的目的 也是一种虐心的享受
扫雷还要破解?本来就是消磨时间的小游戏,个人感觉破解意义不大。楼主纯闲,坚定完毕! 你真是够了!!!不错一看好专业的样子本以为扫雷这么简单的东西反编译估计会简单些的 在一个纯白看白好高深啊 终于抢到沙发了,
膜拜 扫雷 透视
佩服,佩服!
我去玩几局!
容我在地上趴一会儿。。。 大神连小游戏都不放过了{:301_993:} 最后一句是亮点,羡慕{:1_921:}
何时带我飞 我感觉言语不能表示我的震惊,只剩膜拜了,把扫雷完成这样我也是醉了 分析好充实,感谢大神,好好学习!