Sound 发表于 2015-11-13 01:13

扫雷小游戏的相关简单分析

掃雷小遊戲的相關簡單分析


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来玩 最后达到自己的目的 也是一种虐心的享受








gyang1987 发表于 2016-7-24 10:21

扫雷还要破解?本来就是消磨时间的小游戏,个人感觉破解意义不大。楼主纯闲,坚定完毕!

感情 发表于 2015-11-14 10:46

你真是够了!!!不错一看好专业的样子本以为扫雷这么简单的东西反编译估计会简单些的   在一个纯白看白好高深啊

Emil 发表于 2015-11-13 01:14

终于抢到沙发了,
膜拜 扫雷 透视

yc016 发表于 2015-11-13 01:32

嬴承仲 发表于 2015-11-13 08:02

佩服,佩服!
我去玩几局!

妖孽成佛 发表于 2015-11-13 08:38

容我在地上趴一会儿。。。

叫兽丶 发表于 2015-11-13 09:11

大神连小游戏都不放过了{:301_993:}

陪你晒月亮 发表于 2015-11-13 09:15

wgz001 发表于 2015-11-13 09:33

最后一句是亮点,羡慕{:1_921:}
何时带我飞

夏末的静寂 发表于 2015-11-13 09:40

我感觉言语不能表示我的震惊,只剩膜拜了,把扫雷完成这样我也是醉了

bfqjge 发表于 2015-11-13 09:50

分析好充实,感谢大神,好好学习!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 扫雷小游戏的相关简单分析