首页 > 其他分享 >自写一个植物大战僵尸修改器

自写一个植物大战僵尸修改器

时间:2024-09-11 19:38:51浏览次数:1  
标签:return 自写 基址 获取 修改器 snapshot 模块 进程 僵尸

这也是学习游戏安全的一部分(确信

主要是体会一下游戏里面的各种数据修改大概是个什么样子。先拿这个比较 ez 的练练手,后面写点更有趣的(指 fps 的挂

希望写出来不是屎山

游戏版本:Plants vs. Zombies GOTY Edition(steam 的这玩意也没更新过吧

获取进程 id 和基址

这一步和游戏本身暂时没关系

Windows提供了CreateToolhelp32Snapshot函数来创建系统中进程快照,以及Process32FirstProcess32Next函数来遍历系统中的所有进程。

我们创建一个系统中所有进程的快照后,使用Process32First获取第一个进程信息,并通过Process32Next来遍历系统中的其他进程。每个进程的信息都保存在PROCESSENTRY32结构体中。遍历过程中,将每个进程的名字与 PlantVSZombie.exe 进行比较。如果找到匹配的进程名,则返回该进程的ID。这里使用wcscmp函数对进程名进行比较。

// 根据进程名获取进程 ID
DWORD GetProcessIDByName(const wchar_t* processName)
{
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 进程快照
    if (snapshot == INVALID_HANDLE_VALUE)
    {
        return 0;
    }

    PROCESSENTRY32 pEntry = {0}; // PROCESSENTRY32 结构体,用于存储进程信息
    pEntry.dwSize = sizeof(PROCESSENTRY32); // 不初始化的话下面的 Process32First 函数会失败
    if (!Process32First(snapshot, &pEntry)) // 获取第一个进程
    {
        CloseHandle(snapshot);
        return 0;
    }

    // 遍历进程列表
    do
    {
        wchar_t currentProcessName[MAX_PATH] = {0}; // 存储当前进程名
        wcscpy(currentProcessName, pEntry.szExeFile); // 将当前进程名拷贝到 currentProcessName
        if (wcscmp(currentProcessName, processName) == 0) // 如果当前进程名和目标进程名相同,返回进程 ID
        {
            CloseHandle(snapshot);
            return pEntry.th32ProcessID;
        }
    } while (Process32Next(snapshot, &pEntry)); // 获取下一个进程
    
    CloseHandle(snapshot); // 没有找到目标进程,关闭句柄
    return 0; 
}

在多模块的进程中,获取目标模块的基址是访问模块内存的前提。我们可以使用EnumProcessModules函数枚举出目标进程的所有模块,然后通过GetModuleFileNameEx函数匹配出目标模块,最终使用GetModuleInformation获取模块基址。

// 根据进程 ID 和模块名获取基址
LPVOID GetModuleBaseAddress(DWORD ProcessID, LPCWSTR moduleName)
{
    LPVOID lpBaseAddress = NULL;

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID); // 打开进程句柄
    if (hProcess == NULL)
    {
        return lpBaseAddress;
    }
    HMODULE hMods[1024]; // 存储模块句柄
    DWORD cbNeeded; // 存储模块句柄数量
    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) // 
    {
        DWORD dwModuleCount = cbNeeded / sizeof(HMODULE); // 模块数量
        for (DWORD i = 0; i < dwModuleCount; i++)
        {
            wchar_t szModuleName[MAX_PATH] = {0}; // 存储模块名
            if (GetModuleFileNameEx(hProcess, hMods[i], szModuleName, sizeof(szModuleName) / sizeof(wchar_t))) // 获取模块名
            {
                if (wcsstr(szModuleName, moduleName) != NULL) // 如果模块名包含目标模块名
                {
                    MODULEINFO moduleInfo = {0};
                    if (GetModuleInformation(hProcess, hMods[i], &moduleInfo, sizeof(moduleInfo))) // 获取模块信息,保存到 moduleInfo
                    {
                        lpBaseAddress = moduleInfo.lpBaseOfDll; // 获取模块基址
                        break;
                    }
                }
            }
        }
        CloseHandle(hProcess); // 关闭进程句柄
    }
    return lpBaseAddress;
}

无限阳光

这当然是最基本的一个功能

首先得把阳光的偏移给找出来,用我们最爱的 Cheat Engine

[自写一个植物大战僵尸修改器] 1

这里可以看见已经可以改阳光了,现在我们得找出修改阳光数值的基址在哪了,右键 -> 找出是什么访问了这个地址,

[自写一个植物大战僵尸修改器] 2

这里可以看见,两个偏移都是 0x5578,那随便看哪个都行,比如我们看这个 add eax

[自写一个植物大战僵尸修改器] 3

这里可以看见,edx 是 0x29C39328,那我们再搜这个值

[自写一个植物大战僵尸修改器] 4

这下地址就很多了,一个简单的筛查方法是,看地址的前2 3位,如果这几位相同的比较多,那大概率没啥用。这样我们就看到 0x3BBC1C0 这个地址,用它试试咯,依然是重复上面的过程

[自写一个植物大战僵尸修改器] 5

这次我们看见了绿色的基址,而且这个东西不是啥系统进程的,它就是 PVZ 进程里面的。我们用第一个试试

[自写一个植物大战僵尸修改器] 6

两层偏移,分别是 5578 和 868,然后确定,指针的结果就是我们地址栏里面最下面那一行,可以看见数值和阳光的值是一样的,那么这里就是修改阳光的基址了。

其实这四个绿色的基址都是修改阳光的,用同样的偏移都能指到 233 这个值

现在我们知道阳光的偏移是 +5578 +868了。

为什么我们要这么费力去找这个基址呢,我们重开一下这把游戏看看

[自写一个植物大战僵尸修改器] 7

可以看到,我们最开始改阳光的那个地址还是 233,没随着游戏重开变成 50,但是我们用基址+偏移找到的这个值随着改变了,我们修改这个50,现在的阳光也会随着改变。

现在我们右键看是什么改写了该指针指向的地址,然后种一个植物,对找到的汇编查看反汇编窗口

![[自写一个植物大战僵尸修改器] 8](F:\Desktop\My Blog's Backup\img[自写一个植物大战僵尸修改器] 8.png)

标签:return,自写,基址,获取,修改器,snapshot,模块,进程,僵尸
From: https://www.cnblogs.com/Here-is-SG/p/18408806

相关文章

  • 黑暗之魂 I&#038;II 合集,豪华中文,重制最终版-灭绝深渊-原罪学者+全DLC+修改器,解压即
    游戏截图《黑暗之魂I&II合集》是一款由FromSoftware开发的经典动作角色扮演游戏合集,囊括了《黑暗之魂》系列的前两部作品:《黑暗之魂:重制版》和《黑暗之魂II:原罪学者》。该合集为玩家提供了进入深邃而神秘的黑暗奇幻世界的机会,体验系列标志性的高难度战斗和复杂的叙事设......
  • 几大编程语言的植物大战僵尸,你更喜欢哪一个
    一、前言 植物大战僵尸,是一款不可多得的游戏,而且属于一玩就容易上头的游戏,接下来,小编将从自己经常使用的几大编程语言方面给大家实现植物大战僵尸这一游戏,下面我们一起来看看。 二、前端版本 这个版本,玩法很多,首先我们打开网页文件,如图:  点击开始按钮,然后就会出......
  • 《黑神话:悟空》 风灵月影修改器使用指南:详尽教程,助你轻松驾驭游戏
    《黑神话:悟空》是一款深受玩家喜爱的动作冒险游戏,其精美的画面和引人入胜的故事剧情吸引了众多粉丝。对于那些希望通过修改器来进一步增强游戏体验的玩家来说,“风灵月影”修改器是一个不错的选择。下面是如何使用这款修改器的详细步骤。获取修改器首先,你需要从一个可信赖的......
  • 植物大战僵尸杂交版v2.4最新版本(附下载链接)
    B站游戏作者潜艇伟伟迷于9月5日更新了植物大战僵尸杂交版2.4版本!!!,有b站账户的记得要给作者三连关注一下呀!新增益智模式。新增砸罐子模式、我是僵尸模式、更多的小游戏和道具。不多废话下载链接放上:夸克网盘链接:https://pan.quark.cn/s/a666d7b7e781新增窗口放大器工......
  • 《黑shen话悟空》终极修改器和所有游戏资源一览,你全都知道吗?
    最近最受瞩目的热点话题,无疑是游戏《黑shen话:悟空》。作为我国首款3A大作,自从20号首次亮相以来,大家的关注度一路攀升。无论你是热爱美丽风景的观光党,还是喜欢深究剧情细节的考证党,或者是追求刺激战斗体验的玩家,都必定能在这款游戏中找到自己所钟爱的元素,尽情满足自己的期待。......
  • 黑神话:悟空 —— 风灵月影修改器:物品数量调整及下载安装使用全教程
    一、下载与安装1.下载修改器获取途径:玩家可以通过奇游加速工具等辅助软件,一键直达“风灵月影”的官方网站,下载专为《黑神话:悟空》设计的修改器版本。此外,也可以从其他可信的第三方网站下载。注意事项:确保下载来源可靠,避免下载到带有恶意软件的版本。2.安装修改器解压文件......
  • 《黑神话:悟空》V1.0四十二项风灵月影修改器资源下载-3DM风灵月影游戏修改器使用功能汇
    在《黑神话:悟空》中,V1.0四十二项游戏修改器的使用方法需要仔细了解。这里为您详细说明,玩家首先要确保修改器与游戏版本匹配,然后按照特定的步骤启动和设置。注意相关参数的调整,谨慎操作以达到预期效果。下载和安装技巧安全下载:下载风灵月影修改器时,一定要确保文件的来源是可......
  • 游戏修改器之Cheat Engine
    下载地址: https://cheatengine.org/downloads.php游戏修改工具  汉化:1)找到翻译包并下载-->Downloads>Translations 2)下载的是一个压缩包,将其解压并放到CE的安装目录languages下,并根据language.ini中的配置项;Ifthe--LANGparameterORtheLANGenvironmentvari......
  • mac苹果电脑游戏:植物大战僵尸中文版 for Mac
     《植物大战僵尸》以其简单的游戏机制、易于上手的特性和深度的策略性,成为了一款老少皆宜的游戏,深受全球玩家的喜爱。基本介绍:游戏玩法:玩家需要在一个后院场景中种植各种植物来防御僵尸入侵。每种植物都有不同的功能,例如豌豆射手可以发射豌豆攻击僵尸,而坚果墙则可以阻挡僵......
  • 探索《江湖录》:风灵月影四十九项修改器的使用指南
    《江湖录》是一款深受玩家喜爱的角色扮演游戏,以其丰富的剧情、多样的任务和独特的武侠世界而闻名。为了帮助玩家更好地体验游戏,风灵月影团队推出了一款强大的游戏修改器,提供了多达四十九项功能,极大地提升了游戏的可玩性和乐趣。《江湖录》风灵月影四十九项修改器https://down......