《植物大战僵尸》 辅助编写2—— 植物无CD

0041BA60 地址的函数 总阳光减去了植物需要的阳光。 要想实现无CD,我们可以从这里入手。

猜测存在 植物卡片这样的类。只要找到Suncost阳光消耗的地址,附近应该就有CD的地址。

class PlantCard{
    int PlantId;
    int SunCost; //
    int PlantDamage;
    string PlantName;
    float CD; //second
  
    string PlantUI; //
    ...
}

寻找suncost的地址

0041BA60 函数中ebx的值是阳光消耗的值,调用它的00410871地址附近由 mov ebx, eax赋值阳光消耗值。

接着我们发现eax的值在0041086A调用了plantsvszombies.sub_41DAE0后变为有效值。

; sub_41DAE0 获取植物的信息
push ebx
push esi
mov ebx,eax
call <plantsvszombies.sub_467B00 获取植物的阳光开销>
cmp ebx,28	;ebx 是植物的id
mov esi,eax
je plantsvszombies.41DB13
cmp ebx,2C
je plantsvszombies.41DB13
cmp ebx,29
je plantsvszombies.41DB13
cmp ebx,2E
je plantsvszombies.41DB13
cmp ebx,2F
je plantsvszombies.41DB13
cmp ebx,2D
je plantsvszombies.41DB13
cmp ebx,2A
je plantsvszombies.41DB13
cmp ebx,2B
jne plantsvszombies.41DB35
mov eax,dword ptr ds:[edi+8C]
mov eax,dword ptr ds:[eax+7F8]
add eax,FFFFFFF5
cmp eax,4
ja plantsvszombies.41DB33
mov edx,edi
call <plantsvszombies.sub_40D3F0>
imul eax,eax,32
add esi,eax
mov eax,esi
pop esi
pop ebx
ret 

进入sub_41DAE0函数,发现 eax的值在调用了sub_467B00函数后发生变化。继续跟进这个函数。

;sub_467B00  获取植物的阳光开销 参数eax为植物id
mov ecx,dword ptr ds:[6A9EC0]
mov ecx,dword ptr ds:[ecx+7F8]
cmp ecx,14
je plantsvszombies.467B16
cmp ecx,18
jne plantsvszombies.467B4D
cmp eax,7
jne plantsvszombies.467B21
mov eax,3E8
ret 
cmp eax,A
jne plantsvszombies.467B2C
mov eax,1F4
ret 
cmp eax,17
jne plantsvszombies.467B37
mov eax,FA
ret 
cmp eax,36
jne plantsvszombies.467B42
mov eax,64
ret 
cmp eax,37
jne plantsvszombies.467B4D
mov eax,C8
ret 
lea ecx,dword ptr ds:[eax-38]
cmp ecx,12
ja plantsvszombies.467B89
jmp dword ptr ds:[ecx*4+467BAC]
xor eax,eax
ret 
mov eax,32
ret 
mov eax,4B
ret 
mov eax,15E
ret 
mov eax,7D
ret 
mov eax,96
ret 
mov eax,AF
ret 
mov eax,12C
ret 
cmp eax,30
jne plantsvszombies.467B9E
cmp edx,FFFFFFFF
je plantsvszombies.467B9E
lea edx,dword ptr ds:[edx+edx*8]
mov eax,dword ptr ds:[edx*4+69F2C0]
ret 
lea eax,dword ptr ds:[eax+eax*8]
mov eax,dword ptr ds:[eax*4+69F2C0]  ; eax传入的值是0x9, 获得的值是0x32,也就是向日葵的阳光开销
ret 

到这里可以确定 sub_467B00 获取植物的阳光开销

此时我们发现了一个静态地址 69F2C0 ,在dump里观察它的值。

结合代码lea eax,dword ptr ds:[eax+eax*8] mov eax,dword ptr ds:[eax*4+69F2C0] ; 我们可以得出一个结论 PlantCard类的大小是 36字节

第一个4字节是 阳光的开销。

第二个4字节感觉是植物的血量。 因为第4个图鉴就是土豆,而他的值是5000,高出第二个向日葵750的值很多。

但将向日葵的第二个int调整为8000后,也是几秒钟就被吃掉了,于是将其调整为1,发现原来是CD。100代表1秒。

posted @ 2023-02-06 21:10  dewxin  阅读(257)  评论(0编辑  收藏  举报