引言
在数字娱乐的浩瀚海洋中,电子游戏以其独特的互动性和沉浸感,成为现代人生活中不可或缺的一部分。而在众多游戏类型中,策略塔防游戏以其独特的挑战性和策略性,赢得了广大玩家的喜爱。《植物大战僵尸》(Plants vs. Zombies)便是其中的佼佼者,以其独特的游戏设计和趣味性,风靡全球。
然而,对于游戏爱好者和开发者来说,游戏的内在机制和存储方式往往是神秘而引人入胜的。《从修改植物大战僵尸了解游戏存储》这篇文章,将带领读者深入游戏的后台,探索游戏数据的存储原理和修改技巧,不仅能够满足玩家对游戏个性化的需求,也为游戏开发和数据管理提供了宝贵的视角。
本文将从《植物大战僵尸》的修改器入手,逐步解析游戏数据的存储结构,探讨如何通过修改游戏文件来实现个性化设置,以及这些修改对游戏平衡性和可玩性的影响。我们将一起揭开游戏数据存储的神秘面纱,理解游戏设计者如何通过巧妙的数据管理,创造出既公平又有趣的游戏体验。
随着技术的不断进步,游戏修改不再只是简单的作弊手段,它已经成为一种艺术,一种对游戏深层次理解的体现。通过本文的学习,读者将能够获得以下几方面的知识:
游戏数据存储的基本原理和常见格式。
《植物大战僵尸》中数据存储的具体实现方式。
如何安全有效地修改游戏数据,以实现个性化游戏体验。
修改植物大战僵尸实战
正文:
现在主流查看游戏都是通过Cheat Engine 来完成
Cheat Engine 是一款功能强大的内存编辑工具,它允许用户修改电脑游戏的内存数据,从而实现作弊效果。以下是对 Cheat Engine 的一些基本介绍:
功能特点
内存扫描与编辑:Cheat Engine 可以扫描游戏的内存地址,找到特定的数据值,如生命值、金钱、分数等,并允许用户修改这些值。
代码注入:用户可以编写或使用现成的脚本,通过 Cheat Engine 来执行特定的操作或修改游戏行为。
游戏速度控制:Cheat Engine 可以控制游戏的运行速度,包括加速或减速。
内存管理:提供内存管理功能,如内存监视、内存搜索等。
多平台支持:虽然 Cheat Engine 主要用于 Windows 系统,但也存在一些版本或插件可以支持其他操作系统。
官网下载:https://www.cheatengine.org/downloads.php
首先我们需要知道的是,游戏里面的数据都是以一定地址存储在程序中的
我们的主要思路就是通过CE找到特定数据(比如阳光)存储的地址,然后通过地址来修改值
下载植物大战僵尸(这里我用B站up主开发的植物大战僵尸杂交版为例)
找到阳光存储的地址
根据这个操作打开
附加程序后
我们随便打开一个关卡
我们可以看见现在的阳光值为500
然后点击首次扫描
可以看见左边返回了很多地址
这个时间我们改变阳光值(通过种植植物或者获取阳光)
重新输入375
再次扫描
可以发现这里只有一个地址了
双击这个地址保存在下方
在下方,我们点击右边数值进行修改其实就可以完成修改阳光值了
但是!
这里又涉及基地址和偏移量的知识
基地址(Base Address)
基地址是游戏在内存中存储数据的起始点。在计算机中,每个程序运行时都会分配一块内存空间,这块空间的起始位置就是基地址。对于《植物大战僵尸》来说,基地址是游戏数据存储的起点,所有与游戏相关的内存地址都是从这个基地址开始计算的。
偏移量(Offset)
偏移量是指从基地址开始,到你想要修改的数据的实际位置的距离。由于游戏内存中的数据并不是连续存储的,而是按照一定的结构排列,所以你需要通过偏移量来定位到特定的数据。例如,阳光值可能存储在基地址之后的某个特定位置,这个位置与基地址之间的距离就是偏移量。
我们现在得到的地址是:基地址+偏移量,可能在这一关中,我们修改地址可以成功
但是如果我们再开一关,可以发现这个地址就没有用处了
这个时候我们就需要去找到偏移量了
在下方右键我们找到的地址,选择"找到是什么改写的这个地址"
在这个界面后,我们回到游戏
当我们阳光发生改变时,会弹出两行代码(一行是增加,一行是减少,如果只进行了一个操作,那么只有一行代码)
双击代码查看
可以看见这里有标红并且有个+5560
这个就是偏移量
(两个代码的都是5560)
大家也可以看见,这里还有一行
这个就是CE自己帮我们找到的,可能是指向这个地址的地址
我们记住这个地址
点击hex选项,填入地址,并且点击新的扫描
这个时候就出现了很多地址
我们只能一个一个去看,哪个像
ctrl+F5是快捷查看
这种
这种就明显不是(需要大家自己多看看程序掌握一下)
这个过程可能很久
大家看见这个没
后面统一的偏移量都是768
这种一般就是正确的(很多情况都是去试错后,才发现正确的)
添加这个地址
找到新的地址
对新的地址进行查找
这里我们可以看见
出现了绿色的地址!
在CE中,绿色的地址,代表了基地址
我们随便找一个就行,保存一下
现在我们就保存了三个地址
和两个偏移量
点击右下方有个<手动添加地址>
按照我这样存入
我们可以发现
现在就有了一个地址,指向我们的阳光
我们现在重新开一关
还没进入关卡的时候,因为没有阳光,所以是问号
进入关卡后,就成为了初始值
我们改一下值试一试:
双击下方的500
输入一个你想要改的阳光
成功!
编写python程序
现在我们知道了基地址和两偏移地址,我们利用win32来获取植物大战僵尸的程序
从而根据地址来改写程序
import win32gui, win32api, win32process, ctypes
from win32con import PROCESS_ALL_ACCESS
# 载入 kernel32.dll,Windows 读写内存的函数在这个 dll 里面,一般是放在这个地址下的,如果不同自行修改就是
kernel32 = ctypes.windll.LoadLibrary(r"C:\Windows\System32\kernel32.dll")
# 用于通过基址获取最终的地址
def GetAddress(handle, BaseAddress, offset=[]):
value = ctypes.c_long()
kernel32.ReadProcessMemory(int(handle), BaseAddress, ctypes.byref(value), 4, None)
for i in range(len(offset) - 1):
kernel32.ReadProcessMemory(int(handle), value.value + offset[i], ctypes.byref(value), 4, None)
return value.value + offset[len(offset) - 1]
# 获取窗口句柄
hwnd = win32gui.FindWindow(0, "植物大战僵尸v2.2 ")
# 通过窗口句柄获取进程 ID,该函数返回一个列表,进程 ID 是在第二个元素
pid = win32process.GetWindowThreadProcessId(hwnd)[1]
# 通过进程 ID 获取句柄
handle = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid)
# ctypes.c_long() 返回的是一个 C 语言 long 类型变量
showSun = ctypes.c_long()
changeSun = ctypes.c_long()
base_address = 0x6a9ec0 # 这里是你的基址
sun_offset = [0x768, 0x5560] # 这里是你的偏移量
while 1:
print("输入-1,结束程序")
address = GetAddress(handle, base_address, sun_offset)
# ctypes.byref(showSun) 相当于取 showSun 的指针
kernel32.ReadProcessMemory(int(handle), address, ctypes.byref(showSun), 4, None)
print("{}{}".format("当前阳光:", showSun.value))
changeSun.value = int(input("要修改成多少:"))
if(changeSun.value==-1):
print("结束")
exit()
kernel32.WriteProcessMemory(int(handle), address, ctypes.byref(changeSun), 4, None)
这里找到句柄是根据你窗口标题来的
比如我这里,是这个
可能有些朋友是一群乱码
解决办法-控制面板
区域
这里如果勾选了的朋友,取消勾选,重启一下就OK了
总结:
我们要修改一个程序,首先确定我们修改的数据的地址,通过数据的变动来减少可能的地址数量,最后通过筛选来却地址,如果存在多重地址,寻找偏移量,直到找到基地址