wuhanqi 发表于 2010-2-27 14:12

植物大战僵尸 修改版[多开/修改游戏限制]

标 题: 【原创】植物大战僵尸 修改版
作 者: 思远软件
时 间: 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 , edi
00553EC0|.8983 F8000000 mov   dword ptr , eax
00553EC6|.72 10         jb      short 00553ED8
00553EC8|.8B9424 F40000>mov   edx, dword ptr
00553ECF|.52            push    edx
00553ED0|.E8 C5820C00   call    0061C19A
00553ED5|.83C4 04       add   esp, 4
00553ED8|>C78424 800200>mov   dword ptr , -1
00553EE3|.397C24 38   cmp   dword ptr , edi
00553EE7|.C78424 080100>mov   dword ptr , 0F
00553EF2|.89B424 040100>mov   dword ptr , esi
00553EF9|.C68424 F40000>mov   byte ptr , 0
00553F01|.72 0D         jb      short 00553F10
00553F03|.8B4424 24   mov   eax, dword ptr
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
00553F1F|.8B82 BC000000 mov   eax, dword ptr
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
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
00430A11|.0188 60550000 add   dword ptr , ecx(增加阳光数值 )
按,理说,收集一个阳光,增加25点阳光数值,可是这个有点太少了,我们改成100吧
好,我们开工
004309EF   mov   ecx, 19    改成mov ecx, 64

第三步 打造免费武器
好了,只改了阳光数值,还不爽,我们再来改改别的东西,
我们现在改一下价值100阳光的 豌豆射手),恩 还是那个方法,这次我们可以看到下面指令

