好友
阅读权限25
听众
最后登录1970-1-1
|
标 题: 【原创】植物大战僵尸 修改版
作 者: 思远软件
时 间: 2010-02-09,02:11:24
链 接: http://bbs.pediy.com/showthread.php?t=106966
植物大战僵尸 修改版(一)
这一段时间,周围很多朋友玩一个叫植物大战僵尸这个游戏,我也耍了一下,是比较好玩,
可是后面的一些关还是有点难的,于是乎,就用逆向的知识修改一下。
这里主要修改了3步,
一 双开
二 一个阳光改为增加100点阳光值
三 所有的武器不消耗阳光数值
四 金钱限制突破
五 暂停功能突破
第一步,双开功能突破
这个程序不能双开的,我们来突破这个功能,
根据跟踪,我们发现了这个下数据
00553EAD |. 56 push esi ; |pSecurity => NULL
00553EAE |. FF15 E0206500 call dword ptr [<&KERNEL32.CreateMute>; \CreateMutexA
00553EB4 |. BF 10000000 mov edi, 10
00553EB9 |. 39BC24 080100>cmp dword ptr [esp+108], edi
00553EC0 |. 8983 F8000000 mov dword ptr [ebx+F8], eax
00553EC6 |. 72 10 jb short 00553ED8
00553EC8 |. 8B9424 F40000>mov edx, dword ptr [esp+F4]
00553ECF |. 52 push edx
00553ED0 |. E8 C5820C00 call 0061C19A
00553ED5 |. 83C4 04 add esp, 4
00553ED8 |> C78424 800200>mov dword ptr [esp+280], -1
00553EE3 |. 397C24 38 cmp dword ptr [esp+38], edi
00553EE7 |. C78424 080100>mov dword ptr [esp+108], 0F
00553EF2 |. 89B424 040100>mov dword ptr [esp+104], esi
00553EF9 |. C68424 F40000>mov byte ptr [esp+F4], 0
00553F01 |. 72 0D jb short 00553F10
00553F03 |. 8B4424 24 mov eax, dword ptr [esp+24]
00553F07 |. 50 push eax
00553F08 |. E8 8D820C00 call 0061C19A
00553F0D |. 83C4 04 add esp, 4
00553F10 |> FF15 B4206500 call dword ptr [<&KERNEL32.GetLastErr>; [GetLastError
00553F16 |. 3D B7000000 cmp eax, 0B7
00553F1B |. 75 0C jnz short 00553F29 ; 关键判断
00553F1D |. 8B13 mov edx, dword ptr [ebx]
00553F1F |. 8B82 BC000000 mov eax, dword ptr [edx+BC]
00553F25 |. 8BCB mov ecx, ebx
00553F27 |. FFD0 call eax
也就是说
关键判断是 00553F1B
把这里的jnz改成jmp 就可以了
好了 第一步完成
第2步 修改阳光数值
这里就不用说了 这里的阳光呢,就相当于其他游戏的金钱,我们修改这个就可以了
先用内存查看工具,查询阳光这个数值在内存中的位置,然后再od当中 DD 这个地址
下内存写入断点,然后呢,F9运行,你就可以玩了, 当你的程序这个数改变的时候,程序就断下来了,然后我们就可以看到相应的汇编代码, 哈哈
我们点击阳光, 程序断了下来,我们看到这个
004309EF |> B9 19000000 mov ecx, 19 (阳光数值为25)
004309F4 |. EB 18 jmp short 00430A0E
004309F6 |> 83F8 05 cmp eax, 5
004309F9 |. 75 05 jnz short 00430A00
004309FB |. 8D48 0A lea ecx, dword ptr [eax+A]
004309FE |. EB 0E jmp short 00430A0E
00430A00 |> 33C9 xor ecx, ecx
00430A02 |. 83F8 06 cmp eax, 6
00430A05 |. 0F95C1 setne cl
00430A08 |. 83E9 01 sub ecx, 1
00430A0B |. 83E1 32 and ecx, 32
00430A0E |> 8B46 04 mov eax, dword ptr [esi+4]
00430A11 |. 0188 60550000 add dword ptr [eax+5560], ecx (增加阳光数值 )
按,理说,收集一个阳光,增加25点阳光数值,可是这个有点太少了,我们改成100吧
好,我们开工
004309EF mov ecx, 19 改成 mov ecx, 64
第三步 打造免费武器
好了,只改了阳光数值,还不爽,我们再来改改别的东西,
我们现在改一下价值100阳光的 豌豆射手),恩 还是那个方法,这次我们可以看到下面指令
0041BA60 /$ 56 push esi
0041BA61 |. 8BB7 60550000 mov esi, dword ptr [edi+5560]
0041BA67 |. 8BD7 mov edx, edi
0041BA69 |. E8 12FFFFFF call 0041B980
0041BA6E |. 03C6 add eax, esi
0041BA70 |. 3BD8 cmp ebx, eax
0041BA72 |. 7F 0C jg short 0041BA80
0041BA74 |. 2BF3 sub esi, ebx (这里是修改)
0041BA76 |. 89B7 60550000 mov dword ptr [edi+5560], esi
0041BA7C |. B0 01 mov al, 1
0041BA7E |. 5E pop esi
0041BA7F |. C3 retn
我们把这个阳光0041BA74 的sub esi, ebx
我们nop掉
也就是说,这次 ,所有的东西就都是免费的了
第四步 金钱突破
大家可以看到,如果有了钱,这个游戏会出现很多好玩的物品,可是这个钱挣得也太慢了,怎么突破呢,看我的。
先让程序显示缺少金钱的对话框,这时候缺少金钱的相关代码已经可以在OD中找到了,我们很容易找到下面代码
0048C78E |. 8B8F 50010000 mov ecx, dword ptr [edi+150]
0048C794 |. 8B91 2C080000 mov edx, dword ptr [ecx+82C]
0048C79A |. 3942 28 cmp dword ptr [edx+28], eax
0048C79D |. 8D73 0F lea esi, dword ptr [ebx+F]
0048C7A0 |. 0F8D 1E010000 jge 0048C8C4 (关键判断处)
0048C7A6 |. 6A 02 push 2
0048C7A8 |. 68 7C7B6500 push 00657B7C ; 好
0048C7AD |. 8D4C24 18 lea ecx, dword ptr [esp+18]
0048C7B1 |. 897424 30 mov dword ptr [esp+30], esi
0048C7B5 |. 895C24 2C mov dword ptr [esp+2C], ebx
0048C7B9 |. 885C24 1C mov byte ptr [esp+1C], bl
0048C7BD |. E8 6E7BF7FF call 00404330
0048C7C2 |. 899C24 A40000>mov dword ptr [esp+A4], ebx
0048C7C9 |. 6A 43 push 43
0048C7CB |. 68 A0D96600 push 0066D9A0 ; 你现在还买不起这个物品。\n去杀僵尸赚取更多钱币。
0048C7D0 |. 8D4C24 34 lea ecx, dword ptr [esp+34]
0048C7D4 |. 897424 4C mov dword ptr [esp+4C], esi
0048C7D8 |. 895C24 48 mov dword ptr [esp+48], ebx
0048C7DC |. 885C24 38 mov byte ptr [esp+38], bl
0048C7E0 |. E8 4B7BF7FF call 00404330
0048C7E5 |. C68424 A40000>mov byte ptr [esp+A4], 1
0048C7ED |. 6A 10 push 10
0048C7EF |. 68 E4D96600 push 0066D9E4 ; 资金不足
0048C7F4 |. 8D4C24 50 lea ecx, dword ptr [esp+50]
0048C7F8 |. 897424 68 mov dword ptr [esp+68], esi
0048C7FC |. 895C24 64 mov dword ptr [esp+64], ebx
0048C800 |. 885C24 54 mov byte ptr [esp+54], bl
0048C804 |. E8 277BF7FF call 00404330
0048C7A0 |. 0F8D 1E010000 jge 0048C8C4 (关键判断处)
这一段引起了我们的注意,如果金钱少于价格,则显示不足
将jge改成jmp就可以了
(当金钱不足的时候,我们的金钱不会变为负数,只会变成0)
哈哈,这次我们可以想买什么东西就买什么东西了
第五步 游戏暂停功能突破
这个游戏有一个功能,就是当你玩的时候,突然坐别的事情,这个游戏的窗口失去焦点后,就会暂停,这个在有时候是很人性化,可是有时候却很讨厌,比如我要双开,那么只能让一个运行,比如我要又玩这个游戏,又搞别的,那么也不行,所以我们开突破这个暂停功能。
方法和上一个一样,很容易的找到暂停的窗口,指定的相关代码。
004502C0 /$ 55 push ebp
004502C1 |. 8BEC mov ebp, esp
004502C3 |. 83E4 F8 and esp, FFFFFFF8
004502C6 64:A1 0000000>mov eax, dword ptr fs:[0]
004502CC 6A FF push -1
004502CE 68 88DF6400 push 0064DF88
004502D3 50 push eax
004502D4 64:8925 00000>mov dword ptr fs:[0], esp
004502DB 83EC 58 sub esp, 58
004502DE 53 push ebx
004502DF 56 push esi
004502E0 8BF1 mov esi, ecx
004502E2 57 push edi
004502E3 8BBE 68070000 mov edi, dword ptr [esi+768]
004502E9 33DB xor ebx, ebx
004502EB 80BF 64010000>cmp byte ptr [edi+164], 1
004502F2 74 4B je short 0045033F
004502F4 8B87 8C000000 mov eax, dword ptr [edi+8C]
004502FA C687 64010000>mov byte ptr [edi+164], 1
00450301 8B88 2C080000 mov ecx, dword ptr [eax+82C]
00450307 3959 28 cmp dword ptr [ecx+28], ebx
0045030A 7E 0A jle short 00450316
0045030C C787 F4550000>mov dword ptr [edi+55F4], 3E8
00450316 83B8 FC070000>cmp dword ptr [eax+7FC], 2
0045031D 74 20 je short 0045033F
0045031F 8B80 84070000 mov eax, dword ptr [eax+784]
00450325 6A 01 push 1
00450327 E8 A44F0C00 call 005152D0
0045032C 8B97 8C000000 mov edx, dword ptr [edi+8C]
00450332 8BBA 3C080000 mov edi, dword ptr [edx+83C]
00450338 6A 01 push 1
0045033A E8 F1B50000 call 0045B930
0045033F 6A 0B push 0B
00450341 BF 0F000000 mov edi, 0F
00450346 68 78756600 push 00667578 ; 返回游戏
0045034B 8D4C24 4C lea ecx, dword ptr [esp+4C]
0045034F 897C24 64 mov dword ptr [esp+64], edi
00450353 895C24 60 mov dword ptr [esp+60], ebx
00450357 885C24 50 mov byte ptr [esp+50], bl
0045035B E8 D03FFBFF call 00404330
00450360 895C24 6C mov dword ptr [esp+6C], ebx
00450364 6A 14 push 14
00450366 68 84756600 push 00667584 ; 点击返回游戏
0045036B 8D4C24 30 lea ecx, dword ptr [esp+30]
0045036F 897C24 48 mov dword ptr [esp+48], edi
00450373 895C24 44 mov dword ptr [esp+44], ebx
00450377 885C24 34 mov byte ptr [esp+34], bl
0045037B E8 B03FFBFF call 00404330
00450380 C64424 6C 01 mov byte ptr [esp+6C], 1
00450385 6A 0B push 0B
00450387 68 9C756600 push 0066759C ; 游戏暂停
0045038C 8D4C24 14 lea ecx, dword ptr [esp+14]
00450390 897C24 2C mov dword ptr [esp+2C], edi
00450394 895C24 28 mov dword ptr [esp+28], ebx
00450398 885C24 18 mov byte ptr [esp+18], bl
0045039C E8 8F3FFBFF call 00404330
004503A1 6A 03 push 3
004503A3 8D4C24 48 lea ecx, dword ptr [esp+48]
004503A7 51 push ecx
004503A8 8D5424 30 lea edx, dword ptr [esp+30]
004503AC 52 push edx
004503AD 8D4C24 18 lea ecx, dword ptr [esp+18]
004503B1 51 push ecx
004503B2 C64424 7C 02 mov byte ptr [esp+7C], 2
004503B7 8B06 mov eax, dword ptr [esi]
004503B9 8B90 20010000 mov edx, dword ptr [eax+120]
004503BF 6A 01 push 1
004503C1 6A 13 push 13
004503C3 8BCE mov ecx, esi
004503C5 FFD2 call edx
004503C7 837C24 24 10 cmp dword ptr [esp+24], 10
004503CC 8BF0 mov esi, eax
004503CE 72 0D jb short 004503DD
004503D0 8B4424 10 mov eax, dword ptr [esp+10]
004503D4 50 push eax
004503D5 E8 C0BD1C00 call 0061C19A
004503DA 83C4 04 add esp, 4
004503DD 837C24 40 10 cmp dword ptr [esp+40], 10
004503E2 897C24 24 mov dword ptr [esp+24], edi
004503E6 895C24 20 mov dword ptr [esp+20], ebx
004503EA 885C24 10 mov byte ptr [esp+10], bl
004503EE 72 0D jb short 004503FD
004503F0 8B4C24 2C mov ecx, dword ptr [esp+2C]
004503F4 51 push ecx
004503F5 E8 A0BD1C00 call 0061C19A
004503FA 83C4 04 add esp, 4
004503FD C74424 6C FFF>mov dword ptr [esp+6C], -1
00450405 837C24 5C 10 cmp dword ptr [esp+5C], 10
0045040A 897C24 40 mov dword ptr [esp+40], edi
0045040E 895C24 3C mov dword ptr [esp+3C], ebx
00450412 885C24 2C mov byte ptr [esp+2C], bl
00450416 72 0D jb short 00450425
00450418 8B5424 48 mov edx, dword ptr [esp+48]
0045041C 52 push edx
0045041D E8 78BD1C00 call 0061C19A
00450422 83C4 04 add esp, 4
00450425 D905 149A6700 fld dword ptr [679A14]
0045042B 83EC 08 sub esp, 8
0045042E D95C24 04 fstp dword ptr [esp+4]
00450432 897C24 64 mov dword ptr [esp+64], edi
00450436 D905 B89A6700 fld dword ptr [679AB8]
0045043C 895C24 60 mov dword ptr [esp+60], ebx
00450440 885C24 50 mov byte ptr [esp+50], bl
00450444 D91C24 fstp dword ptr [esp]
00450447 8B86 58010000 mov eax, dword ptr [esi+158]
0045044D 50 push eax
0045044E E8 2D760000 call 00457A80
00450453 6A 0A push 0A
00450455 53 push ebx
00450456 C786 2C010000>mov dword ptr [esi+12C], 9B
00450460 E8 CB6A0000 call 00456F30
00450465 8B4E 3C mov ecx, dword ptr [esi+3C]
00450468 8B7E 38 mov edi, dword ptr [esi+38]
0045046B 8B1E mov ebx, dword ptr [esi]
0045046D B8 58020000 mov eax, 258
00450472 2BC1 sub eax, ecx
00450474 99 cdq
00450475 2BC2 sub eax, edx
00450477 51 push ecx
00450478 D1F8 sar eax, 1
0045047A 57 push edi
0045047B 50 push eax
0045047C B8 20030000 mov eax, 320
00450481 2BC7 sub eax, edi
00450483 99 cdq
00450484 2BC2 sub eax, edx
00450486 8B93 A0000000 mov edx, dword ptr [ebx+A0]
0045048C D1F8 sar eax, 1
0045048E 50 push eax
0045048F 8BCE mov ecx, esi
00450491 FFD2 call edx
00450493 8B4C24 64 mov ecx, dword ptr [esp+64]
00450497 5F pop edi
00450498 5E pop esi
00450499 64:890D 00000>mov dword ptr fs:[0], ecx
004504A0 5B pop ebx
004504A1 |. 8BE5 mov esp, ebp
004504A3 |. 5D pop ebp ; (initial cpu selection)
004504A4 \. C3 retn
这个函数,其实就是创建干扰窗口的函数,我们把这个函数整体清理掉
我的做法是 004502C6 到004504A0 全部nop填充
这样就行了,当我们去做别的事情的时候,程序不会被断下来了。 |
|