声明:本文提到的方法,只能作为娱乐使(试)用,严禁用作不良之途.本人不承担任何后果.
<<连连看>>是大家都熟悉的小游戏,老少皆宜,上手容易,而且耐玩.最近我的老爸也喜欢上了这个游戏,玩的乐此不疲.然而终究是上年纪的人了,玩起来有些吃力,有次老爸说,提示数不够用,要是多一些就好了.后来我分析了游戏的程序,发现可以修改得地方很多,现在可以做到:更换背景音乐,背景图片,使提示数足够,使洗牌数足够,想跳关就跳关......我觉得有些意思,贴出来给大家分享.
我这里有两个版本的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"是什么关系?
以上疑问还请高手指教,谢.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!