阅读 93

植物大战僵尸修改器代码,植物大战僵尸修改器教程

0x00前言文章中的文字可能存在语法错误及标点符号错误,请谅解;

如果在文章中发现代码错误或其他问题,请告诉我。 谢谢你。

0x01准备工具:1.cheat engine :

https://www.cheatengine.org/

2.Visual Studio 2010

3 .植物战争僵尸

0x02安装步骤1 .思路对于每个打开的程序,保存数据的存储器地址会发生变化,但程序的基址和偏移不会改变。所谓基址,可以简单理解为不会随程序运行的起始时间和环境改变的地址,即全局数据区的数据的地址。所以,关闭游戏并重新启动。 存储游戏密钥值的变量的地址不会改变。

因此,使用cheat engine工具找到游戏的基址和偏移量,取得后,使用c语言的ReadProcessMemory ()和WriteProcessMemory ) )修正地址所指的值即可

2 .找到阳光值的基础网站后,首先打开植物大战僵尸游戏:

然后打开cheat engine,将植物大战僵尸附加到此APP :

然后查看游戏左上角的太阳值,将太阳值写入value,然后单击“First Scan”。

此时,cheat engine左侧的内容区域中将出现包含与刚才输入的值相同数据的行。 然后回到游戏,等待新的小太阳的出现。 捡起小太阳,太阳的值就会发生变化。 现在回到cheat engine,观察内容区的Value列,以查看该列中的数据是否发生了变化。 (变化的行也会自动显示为红色,便于查找) )。

在上图中变化的行已经被标记了。 为了确认该行与游戏中的太阳值相关,往往在游戏中拾取几个小太阳,看标记的Value列是否随着游戏而变化,确认其地址与太阳值相关后,左键单击

此时将显示一个对话框,其中没有内容。 此时返回游戏进行使用或收集太阳的操作。 在此,对话框显示数据操作的信息。 请注意,有意巨人拾取太阳值是“add……”的信息,而有意巨人使用太阳值是“mov……”的信息,双击观察详细信息:

现在,让我们在弹出对话框中查看红色部分。 mov [edi 00005560],esi。 此命令意味着将esi的值传递到[edi 00005600]指向的地址。 其中00005560是偏移量,是十六进制。 通过查看edi可以看到,edi通过1476A5B0(或直接The value……probaply 1476A5B0的行提示)获得了高位地址0x1476A5B0和偏移量00005560。 并且,the value……在proba ply 1476 a5b 0的行中,提示右键单击上位地址值进行复制。

关闭两个对话框,单击New Scan重新扫描,将高位地址粘贴为value,选中Hex,然后单击First Scan :

此时,左侧的列表中会显示很多值。 观察一段时间后,有些行的数据变红变黑了。 这表明数据值正在发生变化。 单击" Next Scan "以过滤这些更改的值(因为搜索到的value值一直不是0x1476A5B0)。

返回游戏,继续拾取太阳,或使用太阳值从左侧对话框的第一行中选择,然后单击“find out what accesses TTS”,直到弹出的对话框中有类似mov……的命令

以前,这个时候得到了偏移量0000768。 高位地址为0x0283A1F8。 将左侧对话框中的这一行标记为底部对话框,关闭弹出的两个对话框,然后开始新的扫描。 将0283A1F8复制到value,选中Hex,然后单击“第一次扫描”。

请看左侧的对话框中有一行绿色。 发现了绿色的静态地址。 绿色表示基本地址。 在此选择" Add Address Manually ",然后在弹出对话框中选择" Pointer "。

在显示的对话框中输入基地址的框中,单击" Add offset "两次。 单击“添加偏移”(Add offset )两次,然后键入偏移。 一次偏移为0x0000768,一次为0x00005560。 从最后一个偏移开始输入。 输入完成后,确认Address的数值是否是游戏中的小太阳的值。

我们现在整理一下思路:

基地址0x006A9EC0的值0x768之后是地址,

该地址的值0x5560是存储小太阳值的存储器单元。

所以,现在我们找到了基础地址。 而且,写代码的时候在这个基础地址上加上0x768和0x5560就是小太阳的存储单元。

3代码# include stdio.h # include windows.h # definesun _ shine _ base _ addr0x 006 a9ec0//阳光基础地址# definesun _ shine _ base

shine = 0;DWORD ErrorInfo = 0;DWORD Size = 0;DWORD SunShineNum=0; //最后值DWORD PID = 0;DWORD SunShineBaseAddress = SUN_SHINE_BASE_ADDR;//阳光基址DWORD SunShineBaseAddressValue = 0;//阳光基址值DWORD SunShineOffsetFirst = SUN_SHINE_OFFSET_FIRST;//一级偏移DWORD SunShineOffsetFirstValue = 0; //一级偏移值DWORD SunShineOffsetSecond = SUN_SHINE_OFFSET_SECOND;//二级偏移HANDLE Process = 0;HWND hWinmine = FindWindowW(NULL, L"植物大战僵尸中文版");//找到窗口GetWindowThreadProcessId(hWinmine, &PID);//获取进程标识if (0 == PID){printf_s("获取PID失败\n");return -1;}Process = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);if (NULL == Process ){printf_s("进程打开失败\n");ErrorInfo = GetLastError();return -1;}if (0 == ReadProcessMemory(Process, (LPVOID)SunShineBaseAddress, &SunShineBaseAddressValue, sizeof(DWORD), &Size)){printf_s("获取基址失败\n");ErrorInfo = GetLastError();return -1;}if (0 == ReadProcessMemory(Process, (LPVOID)(SunShineBaseAddressValue + SunShineOffsetFirst), &SunShineOffsetFirstValue, sizeof(DWORD), &Size)){printf_s("获取一级偏移失败\n");ErrorInfo = GetLastError();return -1;}if (0 == ReadProcessMemory(Process, (LPVOID)(SunShineOffsetFirstValue + SunShineOffsetSecond), &SunShineNum, sizeof(DWORD), &Size)){printf_s("获取二级偏移失败\n");ErrorInfo = GetLastError();return -1;}printf_s("SunShineNum:%d\n", SunShineNum);printf_s("输入你要修改的值:");scanf_s("%d", &modifySunshine);WriteProcessMemory(Process, (LPVOID)(SunShineOffsetFirstValue + SunShineOffsetSecond), &modifySunshine, sizeof(DWORD), &Size);CloseHandle(Process);//关闭句柄system("pause");return 0;} 4运行结果

运行结果如下图,成功修改了小太阳的值:

因为获取的是静态基址,所以就算游戏关闭了,再开,也可以运行该代码进行修改。

以上。

参考文档:
https://blog.csdn.net/qq78442761/article/details/54670630
https://blog.csdn.net/xiaokangdream/article/details/79366176
https://www.cnblogs.com/gd-luojialin/p/7789569.html
https://blog.csdn.net/ChristmasYe/article/details/8757547
https://blog.csdn.net/xiaokangdream/article/details/79356831
https://blog.csdn.net/wangqingchuan92/article/details/82417454


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