植物大战僵尸 修改版(一)
这一段时间,周围很多朋友玩一个叫植物大战僵尸这个游戏,我也耍了一下,是比较好玩,
可是后面的一些关还是有点难的,于是乎,就用逆向的知识修改一下。
这里主要修改了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填充
这样就行了,当我们去做别的事情的时候,程序不会被断下来了。

上传的附件
  植物大战僵尸 补丁.rar