首页
社区
课程
招聘
[求助]WINDOWS自带游戏空档接龙的BUG
发表于: 2007-3-8 21:48 17014

[求助]WINDOWS自带游戏空档接龙的BUG

2007-3-8 21:48
17014

XP SP2,
运行空档接龙游戏(freecell.exe)
最大化窗口,然后F2开始新游戏,然后在窗口右侧中部点击鼠标右键,应该就会使程序崩溃

无意中发现,有兴趣的大牛研究一下


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
  • 1.jpg (16.75kb,276次下载)
收藏
免费 7
支持
分享
最新回复 (26)
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
XP SP2中这个游戏版本为5.1
2K SP4中这个游戏版本为5.0,虽然不会崩溃,不过会莫名其妙的出现纸牌
2007-3-8 21:51
0
雪    币: 154
活跃值: (80)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
的确莫名其妙
2007-3-8 22:01
0
雪    币: 207
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
正常情况下,右键纸牌会使该纸牌全显。

如图:出现异常的情况:

偶尔会出错,偶尔也会莫名其妙的出现纸牌,但如果仔细观察的话,就会发现:
在每列纸牌下面点击右键,就会出现该列旁边右侧一列最上端的纸牌,那么在点击最右一列纸牌时,程序就找不着牌了,于是乎――咔嘣――崩溃了!
那么接下来就是追入代码验证了
2007-3-9 00:15
0
雪    币: 297
活跃值: (21)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
5
果然如楼上所说,有点意思
2007-3-9 08:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你们真厉害.这都能发现..
2007-3-9 13:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
唉,有意思.
2007-3-9 16:17
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
确实这样。楼主很不错啊
2007-3-9 16:19
0
雪    币: 615
活跃值: (1267)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我的是在下面莫名其妙的出现了几张纸牌然后崩溃
2007-3-9 16:28
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
呵呵,果真!
上传的附件:
2007-3-9 16:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不知道Vista上的空当接龙是不是也有这个bug?
2007-3-9 17:26
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
"在每列纸牌下面点击右键,就会出现该列旁边右侧一列最上端的纸牌"
确实是这样,只是不知道这个游戏为什么要这么做?????
我的系统是xp-sp2
把10033E0处的je改为jmp,就不会显示上面的牌了,自然也不会出错了

010033C1          /$  55            push    ebp
010033C2          |.  8BEC          mov     ebp, esp
010033C4          |.  8325 94700001>and     dword ptr [1007094], 0
010033CB          |.  8D45 0C       lea     eax, dword ptr [ebp+C]
010033CE          |.  50            push    eax                             ; /Arg4
010033CF          |.  8D45 10       lea     eax, dword ptr [ebp+10]         ; |
010033D2          |.  50            push    eax                             ; |Arg3
010033D3          |.  FF75 10       push    dword ptr [ebp+10]              ; |Arg2
010033D6          |.  FF75 0C       push    dword ptr [ebp+C]               ; |Arg1
010033D9          |.  E8 1EF9FFFF   call    01002CFC                        ; \freecell.01002CFC
010033DE          |.  85C0          test    eax, eax
010033E0              74 66         je      short 01003448
010033E2          |.  53            push    ebx
010033E3          |.  8B5D 0C       mov     ebx, dword ptr [ebp+C]
010033E6          |.  56            push    esi
010033E7          |.  57            push    edi
010033E8          |.  8B7D 10       mov     edi, dword ptr [ebp+10]
010033EB          |.  85FF          test    edi, edi
010033ED          |.  893D 64700001 mov     dword ptr [1007064], edi
010033F3          |.  891D 68700001 mov     dword ptr [1007068], ebx
010033F9          |.  74 4A         je      short 01003445
010033FB          |.  83FB 14       cmp     ebx, 14
010033FE          |.  74 45         je      short 01003445
01003400          |.  8BF7          mov     esi, edi
01003402          |.  6BF6 15       imul    esi, esi, 15
01003405          |.  03F3          add     esi, ebx
01003407          |.  C1E6 02       shl     esi, 2
0100340A          |.  83BE 04750001>cmp     dword ptr [esi+1007504], -1
01003411          |.  74 32         je      short 01003445
01003413          |.  FF75 08       push    dword ptr [ebp+8]               ; /hWnd
01003416          |.  FF15 20110001 call    dword ptr [<&USER32.GetDC>]     ; \GetDC
0100341C          |.  6A 00         push    0                               ; /Arg5 = 00000000
0100341E          |.  FFB6 00750001 push    dword ptr [esi+1007500]         ; |Arg4
01003424          |.  8945 10       mov     dword ptr [ebp+10], eax         ; |
01003427          |.  53            push    ebx                             ; |Arg3
01003428          |.  57            push    edi                             ; |Arg2
01003429          |.  50            push    eax                             ; |Arg1
0100342A          |.  E8 EBFEFFFF   call    0100331A                        ; \freecell.0100331A
0100342F          |.  FF75 10       push    dword ptr [ebp+10]              ; /hDC
01003432          |.  FF75 08       push    dword ptr [ebp+8]               ; |hWnd
01003435          |.  FF15 1C110001 call    dword ptr [<&USER32.ReleaseDC>] ; \ReleaseDC
0100343B          |.  C705 94700001>mov     dword ptr [1007094], 1
01003445          |>  5F            pop     edi
01003446          |.  5E            pop     esi
01003447          |.  5B            pop     ebx
01003448          |>  5D            pop     ebp
01003449          \.  C2 0C00       retn    0C
2007-3-9 18:57
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
哈哈,反应好快啊!
2007-3-9 21:03
0
雪    币: 207
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
看过楼上给出的代码,觉得那句je不是关键,要不然改成jmp后,下面那一大堆的东西就没用了。

