声明:本文提到的方法,只能作为娱乐使(试)用,严禁用作不良之途.本人不承担任何后果.
  <<连连看>>是大家都熟悉的小游戏,老少皆宜,上手容易,而且耐玩.最近我的老爸也喜欢上了这个游戏,玩的乐此不疲.然而终究是上年纪的人了,玩起来有些吃力,有次老爸说,提示数不够用,要是多一些就好了.后来我分析了游戏的程序,发现可以修改得地方很多,现在可以做到:更换背景音乐,背景图片,使提示数足够,使洗牌数足够,想跳关就跳关......我觉得有些意思,贴出来给大家分享.
  我这里有两个版本的kawai.exe的安装程序,这两个版本分别用了不同的加壳,这里我用精装版的kawai.exe 3.0来说明,它是用aspack 2.12加的壳,在修改之前必须先脱掉壳,脱壳过程这就不多说了.(另一个是标准版,用upx加壳)
  先从简单的开始来.
  第一项:更换背景音乐.使用exescope找到文件中的midi资源,把准备好的midi音乐导入即可,导入后你就可以欣赏独具个性的游戏音乐了.赶快把这样的程序送给你的mm们呦... ...事实上有更简单的方法:关闭背景音乐,打开一个播放器,:-) 
  第二项:更换音效.和更换midi方法一样,不浪费大家的时间了.
  第三项:更换背景图片.每次玩时都是小猫小兔的看够了,你有漂亮的图片吗?这次使用vbexplore找到文件中的图片资源,把你制作好的图片导入进去就可以.不过图片的尺寸,分辨率,大小要掌握好分寸,否则会惨不忍睹的!
  以上三项都是简单的修改,稍有汉化知识的人都可以轻松的做到.以下几项比较有意思,可以让游戏更有乐趣.
  第四项:修改提示数,洗牌数.使用金山游侠,找到提示数和洗牌数是放在哪个内存地址,用游侠追了几次.找到提示数是放在内存地址004A3194中,用反汇编软件在文件中查找004A3194字符串,结果找到了如下代码:(还有其它几处看起来不重要)
#######################################
(这段代码可能是游戏初始化)* Possible StringData Ref from Data Obj ->"easy"
 |                                 
:00489525 685C6C4000              push 00406C5C
:0048952A FFD7                    call edi
:0048952C 85C0                    test eax, eax
:0048952E 751E                    jne 0048954E
:00489530 C705D0304A0000004843    mov dword ptr [004A30D0], 43480000(选择easy时给的游戏时间)
:0048953A 66C70594314A000400      mov word ptr [004A3194], 0004     (选择easy时给的提示数)
:00489543 66C705D4304A000200      mov word ptr [004A30D4], 0002     (选择easy时给的洗牌数)
:0048954C EB5E                    jmp 004895AC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048952E(C)
|
:0048954E 8B8D24FFFFFF            mov ecx, dword ptr [ebp+FFFFFF24]
:00489554 51                      push ecx

* Possible StringData Ref from Data Obj ->"normal"
                                  |
:00489555 686C6C4000              push 00406C6C
:0048955A FFD7                    call edi
:0048955C 85C0                    test eax, eax
:0048955E 751E                    jne 0048957E
:00489560 C705D0304A0000004843    mov dword ptr [004A30D0], 43480000(选择normal时给的游戏时间)
:0048956A 66C70594314A000600      mov word ptr [004A3194], 0006(选择normal时给的提示数)
:00489573 66C705D4304A000300      mov word ptr [004A30D4], 0003(选择normal时给的洗牌数)
:0048957C EB2E                    jmp 004895AC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048955E(C)
|
:0048957E 8B9524FFFFFF            mov edx, dword ptr [ebp+FFFFFF24]
:00489584 52                      push edx

* Possible StringData Ref from Data Obj ->"hard"
                                  |
:00489585 68806C4000              push 00406C80
:0048958A FFD7                    call edi
:0048958C 85C0                    test eax, eax
:0048958E 751C                    jne 004895AC
:00489590 C705D0304A0000007043    mov dword ptr [004A30D0], 43700000(选择hard时给的游戏时间)
:0048959A 66C70594314A000800      mov word ptr [004A3194], 0008(选择hard时给的提示数)
:004895A3 66C705D4304A000400      mov word ptr [004A30D4], 0004(选择hard时给的洗牌数)

