植物大战僵尸——任意阳光修改

简介

??这是植物大战僵尸系列的第一个练习,目的是实现任意阳光修改功能。

原理

??该功能的原理其实很简单,大致步骤就是:

1. 开始任意一局游戏;
2. 找到该局游戏的阳光值在内存中的地址;
3. 根据该地址,找到游戏阳光的基地址;
4. 编写一个手动修改该值的小程序。

准备

  • 系统:Windows 7 SP1 x64 ultimate
  • 游戏:植物大战僵尸
  • 工具:CheatEngine v6.7、VisualStudio 2017

分析

确定阳光位置

??启动游戏,打开任意一局游戏。

可以看到此时游戏中的阳光值为50。

??CE加载游戏,使用精确搜索,定位阳光在内存中的位置。因为一般情况下第一次的搜索结果会很多,所以多次改变阳光值,并多次搜索,最终确定位置。

??试着修改该地址的值,确定该地址是否正确,如果不正确会影响后面的分析。

可以看出来阳光的变化,可以确定这就是阳光在内存中存储的位置了。

确定阳光基地址

??确定阳光在内存中位置就可以实现该局中阳光值任意修改,但是只限于该局中,因为这个位置是动态变化的,每一句有不一样。那我们总不能每一次都用CE搜索一次吧,那样就太麻烦了。我们希望可以使用程序来替我们完成计算阳光位置的功能,但是我们无法确定阳光每次的位置。这时就需要看游戏本身如何确定这个位置了。

??对于游戏本身而言,在每局游戏前,都会根据一个基地址来计算出本局游戏的阳光存储位置,然后游戏对这个地址进行一系列写入与读取的操作,代表了游戏中阳关的修改和显示。而这之中的基地址就是我们需要找到的。基地址是不变的,所以我们可以利用基地址计算出每一局游戏阳光的存储位置。

??利用刚才确定的阳光地址,定位哪些位置对这个地址进行了访问操作。

可以看到 esi 和 edx 两个位置偏移 00005560 的位置被访问,esi 和 edx 就是阳光位置的指针,所以我们需要找到哪些地址存储了 esi 和 edx 的值,即0x0F3C4FC8。

搜索后发现有很多结果,这时需要一个一个排除,但是这里根据经验,与其他地址差别最大的可能性最大,而这里有两个差别很大,所以一个一个排除。经过分析和测试,确定是0x026630A0。查看哪些地址访问。

可以看到有一个指针,寄存器+00000768,而该寄存器的值都为0x026630A0,可以知道 0x026630A0 就是我们要找的第二级指针。

??搜索哪些位置存储第二级指针,和上次的方法一样排除。确定位置 0x006A9EC0。查看哪些地址访问。

发现竟然是固定地址,那么可以确定这就是阳光的基地址了。

??关于如何排除问题,我的方法就是查看哪些地址访问该地址,然后去收阳光或者种植物,看访问列表有没有什么动静,然后看看每个访问指令中。我们搜索的地址的值是否是我们之前确定的值。有些不明白,我现在也说不清楚,自已多意会吧。

??在确定基地址后,可以测试下正不正确。添加一个基地址指针,

然后新开一局游戏,修改基地址指针的值,看是否成功。

编写阳光修改器

??确定了阳光的基地址后,就可以开始编写阳光修改器了。程序大致分为几步:

1. 获取游戏进程ID(我电脑上的进程名为Plants.vs.Zombies.exe)
2. 获取游戏进程内存权限
3. 计算阳光位置
4. 将目标值写入阳光位置

??参照这三步,即可完成阳光修改器的编写。下面是一些核心代码:

获取游戏进程ID和游戏进程权限。

    //拍摄系统进程快照,获取游戏进程
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        MessageBox(0, L"系统快照拍摄失败!", L"错误", MB_OK);
        return false;
    }
    bRet = Process32First(hProcessSnap, &pe32);
    while (bRet)
    {
        if (!wcscmp(pe32.szExeFile, L"Plants.vs.Zombies.exe"))
        {
            targetid = pe32.th32ProcessID;
            break;
        }
        bRet = Process32Next(hProcessSnap, &pe32);
    }
    CloseHandle(hProcessSnap);
    if (targetid == 0)
    {
        MessageBox(0, L"没有找到游戏进程", L"失败", MB_OK);
        return false;
    }

    //打开游戏进程
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetid);
    if (hProcess == INVALID_HANDLE_VALUE)
    {
        MessageBox(0, L"打开游戏进程失败", L"错误", MB_OK);
        return false;
    }

计算当前阳光位置,修改阳光值。

    //计算阳光地址
    //读取第一层地址
    if (!ReadProcessMemory(hProcess, (LPCVOID)dwBaseAddr, (LPVOID)&dwTempAddr, sizeof(DWORD), 0))
    {
        MessageBox(L"读取第一层地址失败", L"失败", MB_OK);
        return;
    }
    //读取阳光地址
    if (!ReadProcessMemory(hProcess, (LPCVOID)(dwTempAddr + 0x768), (LPVOID)&dwTempAddr, sizeof(DWORD), 0))
    {
        MessageBox(L"读取阳光地址失败", L"失败", MB_OK);
        return;
    }
    //读取阳光
    dwYangguangAddr = dwTempAddr + 0x5560;
    if (!ReadProcessMemory(hProcess, (LPCVOID)dwYangguangAddr, (LPVOID)&dwYangValue, sizeof(DWORD), 0))
    {
        MessageBox(L"读取阳光失败", L"失败", MB_OK);
        return;
    }

    //修改阳光值
    if (!WriteProcessMemory(hProcess, (LPVOID)dwYangguangAddr, (LPCVOID)&m_nYangguang, sizeof(int), 0))
    {
        MessageBox(L"阳光修改失败", L"失败", MB_OK);
        return;
    }
    MessageBox(L"阳光修改成功", L"成功", MB_OK);

