0x00前言

文章中的文字可能存在语法错误以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

0x01准备工具:

1.cheat engine:
https://www.cheatengine.org/

2.Visual Studio 2010

3.植物大战僵尸

0x02实现过程

1.思路

我们打开的每一个程序中,存储数据的内存地址都会发生改变,但是程序的基址和偏移不会变。所谓基址,可以简单理解为不会随程序运行的起始时间和环境改变的地址,即全局数据区的数据的地址。 所以,我们关闭游戏再启动,存放游戏关键值的变量的地址不变。

所以现在我们利用cheat engine工具找到游戏的基址和偏移,获取到之后,再利用C语言中ReadProcessMemory()和WriteProcessMemory()进行修改地址所指向的值就可以了。

2.找到阳光值基址

首先打开植物大战僵尸游戏:

然后打开cheat engine,将植物大战僵尸附加到该应用上:

接下来看一下游戏左上角的太阳值,将太阳值写入value中,然后单击First Scan:

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

上图中变化的行已经标记出来,为了确定该行和游戏中的太阳值相关,多在游戏中捡几个小太阳,看看标记的Value列是否跟着游戏改变,确定该地址和太阳值有关后,双击左键,将该行标记在最下对话框中,然后单击右键,选择“Find out what writes to this address”:

此时弹出一个对话框,对话框中没有内容,此时回到游戏中进行使用或收集太阳的操作,现在,对话框中出现数据操作的信息。注意,当你捡太阳值是“add……”信息,当你使用太阳值是“mov……”信息,双击以观察详细信息:

现在,在弹出对话框中观察红字部分:mov [edi + 00005560] ,esi,该指令意思是将esi的值传递给[edi + 00005600]所指的地址中,其中00005560为偏移量,为十六进制数值。通过查看edi的值得知,edi为1476A5B0(或者直接查看The value……probaply 1476A5B0那一行提示),这样,我们获得了上级地址0x1476A5B0和偏移00005560。然后在The value……probaply 1476A5B0那一行提示右键复制上级地址值。

关闭两个对话框,点击New Scan重新扫描,将上级地址粘贴到value中,勾选Hex,点击First Scan:

此时左侧列表出现很多值,仔细观察一会儿,会发现有些行数据一直变红变黑,表明数据值在变化,点击“Next Scan”将这些变化的值过滤掉(因为我们查找的value值一直没变是0x1476A5B0)。

回到游戏,继续捡太阳或者使用太阳值,然后选择左侧对话框中从第一行开始选择,右键选择“Find out what accessses this address”,直到在弹出的对话框中有类似mov……的指令为止。

同前,此时得到偏移0000768,上级地址为0x0283A1F8,将左侧对话框中的该行标记在最下对话框,关闭弹出的两个对话框,开始新一次Scan,复制0283A1F8到value中,勾选Hex,然后单击“First Scan”:

此时观察左侧对话框中有绿色的行,证明我们找到了一个绿色的静态地址(绿色显示的是基址),现在选择“Add Address Manually”,在弹出对话框中选择 “Pointer”:

在弹出的对话框中将基址输入的框中,然后单击两次“Add offset”(因为我们经过两次的寻址),依次填入偏移,一次偏移为0x0000768,一次为0x00005560(从最近一次的偏移开始填),填写完成后,查看Address中的数值是否为游戏中小太阳的值,如下图:

我们现在理清一次思路:

由基址0x006A9EC0里的值+0x768后是个地址,

该地址里的值+0x5560就是存储小太阳值的内存单元。

所以,现在我们找到了基址,然后在编写代码时将该基址加上0x768以及0x5560就是小太阳的内存单元。

3代码