#######################################
  看到这里知道怎么修改了吧!用16进制编辑器打开程序,(不要用w32dasm直接修改,有时会不成功)查找字符串“66C70594314A00”(修改提示数)和“66C705D4304A00”(修改洗牌数),找到后,修改后面的4个数就可以了.不过,不要太贪心,看看下面的代码就知道了!!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  (给下一关赋值并计算每关结束后的成绩)
* Possible StringData Ref from Data Obj ->""
                                  |
:004842A5 C745FC10154000          mov [ebp-04], 00401510
:004842AC 66A1CE304A00            mov ax, word ptr [004A30CE]---(已经玩到第几关送到ax)
:004842B2 668B0DD4304A00          mov cx, word ptr [004A30D4]---(剩余的洗牌数送到cx)
:004842B9 668B1594314A00          mov dx, word ptr [004A3194]---(剩余的提示数送到dx)
:004842C0 33F6                    xor esi, esi
:004842C2 8B7D08                  mov edi, dword ptr [ebp+08]
:004842C5 66050100                add ax, 0001 ------------------(关数增加1)
:004842C9 0F805A170000            jo 00485A29 
:004842CF 6683C101                add cx, 0001-------------------(洗牌数+1)
:004842D3 66A3CE304A00            mov word ptr [004A30CE], ax
:004842D9 0F804A170000            jo 00485A29
:004842DF 6683C201                add dx, 0001-------------------(提示数+1)
:004842E3 66890DD4304A00          mov word ptr [004A30D4], cx
:004842EA 0F8039170000            jo 00485A29
:004842F0 66891594314A00          mov word ptr [004A3194], dx
:004842F7 8B07                    mov eax, dword ptr [edi]
:004842F9 57                      push edi
: ... ...
:以下省略

  通过以上代码,可以修改以下两项:
1进入到哪一关:修改004842C5 66050100为004842C5 66050300时,玩0,3,6,9关
2进入下一关后,提示数增加的点数,洗牌数增加的点数.
  但是需要注意,不要修改的太多否则"jo 00485A29"不吃这套.
  注意:汇编语言好的朋友可以研究一下它的算分过程----我不会!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  第五项:如果你的mm就喜欢过第一关,那么如何让她过n次第1关呢?很复杂!看下面代码:
????????????????????????????????????????
(比较是否结束游戏)* Reference To: MSVBVM60.__vbaFreeObj, Ord:0000h

:0048442A FF1530124000            Call dword ptr [00401230]
:00484430 66833DCE304A000B        cmp word ptr [004A30CE], 000B----比较是否结束游戏
:00484438 6894314A00              push 004A3194
:0048443D 68D0304A00              push 004A30D0
:00484442 6848314A00              push 004A3148
:00484447 68D4304A00              push 004A30D4
:0048444C 68CE304A00              push 004A30CE
:00484451 0F8D81030000            jnl 004847D8
:00484457 E864C80100              call 004A0CC0
:0048445C 8BC8                    mov ecx, eax
.......
            jnl 004847D8-------
:004847D8 E8E3C40100              call 004A0CC0
:004847DD 8BC8                    mov ecx, eax
.......
            call 004A0CC0------
:004A0CC0 83EC10                  sub esp, 00000010
:004A0CC3 33C0                    xor eax, eax
:004A0CC5 33C9                    xor ecx, ecx
:004A0CC7 53                      push ebx
:..........
????????????????????????????????????????
  方法1:要想总使得图片像第一关那样不变化,可以使关数大于11,例如玩第12,24,36关时,图片是不动的,然后修改代码:
:004842C5 66050100                add ax, 0001 ----修改000B
:00484430 66833DCE304A000B        cmp word ptr [004A30CE], 000B----再修改为0021(十进制为33)
开始游戏后先玩第0关,再玩第11关,再玩第22关,第33关通过后,就计算总成绩了.
  再次提醒,每关计算分数与第几关数,时间,提示数,洗牌数都有关,如果这个分数超出了内存范围,程序就出错了.
  赶快把做好的补丁给你的好友吧!
再次声明:本文提到的方法,只能作为娱乐使(试)用,严禁用作不良之途.本人不承担任何后果.
  以上只是一些不太复杂的修改,稍有解密基础的都可以做到.有错误之处还请指出!
  在修改程序时发现几个问题不能解释,在此向高手请教:
1.原加密的程序可以直接玩normal和hard.脱壳后normal和hard必须全部通过上一个关后才能玩,不知为什么!
2.原程序每小关(easy)的时间是200秒,与"00489530 C705D0304A0000004843    mov dword ptr [004A30D0], 43480000"中的"43480000"是什么关系?
  以上疑问还请高手指教,谢.