植物大战僵尸阳光值修改以及阳光基地址寻找详细步骤~包含排除不符合条件的地址的讲解,以及如何观察地址情况等
Posted CYS.burst
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了植物大战僵尸阳光值修改以及阳光基地址寻找详细步骤~包含排除不符合条件的地址的讲解,以及如何观察地址情况等相关的知识,希望对你有一定的参考价值。
针对“阳光值”
采用3种以上的方法扫描至少3关的“阳光值”的内存地址,并能修改
利用精确值进行扫描,并修改阳光值
(1)利用初始的精确值进行扫描
(2)随后种植一株植物或者是捡起一个阳光,使得阳光的精确值发生变化,扫描变化后的精确值
(3)双击添加到记录中,然后修改阳光的数值并进行锁定
(4)修改后实现无限阳光的效果
综上所述,这个阳光值为1-9关卡的阳光值,本次游戏中阳关的内存地址为0DFEEE20,使用的方法是精确值扫描并且修改
利用增加或者减少的精确的数值进行扫描,并修改阳光值
(1)首先利用精确值扫面初始的阳光数
(2)种植植物使得阳光减少固定的数值(减少了50阳光)
(3)捡拾阳光使得阳光增加固定的值(增加了25阳光)
找到唯一地址
(4)双击添加到记录中,然后修改阳光的数值并进行锁定
综上所述,利用减少的数值以及增加的数字扫描,在本次游戏中第2-1关卡的阳光地址为1906F580。
利用增加或者减少的过程进行扫描,并修改阳光值
(1)首先因为阳光有初始值,所以我们使用初始值进行搜索
(2)根据种植植物阳光值这一动作,以及捡阳光时阳光值增加这一动作,对这个增加或者减少的过程进行扫描
(3)找到唯一的地址
(4)双击添加到记录中,然后修改阳光的数值并进行锁定
综上所述,利用数值增加或者减少这一过程进行扫描确定地址,在这次游戏中2-2关卡的阳光的地址为14F3A980
找到阳光值的内存基址,简述如何分析和找出基址的过程
分析:通过找出三个关卡中的阳光的地址值,或者时一个关卡重新开始的地址,我们可以从中发现,阳光值的地址一直是一个变换的数值,是一个动态的地址。
(1)首先我们需要找到某一关卡阳关的地址
(2)右键选择什么访问了这个地址(通过捡拾阳光实现改写)
(3)通过捡拾阳光实现阳光值的改变,这个时候访问阳光地址的就是阳光
(4)点击该记录然后查看详细信息,并记录偏移量
分析:在详细的信息中展示的是汇编语言的实现过程,[]中的值表示的是内存偏移地址,默认的寄存器是EDS,因此[]的出现表示的是内存的出现。即阳关的地址存放在内存单元中。
(5)根据详细信息中给出的十六进制数,进行新的搜索,搜索指针数值,此次搜索的是十六进制数值所以需要勾选数值框前面的Hex框
分析:通过搜索指针数值之后会发先还有很多的结果,此时我们根据所搜索到的地址的形式进行分析,在这些内存地址中以001开头的地址,以及以11F开头的地址出现的数目都是很多的,这么多的地址不具有特殊性,因此它们不会是阳光的基地址。然而此时出现了一个特殊的地址0275AC58、0DFEE1B4和0E15002C,这三个地址显然是很特殊的三个地址,那么在这么多地址中,由于它们比别的地址更加具有特殊性,那么它们就最有可能又来继续搜索静态基地址。
根据上述的分析,我们将目光锁定到了0275AC58、0DFEE1B4和0E15002C这三个最特殊的地址身上。
双击将这它们地址记录到下方。
(6)由于此时并没有出现绿色的静态基地址,所以我们继续搜索,右键点击,什么访问了这个地址
在这个地址下,采集阳光,这个表中没有发生变化,则此时可以排除这个地址
继续搜索其他地址
在观察什么访问了这个地址时,收集阳光,表中产生了变化,此时确定这个地址为一个正确的中间地址
两个都有发生变化,所以我们以其中一个进行试验
我们首先以0E15002C进行探讨(一个一个地址试),查阅详细信息
搜索这个十六进制数所对应的位置的数值
搜索结果为一个唯一的地址,但是依然不是绿色的
双击将它添加到记录中,右键继续查看是什么访问了这个地址,收集阳光观察变化
继续点击详情观察信息,记录偏移量
此时发现这个十六进制数和之前的一致,所以这个地址不能作为一个正确的中间地址
因此这个时候只有0275A4F0为唯一正确的中间地址
此时我们根据给出的16进制数值进行搜索,那么这个时候我们就索搜到了绿色的静态地址。
(7)判断那个是阳光的基地址
通过观察什么访问了这个地址发现,之后箭头所指向的地址是会随着收集阳光而发生变化,所以这个基地址就是阳光的基地址
(8)点击手动添加地址,将这个特殊的地址输入到地址框中,点击下方的指针按钮,根据上面的记录,输入偏移地址,确定具体数值。然后锁定数值。
根据上述流程可以排除另外两个的偏移地址,所以0275A4F0中涉及到的偏移量分别为:00005560、00000768
根据两个图中的阳光的数值的确定,那么此时我们就可以确定搜索到的地址就是阳光的基地址。
(9)重新开始游戏确认阳光是否实现了永久锁定
如图所示,实现了阳光的基地址锁定。
综上所述,阳光的基地址是006A9F38。
植物大战僵尸——任意阳光修改
简介
??这是植物大战僵尸系列的第一个练习,目的是实现任意阳光修改功能。
原理
??该功能的原理其实很简单,大致步骤就是:
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);
启动修改器,输入期望阳光值。
返回游戏查看。
??到此,我们已经实现了我们的目的,任意修改阳光并编写了我们自己的阳光修改器。
参考
CheatEngine:https://www.cheatengine.org/
VisualStudio:https://www.visualstudio.com/zh-hans/downloads/
以上是关于植物大战僵尸阳光值修改以及阳光基地址寻找详细步骤~包含排除不符合条件的地址的讲解,以及如何观察地址情况等的主要内容,如果未能解决你的问题,请参考以下文章