我感觉是je上面的那句call的问题

010033D9  CALL    freecell.01002CFC
这一句是检查鼠标指向位置是否有一张牌,eax返回1表明有
检查方式是根据鼠标指针坐标来计算的。
跟进大致分析如下:

01002CFC  /$  55            PUSH    EBP
01002CFD  |.  8BEC          MOV     EBP, ESP
01002CFF  |.  A1 68780001   MOV     EAX, DWORD PTR DS:[1007868]
01002D04  |.  3945 0C       CMP     DWORD PTR SS:[EBP+C], EAX          ;  比较y,是否在上面空格区
01002D07  |.  73 4E         JNB     SHORT freecell.01002D57            ;  不是则跳
。。。
。。。
01002D57  |>  8B0D 90700001 MOV     ECX, DWORD PTR DS:[1007090]
01002D5D  |.  03C1          ADD     EAX, ECX
01002D5F >|.  3945 0C       CMP     DWORD PTR SS:[EBP+C], EAX          ;  检查y是否在纸牌上界以下
01002D62  |.  72 0B         JB      SHORT freecell.01002D6F            ;  是则不跳
01002D64  |.  8B15 70700001 MOV     EDX, DWORD PTR DS:[1007070]
01002D6A  |.  3955 08       CMP     DWORD PTR SS:[EBP+8], EDX          ;  检查x是否在纸牌左边界右侧
01002D6D  |.  73 07         JNB     SHORT freecell.01002D76            ;  是则跳
01002D6F  |>  33C0          XOR     EAX, EAX
01002D71  |.  E9 AE000000   JMP     freecell.01002E24                  ;  右击窗口最左边
01002D76  |>  8B45 08       MOV     EAX, DWORD PTR SS:[EBP+8]
01002D79  |.  53            PUSH    EBX
01002D7A  |.  56            PUSH    ESI
01002D7B  |.  8B35 74700001 MOV     ESI, DWORD PTR DS:[1007074]
01002D81  |.  2BC2          SUB     EAX, EDX
01002D83  |.  2BF2          SUB     ESI, EDX
01002D85  |.  33D2          XOR     EDX, EDX
01002D87  |.  F7F6          DIV     ESI
01002D89  |.  8B75 10       MOV     ESI, DWORD PTR SS:[EBP+10]
01002D8C  |.  40            INC     EAX                                ;  所在列数(第一列为1)
01002D8D  |.  8906          MOV     DWORD PTR DS:[ESI], EAX
01002D8F  |.  8B0485 6C7000>MOV     EAX, DWORD PTR DS:[EAX*4+100706C]  ;  每列纸牌的左边界
01002D96  |.  0305 70830001 ADD     EAX, DWORD PTR DS:[1008370]        ;  列边界+纸牌宽度
01002D9C  |.  3945 08       CMP     DWORD PTR SS:[EBP+8], EAX
01002D9F  |.  76 04         JBE     SHORT freecell.01002DA5
01002DA1  |>  33C0          XOR     EAX, EAX
01002DA3  |.  EB 7D         JMP     SHORT freecell.01002E22            ;  在两列纸牌之间,包括窗口最右边
01002DA5  |>  A1 68780001   MOV     EAX, DWORD PTR DS:[1007868]
01002DAA  |.  03C8          ADD     ECX, EAX                           ;  ecx=纸牌上边界
01002DAC  |.  294D 0C       SUB     DWORD PTR SS:[EBP+C], ECX          ;  y = y - 上边界
01002DAF  |.  8B45 0C       MOV     EAX, DWORD PTR SS:[EBP+C]          ;  eax为离上边界的距离
01002DB2  |.  33D2          XOR     EDX, EDX
01002DB4  |.  F735 80790001 DIV     DWORD PTR DS:[1007980]             ;  除以上下两张牌的间隔距离
01002DBA  |.  6A 15         PUSH    15                                 ;  15是程序认为每列可能被摆放的最大牌数
01002DBC  |.  5A            POP     EDX
01002DBD  |.  3BC2          CMP     EAX, EDX                           ;  eax为计算后得出的鼠标所在列的层数(第一层为0)
01002DBF  |.  73 02         JNB     SHORT freecell.01002DC3            ;  超过则跳(包括15)
01002DC1  |.  8BD0          MOV     EDX, EAX
01002DC3  |>  8B4D 14       MOV     ECX, DWORD PTR SS:[EBP+14]
01002DC6  |.  8911          MOV     DWORD PTR DS:[ECX], EDX            ;  所在层
01002DC8  |.  8B06          MOV     EAX, DWORD PTR DS:[ESI]            ;  所在列
01002DCA  |.  8BD8          MOV     EBX, EAX
01002DCC  |.  6BDB 54       IMUL    EBX, EBX, 54                       ;  列X54
01002DCF  |.  83BB 00750001>CMP     DWORD PTR DS:[EBX+1007500], -1     ;  所在列是否还有牌
01002DD6  |.^ 74 C9         JE      SHORT freecell.01002DA1            ;  没有则跳
01002DD8  |.  83FA 14       CMP     EDX, 14
01002DDB  |.  73 16         JNB     SHORT freecell.01002DF3
01002DDD  |.  8BD8          MOV     EBX, EAX
01002DDF  |.  6BDB 15       IMUL    EBX, EBX, 15
01002DE2  |.  03DA          ADD     EBX, EDX                           ;  列X15+层
01002DE4  |.  833C9D 047500>CMP     DWORD PTR DS:[EBX*4+1007504], -1   ;  下一张牌面点数是否有效
01002DEC  |.  74 05         JE      SHORT freecell.01002DF3            ;  无效则跳
01002DEE  |.  33C0          XOR     EAX, EAX
01002DF0  |.  40            INC     EAX
01002DF1  |.  EB 2F         JMP     SHORT freecell.01002E22
01002DF3  |>  6BC0 15       IMUL    EAX, EAX, 15
01002DF6  |.  03C2          ADD     EAX, EDX                           ;  列X15+层
01002DF8  |.  EB 09         JMP     SHORT freecell.01002E03
01002DFA  |>  FF09          /DEC     DWORD PTR DS:[ECX]                ;  层数
01002DFC  |.  8B06          |MOV     EAX, DWORD PTR DS:[ESI]
01002DFE  |.  6BC0 15       |IMUL    EAX, EAX, 15
01002E01  |.  0301          |ADD     EAX, DWORD PTR DS:[ECX]
01002E03  |>  833C85 007500> CMP     DWORD PTR DS:[EAX*4+1007500], -1  ;  检查牌面点数(当层数为15时,因为牌面点数数据是连续的,所以这时指针所指的是右侧一列首张牌)
01002E0B  |.^ 74 ED         \JE      SHORT freecell.01002DFA           ;  空牌则再往上找,最终确定该列实际牌数
01002E0D  |.  8B01          MOV     EAX, DWORD PTR DS:[ECX]            ;  所在列牌的数量
01002E0F  |.  0FAF05 807900>IMUL    EAX, DWORD PTR DS:[1007980]
01002E16  |.  0305 68780001 ADD     EAX, DWORD PTR DS:[1007868]        ;  所在列的下边界
01002E1C  |.  3B45 0C       CMP     EAX, DWORD PTR SS:[EBP+C]          ;  比较y,影响CF,当层数为15时,这里就出问题了--CF为0
01002E1F  |.  1BC0          SBB     EAX, EAX                           ;  带CF的减法
01002E21  |.  40            INC     EAX
01002E22  |>  5E            POP     ESI
01002E23  |.  5B            POP     EBX
01002E24  |>  5D            POP     EBP
01002E25  \.  C2 1000       RETN    10
2007-3-10 13:45
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
15
在哪儿点击鼠标右键?为什么我看不到
2007-3-10 19:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
最初由 wxxw 发布
在哪儿点击鼠标右键?为什么我看不到


我的也看不见呀
2007-3-25 16:21
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
怪事,我没有发现呢,弄不出来,它不崩溃
2007-3-25 16:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
有趣,谁来给它修补一下。
2007-3-26 11:01
0
雪    币: 8845
活跃值: (5341)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
确实如此,微软的BUG。给微软汇报一下,还可能得到微软的钱钱哦。
2007-3-26 22:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
哈哈,我见过的情况才NB呢――

A还没有上去,2、3、4……倒上去了,结果,当然是无法完成了,卡在了A上!!!!!!
2007-3-27 23:37
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
21
按ctrl+shift+f10
2007-3-28 00:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
好玩,看看怎么回事。
2007-6-14 02:00
0
雪    币: 433
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
上传的附件:
  • f.jpg (62.41kb,72次下载)
2007-6-15 12:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
体验了 崩溃
2007-6-15 13:42
0
雪    币: 242
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
很早前看人弄过,惊得我一愣一愣的,原来是这样啊,呵呵...
2007-6-15 15:53
0
游客
登录 | 注册 方可回帖
返回
//