学习笔记
c1阶段-任务01:修改游戏存档(植物大战僵尸)
一、任务内容
任务:使用二进制编辑器修改单机版植物大战僵尸的游戏存档,实现跳关卡(如5-1),修改金币数量(如100000金币)
二进制编辑器:win推荐hex editor neo,Linux或Mac使用vim的二进制编辑模式
二、实践过程
STEP01:软件准备
- 植物大战僵尸:任意单机版本
- hex editor neo下载:https://www.hhdsoftware.com/free-hex-editor
STEP02:找到游戏存档目录
- 用户文件一般为C:\ProgramData\PopCap Games\PlantsVsZombies\userdata\user1.dat
STEP03:打开植物大战僵尸并新建一个用户;用Hex Editor 打开对应用户user1.dat的文件
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;