#include <stdio.h>
#include <windows.h>#define SUN_SHINE_BASE_ADDR 0x006A9EC0                    //阳光基址
#define SUN_SHINE_OFFSET_FIRST 0x768                    //一级偏移
#define SUN_SHINE_OFFSET_SECOND 0x5560                  //二级偏移值int main()
{int modifySunshine = 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

【游戏辅助】利用C语言编写《植物大战僵尸》修改阳光值代码相关推荐

  1. C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址

    C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址 C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现 C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问 ...

  2. C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问题

    C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址 C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现 C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问 ...

  3. C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现

    C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址 C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现 C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问 ...

  4. CE实战:植物大战僵尸修改阳光并制作辅助(小试牛刀)

    该教程为新手入门教程,大牛借过不要浪费时间 在学习CE基础篇内容时,我们一直是对CE提供给我们的Tutorial-i386.exe来完成练习的,是不是感觉没有啥意义呢,接下来的实战篇,将带领你把这些关 ...

  5. vs c/c++ 用win32api写出植物大战僵尸的阳光值修改器

    一.工具如下: 1.植物大战僵尸1(直接下载逗游游戏盒可以直接下载,网上资源很乱) 2.vs2017(使用vs win32的接口) 3.cheat engine(附下载链接https://www.cr ...

  6. ce逆向修改——植物大战僵尸针对“阳光值”

    ce逆向修改--植物大战僵尸 一.实验目的 为熟悉CE的使用和对软件逆向分析有进一步的了解. 二.实验设备 Cheat Engine 6.8.植物大战僵尸 三.实验内容 1.针对"阳光值&q ...

  7. 利用Java语言编写一个猜数字游戏(有次数限制)

    猜数字小游戏. 利用Java语言编写. 题目: 用代码模拟猜数字的小游戏. 思路: 1.首先需要产生一个随机数字,并且一旦产生不再变化.用Random的nextInt方法 2.需要键盘输入,所以用到了 ...

  8. linux 剪刀石头布c语言,利用C语言编写“剪刀石头布”小游戏

    前言 大家好~ 我是一名C语言初学者,学了C语言基础后,我制作了一个小游戏:剪刀石头布. 希望大家能对我的思路和代码提出小Tips(eg.更简便的方法与程序) 我也会虚心接受大家的建议~ 一.游戏原理 ...

  9. C语言实现植物大战僵尸----学习过程

    大一下学期c语言课程设计要我们用c语言制作一款游戏,之前网上冲浪时候发现了c语言实现植物大战僵尸的教程,就想来跟着教程做一遍,并记录下自己的学习过程与经验. 前排分享我所学习的视频和文章: [可能是B ...

  10. java语言编写计算器_第二次作业利用java语言编写计算器进行四则运算

    随着第一次作业的完成,助教 牛老师又布置了第二次作业:用java语言编写一个程序然后进行四则运算用户用键盘输入一个字符来结束程序显示统计结果.一开始看到这个题目我也着实吓了一跳 因为不知道如何下手而且 ...

最新文章

  1. 关于学习编程的一些看法
  2. Linux sar性能分析
  3. 【android】窗口管理
  4. python processpoolexector 释放内存_使用Python的multiprocessing.pool,内存使用量不断增长...
  5. C和指针之字符串编程练习8实现char *my_strnchr(char const *str, int ch, int which)
  6. 前端公共reset.css模板
  7. 用框图说明计算机控制系统,计算机控制系统试题
  8. 油墨研发打印机定制企业销售类网站源码 dedecms织梦模板 (带手机端)
  9. Error:The module 'app' is an Android project without build variants, and cannot be built.
  10. SSM中log4j2.xml配置文件的各项标签
  11. 检查最后出现子字符串的位置!
  12. qt的信号和槽通信机制(当多个窗口之间来回通信[父窗口和子窗口])
  13. 【播放器】git上著名播放器
  14. 按键精灵打怪学习-窗口绑定技能
  15. android 投屏 ipad,安卓手机投屏到ipad上
  16. win7驱动精灵_win7驱动打不上?黑科技H310/B360 USB核显驱动安装教程
  17. Android packageManager.setComponentEnabledSetting()和setApplicationEnabledSetting()方法介绍
  18. 千万不要攻击中国网站!传奇美国黑客凯文·米特尼克的警告
  19. Git Commit failed with error The Git process exited with the code -1,073,741,819
  20. 大数据是什么 有哪些价值

热门文章

  1. 云计算平台的市场现状和云计算平台的核心价值是什么?
  2. 手机电话本 csv 转vcf (vCard) 格式,最简单的方法!
  3. [Android实例] 【eoeAndroid社区索引】android开发基础之定位篇
  4. 从csrss弹出的ASSERT对话框谈起
  5. 变革中的技术——2010-2011回顾与展望
  6. 3d之家开机号计算机网,3d之家最新开机号
  7. DisplayTag详解
  8. VB的阶乘和伽马函数
  9. cad卸载工具_如何卸载AutoCAD 附上清理注册表方法
  10. 鸿蒙开发之拨打电话号码