学习笔记

c1阶段-任务01:修改游戏存档(植物大战僵尸)

 

一、任务内容

ios14修改游戏存档 苹果修改游戏存档_植物大战僵尸

任务:使用二进制编辑器修改单机版植物大战僵尸的游戏存档,实现跳关卡(如5-1),修改金币数量(如100000金币)

二进制编辑器:win推荐hex editor neo,Linux或Mac使用vim的二进制编辑模式

ios14修改游戏存档 苹果修改游戏存档_ios14修改游戏存档_02

ios14修改游戏存档 苹果修改游戏存档_ios14修改游戏存档_03

 

二、实践过程

STEP01:软件准备

STEP02:找到游戏存档目录

  • 用户文件一般为C:\ProgramData\PopCap Games\PlantsVsZombies\userdata\user1.dat

STEP03:打开植物大战僵尸并新建一个用户;用Hex Editor 打开对应用户user1.dat的文件

ios14修改游戏存档 苹果修改游戏存档_植物大战僵尸_04

STEP04:尝试修改数据,首先寻找关卡、金币的存储地址

测试发现,04地址为关卡数目存储地址;08-0b均是金币存储地址;

STEP05:修改数据,探索关卡与金币的变化规律

 (1) 关卡规律

 

04地址

关卡数目 

规律

01

1-1

0*16+1 = 1

02

1-2

0*16+2 = 2

03

1-3

0*16+3 = 3

...

...

...

0b

2-1

0*16+b = 11

0c

2-2

0*16+c = 12

...

...

...

0f

2-5

0*16+15 =15

10

2-6

1*16+0 =16

...

...

...

由此得到关卡的修改规律

假设04地址为xy(十六进制数字);   关卡记为m-n; 

关卡顺序号w 为 (m-1)*10+n ; (w 为 十进制数字);

将十进制w 转为十六进制数字xy;

以此关系式可类推:

关卡4-1,1f;    关卡5-1,29 ;    关卡6-1,32 ;....

但是!关卡7-1,  计算得到  3d;   但实际游戏中会显示 “6-”;  后续更大的数字也均显示 “6-”;

故可发现该游戏最高关卡为6-10;

 

 (2) 金币规律

商店金币系统在关卡3-5(04地址大于19)后解锁;

金币存储位置为08-0b地址;

首先,探索08地址,其他地址(09-0b地址)均为0;

08地址

金币数目 

规律探索

01

10

0*  ?+ 1*10 = 10 

02

20

0* ? + 2*10 = 20 

...

...

...

10

160

(1*16+0)*10

20

320

(2*16+0)*10

21

330

(2*16+1)*10

...

...

...

ff

2550

(f*16+f)*10=(15*16+15)*10

...

...

...

发现规律:

金币数  = (x*16+y)* 10

最大金币数 ff  →  2550;

 

②探索09地址,金币存储位其他地址均为0;

01  →  2560    2550 +10?  发现与08地址有关联,比08地址最高数字高10;初始位置为2560;

02  →  5120    2560*2       发现依然符合倍数关系;

03  →  7680    2560*3       再次验证倍数关系;

......

10  →  40960  2560*16

11  →  43520  1*40960+1*2560

.....

 ff   →   15*40960+15* 2560  = 652800

发现规律:   (x*40960 + y* 2560)  =   (x*4096 + y* 256) *10   =   (x* (16)^3 + y* (16)^2) * 10 

以此类推可继续推导后续单个地址变化,不再赘述

结合08,09地址来看:

00 01    →     2560   =  (0*16+0)* 10   + (0* (16)^3 + 1* (16)^2)* 10

0002金币是5680;0003金币数是7680;0004金币是10240;。。。。

01 01    →    2570     =  (0*16+1)* 10   + (0* (16)^3 + 1* (16)^2)* 10

10 10    →    41120  =  (1*16+0)* 10   +   (1* (16)^3 + 0* (16)^2)* 10

10 11    →   43680   =  (1*16+0)* 10   +   (1* (16)^3 + 1* (16)^2)* 10

 

综合规律: 金币总数目 为  地址08,09,0a,0b   之和;

假设目标是10000,   0004金币是10240;只需要前08,09位置修改即可;

10000-7680=2320,

2320<2560;  由08位提供;得到e8;

最终得到 e8 03;

ios14修改游戏存档 苹果修改游戏存档_ios14修改游戏存档_05

ios14修改游戏存档 苹果修改游戏存档_单机版_06

ios14修改游戏存档 苹果修改游戏存档_单机版_07