从修改植物大战僵尸了解游戏存储
字数 1158 2025-08-22 18:37:22

《植物大战僵尸》游戏内存修改技术详解

一、工具准备

Cheat Engine (CE)

  • 功能特点
    • 内存扫描与编辑:可扫描游戏内存地址,修改特定数据值(如生命值、金钱等)
    • 代码注入:支持编写或使用现成脚本修改游戏行为
    • 游戏速度控制:可加速或减速游戏运行
    • 内存管理:提供内存监视、搜索等功能
    • 多平台支持:主要支持Windows系统
  • 官网下载:https://www.cheatengine.org/downloads.php

二、基本概念

1. 内存地址

  • 游戏数据以特定地址存储在程序中
  • 修改思路:通过CE找到特定数据(如阳光)的存储地址,然后修改该地址的值

2. 基地址与偏移量

  • 基地址(Base Address):游戏在内存中存储数据的起始点
  • 偏移量(Offset):从基地址到目标数据位置的距离
  • 完整地址 = 基地址 + 偏移量

三、实战修改阳光值

1. 准备工作

  1. 下载植物大战僵尸(示例使用B站up主开发的杂交版)
  2. 打开CE并附加游戏进程

2. 查找阳光地址

  1. 进入游戏关卡,记录当前阳光值(如500)
  2. 在CE中输入当前阳光值,点击"首次扫描"
  3. 改变阳光值(种植植物或获取阳光)
  4. 在CE中输入新的阳光值(如375),点击"再次扫描"
  5. 通常此时会得到一个唯一地址,双击保存到下方列表

3. 解决地址失效问题

  • 问题:当前找到的地址可能只在当前关卡有效
  • 解决方法:查找偏移量
    1. 右键找到的地址,选择"找到是什么改写的这个地址"
    2. 返回游戏改变阳光值
    3. CE会弹出两行代码(增加和减少操作)
    4. 双击代码查看,注意标红部分(如+5560)即为偏移量
    5. 记录代码中显示的地址(可能是指向该地址的指针)

4. 查找基地址

  1. 在CE的hex选项中输入记录的地址,进行新扫描
  2. 逐个检查返回的地址,寻找规律性偏移量(如常见的768)
  3. 找到绿色地址(CE中绿色代表基地址)
  4. 保存基地址和两个偏移量

5. 手动添加地址

  1. 在CE右下方点击"手动添加地址"
  2. 按照以下格式添加:
    • 基地址
    • 第一级偏移量(如768)
    • 第二级偏移量(如5560)
  3. 验证:重新开始关卡,修改阳光值应能生效

四、Python自动化修改

1. 所需库

import win32gui, win32api, win32process, ctypes
from win32con import PROCESS_ALL_ACCESS

2. 核心函数

# 载入kernel32.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]

3. 完整实现

# 获取窗口句柄
hwnd = win32gui.FindWindow(0, "植物大战僵尸v2.2")

# 通过窗口句柄获取进程ID
pid = win32process.GetWindowThreadProcessId(hwnd)[1]

# 通过进程ID获取句柄
handle = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid)

# 设置变量
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)
    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)

4. 常见问题解决

  • 窗口标题乱码问题
    1. 打开控制面板 > 区域
    2. 取消勾选"Beta版:使用Unicode UTF-8提供全球语言支持"
    3. 重启计算机

五、总结流程

  1. 确定要修改的数据(如阳光值)
  2. 通过数据变动筛选可能的地址
  3. 如果存在多重地址,寻找偏移量
  4. 递归查找直到确定基地址
  5. 组合基地址和偏移量构建稳定可用的地址
  6. 通过编程实现自动化修改

六、注意事项

  1. 游戏版本不同可能导致基地址和偏移量变化
  2. 修改前建议备份游戏存档
  3. 过度修改可能影响游戏平衡性和乐趣
  4. 在线游戏中使用内存修改可能违反服务条款
《植物大战僵尸》游戏内存修改技术详解 一、工具准备 Cheat Engine (CE) 功能特点 : 内存扫描与编辑:可扫描游戏内存地址,修改特定数据值(如生命值、金钱等) 代码注入:支持编写或使用现成脚本修改游戏行为 游戏速度控制:可加速或减速游戏运行 内存管理:提供内存监视、搜索等功能 多平台支持:主要支持Windows系统 官网下载 :https://www.cheatengine.org/downloads.php 二、基本概念 1. 内存地址 游戏数据以特定地址存储在程序中 修改思路:通过CE找到特定数据(如阳光)的存储地址,然后修改该地址的值 2. 基地址与偏移量 基地址(Base Address) :游戏在内存中存储数据的起始点 偏移量(Offset) :从基地址到目标数据位置的距离 完整地址 = 基地址 + 偏移量 三、实战修改阳光值 1. 准备工作 下载植物大战僵尸(示例使用B站up主开发的杂交版) 打开CE并附加游戏进程 2. 查找阳光地址 进入游戏关卡,记录当前阳光值(如500) 在CE中输入当前阳光值,点击"首次扫描" 改变阳光值(种植植物或获取阳光) 在CE中输入新的阳光值(如375),点击"再次扫描" 通常此时会得到一个唯一地址,双击保存到下方列表 3. 解决地址失效问题 问题:当前找到的地址可能只在当前关卡有效 解决方法:查找偏移量 右键找到的地址,选择"找到是什么改写的这个地址" 返回游戏改变阳光值 CE会弹出两行代码(增加和减少操作) 双击代码查看,注意标红部分(如+5560)即为偏移量 记录代码中显示的地址(可能是指向该地址的指针) 4. 查找基地址 在CE的hex选项中输入记录的地址,进行新扫描 逐个检查返回的地址,寻找规律性偏移量(如常见的768) 找到绿色地址(CE中绿色代表基地址) 保存基地址和两个偏移量 5. 手动添加地址 在CE右下方点击"手动添加地址" 按照以下格式添加: 基地址 第一级偏移量(如768) 第二级偏移量(如5560) 验证:重新开始关卡,修改阳光值应能生效 四、Python自动化修改 1. 所需库 2. 核心函数 3. 完整实现 4. 常见问题解决 窗口标题乱码问题 : 打开控制面板 > 区域 取消勾选"Beta版:使用Unicode UTF-8提供全球语言支持" 重启计算机 五、总结流程 确定要修改的数据(如阳光值) 通过数据变动筛选可能的地址 如果存在多重地址,寻找偏移量 递归查找直到确定基地址 组合基地址和偏移量构建稳定可用的地址 通过编程实现自动化修改 六、注意事项 游戏版本不同可能导致基地址和偏移量变化 修改前建议备份游戏存档 过度修改可能影响游戏平衡性和乐趣 在线游戏中使用内存修改可能违反服务条款