启动修改器,输入期望阳光值。

返回游戏查看。

??到此,我们已经实现了我们的目的,任意修改阳光并编写了我们自己的阳光修改器。

参考

原文地址:https://www.cnblogs.com/Roachs/p/9365240.html

时间: 2024-08-29 12:50:09

植物大战僵尸——任意阳光修改的相关文章

从植物大战僵尸开始一步一步带你入门逆向工程,

逆向工程扫盲篇 最近又来了一群对逆向工程感兴趣的同学,我这里带领大家来一次逆向工程初体验. 在这里我们会 修改弹框的值 修改植物大战僵尸的阳光 编译并运行以下C程序 使用的工具:Devcpp #include<windows.h> int main(){ MessageBox(0,"Hello world","title",MB_OK); return 0; } 编译后如上所示. 运行结果如下: 下面我们来一步一步修改HelloWorld IDA的基本使

python修改内存,(修改植物大战僵尸)

import win32process # 进程模块 import win32con # 系统定义 import win32api # 调用系统模块 import ctypes # c语言类型 import win32gui #界面 import time # 系统常量,标识最高权限打开一个进程 PROCESS_ALL_ACCESS = (0x000F0000|0x00100000|0xFFF) # |位运算, 0x 十六进制 window = win32gui.FindWindow("Main

植物大战僵尸修改器DIY(二)CD详解[转]

前言 之前做星际的时候,就有兄弟们说,为啥不做一个原子弹无CD呀.好像大家对CD这个东西挺感兴趣,那我们这一篇就来研究一下,做无CD的思路吧. 这个植物大战僵尸系列呢,目前暂定想法就是3-4集的样子.主要就是针对于各种不同的功能,进行一个思路的引导和分析.最后一集的时候,会介绍如果使用易语言和AA引擎,将他直接制作成一个真正的修改器,尽情期待. PS:我讲的是思路,植物大战僵尸,只是一个例子,大家可以把思路拓展到别的方面去,注重思维灵活. 欢迎文明转载,请注明出处  丸子de爸爸 本文所有技术资

植物大战僵尸游戏内存地址

<植物大战僵尸内存地址> 英文原版 查找地址 一级基址:0x006A9EC0 阳光:  +768  +5560 金币:  +82c  +28 <模式> 冒险:  +82c  +24 其他模式:  +7f8 //16起 70结尾 <花园> 花肥  +82c  +1f8 杀虫剂 +82c  +1fc 巧克力 +82c  +228 树肥  +82c  +230 智慧树  +82c  +31*4 +30=f4 休闲花园花盆总数:  +82c  +350 花盆种类:  +82c 

植物大战僵尸作弊器源代码(MFC版)

控制版使用不太方便,此MFC版与控制台版内容一样.具体可以参考前面.此处只附源代码,不加以说明.......... 头文件 // jsMFCDlg.h : 头文件 // #pragma once // CjsMFCDlg 对话框 class CjsMFCDlg : public CDialogEx { // 构造 public: CjsMFCDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_JSMFC_DIALOG };

JAVA安卓植物大战僵尸主题四子棋游戏

@前言 这里使用安卓最基本的API实现双人四子棋游戏(无AI),开发语言为java,开发环境为Android Studio 2.1.2,目标SDK版本为24,最低为15: 界面采用植物大战僵尸主题,图片资源来源于网络,进行了PS加工,非原创: 游戏界面基本可以适配所有安卓手机分辨率,不过在分辨率太大或太小的手机上整体效果会有影响: Github源码: https://github.com/jiangxh1992/FourInRowGame 视频演示: https://vimeo.com/1875

植物大战僵尸(8):分析植物的攻击速度

实验目标:植物大战僵尸中,植物是有攻击速度的,比如每隔一段时间会吐出一些子弹,那么由此可判断吐出子弹应该是由一个计数器控制的,也就是说只要我们能够找到控制植物攻击的时钟并改写它,也就可以实现植物的无限吐子弹. 吐出子弹的遍历技巧: CE附加游戏 -> 手动种下豌豆射手 -> 搜索未知初始化数据(未攻击) 出现僵尸 -> 开始攻击的时候 -> 使用变速精灵或变速齿轮将攻击速度放慢 -> 搜索减少的数值 回到游戏 -> 马上回到CE -> 搜索减少的数值 ->

BZOJ 1565 植物大战僵尸(最大权闭合图)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1565 题意:植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性:(1)价值:(2)保护集合,也就是这个植物可以保护矩阵中的某些格子.现在你是僵尸,你每次只能从(i,m) 格子进入,从右向左进攻.若一个格子是被保护的那么你是不能进入的.每进入一个格子则吃掉该格子的植物并得到其价值(价值有可能是负的).注意,每次在进 入一行后还可以再退到最右侧然后再换一行吃别的.问

植物大战僵尸农场理财系统定制开发

对于在新时期.新常态下好项目,创新才能引人关注,植物大战僵尸农场理财系统开发,咨询电话:156-2272-1962. 植物大战僵尸系统奖励制度开发 奖励:开拓市场奖励 拿九级佣金收益,一代4%.二代2%.三代1%,四-九代0.5% 购买一块土地20元永久使用 购买一个神兽9.9元可看家护院保护期3天 奖励:购买种子奖 1.呆呆米:20元/颗,24小时采摘一次,采摘一次2.88-3.6元,15天枯萎! 化肥1元一袋一天一次施肥 投资种子化肥共35元,15天收益54元左右 2.萌萌菇:50元/颗,2