0041BA60/$56            push    esi
0041BA61|.8BB7 60550000 mov   esi, dword ptr
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 , 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
0048C794|.8B91 2C080000 mov   edx, dword ptr
0048C79A|.3942 28       cmp   dword ptr , eax
0048C79D|.8D73 0F       lea   esi, dword ptr
0048C7A0|.0F8D 1E010000 jge   0048C8C4   (关键判断处)
0048C7A6|.6A 02         push    2
0048C7A8|.68 7C7B6500   push    00657B7C                         ;好
0048C7AD|.8D4C24 18   lea   ecx, dword ptr
0048C7B1|.897424 30   mov   dword ptr , esi
0048C7B5|.895C24 2C   mov   dword ptr , ebx
0048C7B9|.885C24 1C   mov   byte ptr , bl
0048C7BD|.E8 6E7BF7FF   call    00404330
0048C7C2|.899C24 A40000>mov   dword ptr , ebx
0048C7C9|.6A 43         push    43
0048C7CB|.68 A0D96600   push    0066D9A0                         ;你现在还买不起这个物品。\n去杀僵尸赚取更多钱币。
0048C7D0|.8D4C24 34   lea   ecx, dword ptr
0048C7D4|.897424 4C   mov   dword ptr , esi
0048C7D8|.895C24 48   mov   dword ptr , ebx
0048C7DC|.885C24 38   mov   byte ptr , bl
0048C7E0|.E8 4B7BF7FF   call    00404330
0048C7E5|.C68424 A40000>mov   byte ptr , 1
0048C7ED|.6A 10         push    10
0048C7EF|.68 E4D96600   push    0066D9E4                         ;      资金不足
0048C7F4|.8D4C24 50   lea   ecx, dword ptr
0048C7F8|.897424 68   mov   dword ptr , esi
0048C7FC|.895C24 64   mov   dword ptr , ebx
0048C800|.885C24 54   mov   byte ptr , 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:
004502CC      6A FF         push    -1
004502CE      68 88DF6400   push    0064DF88
004502D3      50            push    eax
004502D4      64:8925 00000>mov   dword ptr fs:, 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
004502E9      33DB          xor   ebx, ebx
004502EB      80BF 64010000>cmp   byte ptr , 1
004502F2      74 4B         je      short 0045033F
004502F4      8B87 8C000000 mov   eax, dword ptr
004502FA      C687 64010000>mov   byte ptr , 1
00450301      8B88 2C080000 mov   ecx, dword ptr
00450307      3959 28       cmp   dword ptr , ebx
0045030A      7E 0A         jle   short 00450316
0045030C      C787 F4550000>mov   dword ptr , 3E8
00450316      83B8 FC070000>cmp   dword ptr , 2
0045031D      74 20         je      short 0045033F
0045031F      8B80 84070000 mov   eax, dword ptr
00450325      6A 01         push    1
00450327      E8 A44F0C00   call    005152D0
0045032C      8B97 8C000000 mov   edx, dword ptr
00450332      8BBA 3C080000 mov   edi, dword ptr
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
0045034F      897C24 64   mov   dword ptr , edi
00450353      895C24 60   mov   dword ptr , ebx
00450357      885C24 50   mov   byte ptr , bl
0045035B      E8 D03FFBFF   call    00404330
00450360      895C24 6C   mov   dword ptr , ebx
00450364      6A 14         push    14
00450366      68 84756600   push    00667584                         ;      点击返回游戏
0045036B      8D4C24 30   lea   ecx, dword ptr
0045036F      897C24 48   mov   dword ptr , edi
00450373      895C24 44   mov   dword ptr , ebx
00450377      885C24 34   mov   byte ptr , bl
0045037B      E8 B03FFBFF   call    00404330
00450380      C64424 6C 01mov   byte ptr , 1
00450385      6A 0B         push    0B
00450387      68 9C756600   push    0066759C                         ;   游戏暂停
0045038C      8D4C24 14   lea   ecx, dword ptr
00450390      897C24 2C   mov   dword ptr , edi
00450394      895C24 28   mov   dword ptr , ebx
00450398      885C24 18   mov   byte ptr , bl
0045039C      E8 8F3FFBFF   call    00404330
004503A1      6A 03         push    3
004503A3      8D4C24 48   lea   ecx, dword ptr
004503A7      51            push    ecx
004503A8      8D5424 30   lea   edx, dword ptr
004503AC      52            push    edx
004503AD      8D4C24 18   lea   ecx, dword ptr
004503B1      51            push    ecx
004503B2      C64424 7C 02mov   byte ptr , 2
004503B7      8B06          mov   eax, dword ptr
004503B9      8B90 20010000 mov   edx, dword ptr
004503BF      6A 01         push    1
004503C1      6A 13         push    13
004503C3      8BCE          mov   ecx, esi
004503C5      FFD2          call    edx
004503C7      837C24 24 10cmp   dword ptr , 10
004503CC      8BF0          mov   esi, eax
004503CE      72 0D         jb      short 004503DD
004503D0      8B4424 10   mov   eax, dword ptr
004503D4      50            push    eax
004503D5      E8 C0BD1C00   call    0061C19A
004503DA      83C4 04       add   esp, 4
004503DD      837C24 40 10cmp   dword ptr , 10
004503E2      897C24 24   mov   dword ptr , edi
004503E6      895C24 20   mov   dword ptr , ebx
004503EA      885C24 10   mov   byte ptr , bl
004503EE      72 0D         jb      short 004503FD
004503F0      8B4C24 2C   mov   ecx, dword ptr
004503F4      51            push    ecx
004503F5      E8 A0BD1C00   call    0061C19A
004503FA      83C4 04       add   esp, 4
004503FD      C74424 6C FFF>mov   dword ptr , -1
00450405      837C24 5C 10cmp   dword ptr , 10
0045040A      897C24 40   mov   dword ptr , edi
0045040E      895C24 3C   mov   dword ptr , ebx
00450412      885C24 2C   mov   byte ptr , bl
00450416      72 0D         jb      short 00450425
00450418      8B5424 48   mov   edx, dword ptr
0045041C      52            push    edx
0045041D      E8 78BD1C00   call    0061C19A
00450422      83C4 04       add   esp, 4
00450425      D905 149A6700 fld   dword ptr
0045042B      83EC 08       sub   esp, 8
0045042E      D95C24 04   fstp    dword ptr
00450432      897C24 64   mov   dword ptr , edi
00450436      D905 B89A6700 fld   dword ptr
0045043C      895C24 60   mov   dword ptr , ebx
00450440      885C24 50   mov   byte ptr , bl
00450444      D91C24      fstp    dword ptr
00450447      8B86 58010000 mov   eax, dword ptr
0045044D      50            push    eax
0045044E      E8 2D760000   call    00457A80
00450453      6A 0A         push    0A
00450455      53            push    ebx
00450456      C786 2C010000>mov   dword ptr , 9B
00450460      E8 CB6A0000   call    00456F30
00450465      8B4E 3C       mov   ecx, dword ptr
00450468      8B7E 38       mov   edi, dword ptr
0045046B      8B1E          mov   ebx, dword ptr
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
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
00450497      5F            pop   edi
00450498      5E            pop   esi
00450499      64:890D 00000>mov   dword ptr fs:, ecx
004504A0      5B            pop   ebx
004504A1|.8BE5          mov   esp, ebp
004504A3|.5D            pop   ebp                              ;(initial cpu selection)
004504A4\.C3            retn

这个函数,其实就是创建干扰窗口的函数,我们把这个函数整体清理掉
我的做法是 004502C6 到004504A0 全部nop填充
这样就行了,当我们去做别的事情的时候,程序不会被断下来了。

jonny_yue 发表于 2010-2-27 14:17

实在是想不到啊哈哈人才顶你了

一步梦想 发表于 2010-2-27 15:37

这个游戏好玩啊!

200133088 发表于 2010-2-27 15:52

这个游戏很有意思

炫炫 发表于 2010-2-27 16:16

辛苦了,顶下吧

lanhai006 发表于 2010-2-27 17:37

呵呵   你很强大鉴定完毕

ucvsv 发表于 2010-2-27 19:46

很好,谢谢了

zhzzzz 发表于 2010-2-27 20:11

打了8小时。。下载了谢谢。

blss2008 发表于 2010-2-27 20:31

这个我也玩过,
有个朋友玩了3天多.
熬夜玩,拼命

TheCjw 发表于 2010-2-27 23:35

:lol

我考虑发个变态版出来~~~
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 植物大战僵尸 修改版[多开/修改游戏限制]