小弟初学破解,书是看了不少,可是始终没有什么真正的实践,最近春节放假在家happy,发现一个小游戏Insaniquarium Deluxe(幻想游戏中的怪怪水族馆)挺有意思,可是越玩到后面越手忙脚乱,这么多的pet每次却只能带3个,真是不爽,于是决定拿它开刀,小搞一下。
目的很明确:我要所有pet全上阵。目标明确了,开始行动。
掏出OllyDbg打开游戏的exe,HOHO,没有壳,于是大致浏览了一下,开始寻找切入点,观察游戏中choose your pets这一步,发现当选择的pet数超过3个时候是不会有任何提示的,可就是选不上,但是,如果你选的pet数不够3个的话,它就会问你是不是要select more pets?嘿嘿,这个提示窗口就是切入点了,到OllyDbg中去搜它窗口中的关键字,找到这里
00553DF8 41 72 65 20 79 6F 75 20 Are you
00553E00 73 75 72 65 20 79 6F 75 sure you
00553E08 20 77 61 6E 74 20 74 6F want to
00553E10 20 63 6F 6E 74 69 6E 75 continu
00553E18 65 20 74 6F 20 74 68 65 e to the
00553E20 20 6E 65 78 74 20 6C 65 next le
00553E28 76 65 6C 20 77 69 74 68 vel with
00553E30 6F 75 74 20 73 65 6C 65 out sele
00553E38 63 74 69 6E 67 20 61 74 cting at
00553E40 20 6C 65 61 73 74 20 33 least 3
00553E48 20 70 65 74 73 3F 00 00 pets?..
然后在00553DF8处Find Reference,找到2处,跟过去,来到这2处引用的地方
0044E6C7 |. 2BC2 SUB EAX,EDX
0044E6C9 |. 50 PUSH EAX ; /Arg2
0044E6CA |. 68 09835400 PUSH Insaniqu.00548309 ; |Arg1 = 00548309
0044E6CF |. 8D8D 64FFFFFF LEA ECX,DWORD PTR SS:[EBP-9C] ; |
0044E6D5 |. E8 86C8FCFF CALL Insaniqu.0041AF60 ; \Insaniqu.0041AF60
0044E6DA |. B8 F83D5500 MOV EAX,Insaniqu.00553DF8 ; ASCII "Are you sure you want to continue to the next level without selecting at least 3 pets?"
0044E6DF |. 897D B4 MOV DWORD PTR SS:[EBP-4C],EDI
0044E6E2 |. 895D FC MOV DWORD PTR SS:[EBP-4],EBX
0044E6E5 |. 895D B0 MOV DWORD PTR SS:[EBP-50],EBX
0044E6E8 |. 885D A0 MOV BYTE PTR SS:[EBP-60],BL
0044E6EB |. 8D78 01 LEA EDI,DWORD PTR DS:[EAX+1]
0044E6EE |. 8BFF MOV EDI,EDI
0044E6F0 |> 8A08 /MOV CL,BYTE PTR DS:[EAX]
0044E6F2 |. 40 |INC EAX
0044E6F3 |. 3ACB |CMP CL,BL
0044E6F5 |.^75 F9 \JNZ SHORT Insaniqu.0044E6F0
0044E6F7 |. 2BC7 SUB EAX,EDI
0044E6F9 |. 50 PUSH EAX ; /Arg2
0044E6FA |. 68 F83D5500 PUSH Insaniqu.00553DF8 ; |Arg1 = 00553DF8 ASCII "Are you sure you want to continue to the next level without selecting at least 3 pets?"
0044E6FF |. 8D4D 9C LEA ECX,DWORD PTR SS:[EBP-64] ; |
0044E702 |. E8 59C8FCFF CALL Insaniqu.0041AF60 ; \Insaniqu.0041AF60
点了一下1号pet,查看DS:[ECX+100]找到这里04E86FA8(所选pet的选中标志)
04E86FA8 00 F0 AD BA 10 42 3F 00 .瓠?B?.
1号pet当前的选中标志是00,因为我当时已经选了3个了,再选这第4个就选不上了。
于是回到游戏调整了一下选择的pet,让1号pet能够被选上,然后再点一下1号pet,发现在进入0044E530之前04E86FA8这个byte已经被改成01了(被选中),于是判断这里还不是关键,应该是前面的某段程序来决定这个pet是否能被选中的,于是对04E86FA8这里下Memory, on access断点,看看是哪里修改了这个标志,然后在游戏中反复点选了几次pet,最后找到了关键的一段代码:
这段就是调整pet选中标志的代码,随即反复试验了几次,只要是选上了某个pet,或是取消选中的某个pet都会来到这里来调整pet的选中标志。这么说,调用这个过程的代码的附近应该就是判断是否能选中的地方,于是查看此段代码的被调用情况
Local calls from 0044D8BD, 00458572, 004585AE
有3处,逐一跟踪查看,发现这第3处就是我要找的地方