植物大战僵尸:寻找葵花生产速度

news2024/12/25 13:58:23

通过CE修改器遍历出控制太阳花吐出阳光的时间变量,太阳花吐出阳光是由一个定时器控制的,首先我们找到第一个太阳花的基址与偏移,然后找出第二个太阳花的动态地址,并通过公式计算得到太阳花结构长度的相对偏移,最后我们通过C语言编程实现,遍历并修改所有图中的太阳花吐出阳光的时间,最终实现全图吐阳光。

从本次实验开始将接触到关于分析定时器的相关技巧,一般的定时器分为递增定时器与递减定时器,不过大多数游戏都会使用递减定时器,因为递减定时器更好编程判断,本游戏中的太阳花生产速度使用的就是递减定时器,太阳花生产阳光一定是一个周期性的事件,我们只要找到该定时器并改写它的时间即可实现无限吐阳光,如下是太阳花定时器的遍历技巧:

首先种下第一个太阳花 -> 然后CE马上搜索 -> 未知的初始值
回到游戏短暂等待(时钟发生变化) -> 然后马上切回CE -> 搜索减少的数值 -> 掉一点搜一点
如果中途太阳花吐出了阳光 -> 则需要搜索增加的数值(1次) -> 然后再搜索减少的数值
最终找到一个动态地址(范围:0-5000) -> 锁定该变量范围在1至10即可 -> 实现无限出阳光

修改太阳花时钟有两种方式,第一种找到基址与偏移然后分别修改每一个定时器的时钟,第二种方式则是找到汇编跳转并进行改写,第一种方式要找植物相对偏移,首先我们先来猜测以下游戏作者会用什么方式存储不同植物的栏位。


如下图: 我们可先来猜测,游戏作者会使用二维结构体来存储植物位置,通过结构体链表将不同植物进行连接,当我们铲除植物的时候,只需要在链表中摘除相应节点,而太阳花的的地址一定是连续存储在内存中的线性空间,此游戏的矩阵可能就是5*9这么一个范围,假设在横坐标X轴如果两个植物之间的相对偏移是14C(14C就是太阳花结构体的实际长度),那么我们找到第一个植物的基址与偏移,每次相加14C的偏移量,则可遍历到下一个植物的内存地址,同理如果相减14C则就可遍历出上一个植物的内存地址,而纵坐标Y可能就是由一个1C偏移来控制的,此时我们也仅仅只是猜测。

在这里插入图片描述

如果我们按照上图中的方式进行推理,其计算每一个阳光时钟公式就可总结为如下,但真的是这样吗?

X坐标下的第1个植物:基地址 + 偏移1 + 偏移2 + 768
X坐标下的第2个植物:基地址 + 偏移1 + 偏移2 + 768 + 14C
X坐标下的第3个植物:基地址 + 偏移1 + 偏移2 + 768 + 14C + 14C
Y坐标下的第1个植物:基地址 + 偏移1 + 偏移2 + 768 + 1C
Y坐标下的第2个植物:基地址 + 偏移1 + 偏移2 + 768 + 1C + 14C

其实并不是!经过我对具体坐标的分析,在本游戏中太阳花与太阳花之间,可能使用了一维结构体来存储的植物与植物之间的属性,每次相加偏移都会遍历到下一个植物的属性上面,也就是说无论太阳花种植到在什么位置,只要相加偏移就可以遍历到下一个植物的冷却数据,而需要遍历的次数则取决于太阳花的种植数量。

首先我们种植一颗太阳花,并通过上方的遍历技巧找到当前第一个植物的动态地址,排查到最后可发现剩余11条结果,此时我们可猜测这个定时器应该在0-10000之间,应该不会大于这个参数,如下图我找到了13D65160这个地址,将该地址锁定为10就可以实现第一个太阳无限吐阳光。

接着我们在第一个太阳花的旁边种植第二个太阳花,然后还是使用前面的遍历技巧找到第二个太阳花的动态地址13D652AC,找到以后我们可以猜测第一个与第二个在内存中的布局应该是连续的,所以我们可以使用13D652AC \- 13D65160 = 14C此处得到的14C其实就是太阳花结构的实际长度,也可以说是两个太阳花之间的偏移值。

既然知道了太阳花之间的相对偏移,那么我们下一步就是来找一个固定的地址,我们在第一个太阳花地址上,右键选择查找改写地址,然后可看到0045FA48 \- 83 47 58 FF \- add dword ptr [edi+58],-01 << 这条汇编指令,此汇编指令乍一看是一条加法指令,但其相加的操作数是-1也就是相减,此处就是太阳花的定时器,其每次减1直到为0则吐出阳光,这里我们就可知该定时器是一个递减定时器,我们只需要记下偏移为58下一个地址是13D65108即可。

在这里插入图片描述

回到CE我们继续搜索十六进制地址13D65108然后找到偏移为AC下一个地址为13D08948

继续搜索13D08948得到下一个偏移数据为768,继续搜索00FE7B80

最终经过我们的搜索得到了一个绿色的基址00599F75 \- A1 389F6A00 \- mov eax,[006A9F38] <<

最后使用CE添加这个基地址与偏移数据来验证一下,公式为 [[[006A9F38+768]+AC]+58]] 此时我们就可以定位到第一个太阳花的动态地址了。

根据上面的理论,我们知道太阳花的结构体大小为14C,那么我们在第一个太阳花动态地址的基础上加上14C就可以得到第二个太阳花的动态地址。

既然找到了基址与偏移,接下来就是通过C语言编程实现修改全图太阳花的冷却时间,此处贴出我实现的代码.

  int main()
  {
	int base;
	int offset[4];
	int PID = 1292;
	base = 0x006a9f38;
	offset[0] = 0x768;
	offset[1] = 0xac;
	offset[2] = 0x58;
	int addr = GetDyAddr(PID, base, offset, 3);
	printf("阳光吐出动态地址:%x
  ", addr);
	HANDLE Process = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
	int SunOffset = 0;
	int SunNum = 10;
	while (TRUE)
	{
		for (int i = 0; i < 5; i++)
		{
			WriteProcessMemory(Process, (LPVOID)(addr + SunOffset), &SunNum, 4, NULL);
			SunOffset = SunOffset + 0x14c;
			printf("搞事 fuck ok
  ");
		}
		SunOffset = 0;
		Sleep(1000);
	}
	return 0;
  }

当我们进入游戏种植好太阳花以后,我们开启这个辅助,即可实现让前四个太阳花吐出阳光,最后种植的太阳花则不修改,为了防止程序出现假死我通过sleep函数让太阳花每一秒吐出一个阳光,这样修改的话会很有节奏感。

上述方法,虽然可以修改达到无线吐阳光的作用,但是这种修改方式,显然是不太合理,如果图中有10个太阳花,那么我们则只能循环十次,这种效率还是太低,其实我们可以通过直接修改硬编码的方式来实现一劳永逸的效果,之所以是一劳永逸,是因为所有太阳花的吐阳光判断都是共用一个判断函数执行的,阳光的递减时钟都会走一个地方add dword ptr [edi+58],-01 我们只需要定位到这里,然后分析出阳光产生的关键键跳转并改掉其硬编码即可。

上图是经过测试后备注的一些细节,我们只需要将图中的0045FA7D处的指令集,替换为nop即可实现全图的植物无线吐阳光啦,其C语言修改代码如下,代码中使用了上面封装好的的写内存字节集函数。

  int main()
  {
	int PID = 3612;
	unsigned char Auto[] = { 0xEB };
	unsigned char Suns[] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };

	BOOL ret = WriteByteSet(PID, 0x0043158F, Auto, 1);
	BOOL ret1 = WriteByteSet(PID, 0x0045FA7D, Suns, 6);
	if (ret != 0 & ret1 != 0)
	{
		printf("您的向日葵已打包,请注意查收
  ");
	}
	return 0;
  }

最终配合自动收集阳光,即可实现如下图所示的变态功能,其实这也不算变态,毕竟还有更加变态的,其实这种修改方式并不完美,因为我们的阳光数量可能是一个整数类型,如果不加以控制,当整数变量到达所能承载的最大范围时,则程序会发生整数溢出,轻则阳光变为负数,重则直接崩溃卡死。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 大漠插件免注册调用

1&#xff1a; 参考文章&#xff1a; https://blog.csdn.net/chuhe163/article/details/1127455902&#xff1a; 免注册调用代码实现2.1 先建一个空的mfc项目2.2 拷贝dm.dll 到文件项目所在文件夹。2.2.1 拷贝到项目后&#xff0c;右键项目->添加 ->现有项 ->选择dm.d…

四、常用注解

文章目录四、常用注解1、TableName1.1 问题1.2 通过TableName解决问题1.3 通过全局配置解决问题2、TableId2.1 问题2.2 通过TableId解决问题2.3 TableId的value属性2.4 TableId的type属性2.5 雪花算法3、TableField3.1 情况13.2 情况24、TableLogic4.1 逻辑删除4.2 实现逻辑删除…

JavaScript 自执行函数防止冲突全局作用域变量 - 在线客服源码实现弹窗效果JavaScript SDK...

当我在实现在线客服源码弹窗效果JavaScript SDK时&#xff0c;对外公开的SDK代码就是使用的自执行函数的形式。 使用自执行函数来实现 JavaScript SDK 有以下好处&#xff1a; 封装代码&#xff1a;自执行函数可以将你的 JavaScript 代码封装起来&#xff0c;从而避免在全局作用…

文件字节输出流、文件拷贝、资源释放的2种方式

文件字节输出流&#xff1a;写字节数据到文件&#xff1a; API: 注意&#xff1a;close() 包含了 flush() ; 关闭后流就不可以继续使用了 写一个字节出去&#xff1a; 98表示一个字节 写一个字节数组&#xff1a; 注意&#xff1a;写数字和字母可以直接写出去&#xff0c;但…

【二分查找】有界数组中指定下标处的最大值

题目描述 给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums&#xff08;下标 从 0 开始 计数&#xff09;&#xff1a; nums.length nnums[i] 是 正整数 &#xff0c;其中 0 < i < nabs(nums[i] - nums[i1]) < 1 &#xff0c;其…

leetcode 2244. Minimum Rounds to Complete All Tasks(完成所有task至少要多少轮)

tasks数组里面的数字表示难度的等级&#xff0c;每一轮只能完成2 或者 3个同等级的task, 问至少需要多少轮能完成所有的task, 不能完成的返回-1. 思路&#xff1a; 先来看下什么情况下不能完成。 由于一轮只能完成2 或 3个&#xff0c;那如果该等级的task只有一个呢&#xff…

P1-- 信号--通讯原理

前言&#xff1a; 最近看了《无线系统设计与国际标准》后面的几个核心技术 OFDM,Modulation&#xff0c;格雷码&#xff0c;MIMO 等技术&#xff0c;其底层的数学思想主要包括傅里叶变换 &#xff0c;狄拉克函数&#xff0c;卷积&#xff0c;线性代数基础运算。 这边结合 北京…

Electron开发-从推门到进门

一、Electron 的介绍 Electron是利用web前端技术进行桌面应用开发的一套框架。是由 github 开发的开源框架&#xff0c;允许开发者使用 Web 技术构建跨平台的桌面应用&#xff0c;它的基本结构&#xff1a; Electron Chromium Node.js Native API Chromium&#xff1a;为 …

大数据挖掘-伤寒论和金匮要略(COVID-19用药启示录)

来自Toby老师&#xff0c;大数据挖掘-伤寒论和金匮要略 大家好&#xff0c;我是Toby老师&#xff0c;三年来新冠病毒肆虐全球&#xff0c;带来一些列症状&#xff0c;例如发热&#xff0c;恶寒&#xff0c;咳嗽&#xff0c;咽喉痛&#xff0c;腹泻&#xff0c;心脑血管疾病等等…

最低成本尝试做游戏的方式

本文首发于微信公众号&#xff1a;小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。如果说有 100 个人想过去做游戏的话&#xff0c;那么最终大概只有不到 20 个人真的去尝试了&…

【TypeScript】TS类型断言-类型的声明和转换(五)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

echartjs 实现 cross (十星辅助线)跟随吸附高亮点

前言 项目是金融项目&#xff0c;就像支付宝基金的走势图一样。但图表库使用的是 echart 而不是 antv 的 f2&#xff0c;要问为什么不直接用 f2 &#xff1f;问就是因为项目历史包袱。 背景 了解过 echart 的都知道&#xff0c;官方提供了十星辅助线&#xff0c;只要设置 ax…

服务端渲染和客户端渲染

介绍 服务端渲染 servlet开发 浏览器请求servlet&#xff0c;servlet在服务端生成html 响应给浏览器&#xff0c;浏览器展示html的内容&#xff0c;这个过程就是服务端渲染。 输入url——>请求到tomcat——Servlet / jsp来解析解析用户请求并处理——>服务端渲染生成ht…

收藏网页版小游戏:蜘蛛纸牌、扫雷、水果忍者、打地鼠、吃豆人

学习之余当然是摸鱼了&#xff0c;这里分享几个不用下载直接在线玩耍的游戏。有蜘蛛纸牌网页版在线玩、在线扫雷小游戏、在线玩的水果忍者、吃豆人、打地鼠、3D模仿。 下面我将一个个列出来。欢迎体验收藏&#xff01; 蜘蛛纸牌&#xff1a;这是一款刺激好玩的棋牌小游戏。大家…

【C语言航路】第九站:数据的存储

目录 一、数据类型介绍 1.基本的内置数据类型 2.类型的基本归类 二、整型在内存中的存储 1.原码反码补码 2.大端字节序与小端字节序 3.一些经典的题目 三、浮点型在内存中的存储 总结 一、数据类型介绍 1.基本的内置数据类型 这部分我们在一开始的时候已经说过了&…

中职组网络安全2022年安徽省赛信息隐藏与探索

首先这一套题目我们先看一下环境: 以上来给到了一个主页的网站,做这样的题目我们第一个想到的就是源代码,于是我们查找源代码看看里边有什么东西: 在contact.php中发现了flag1,但是这一看就是一个base64代码,我们将其进行解密:

华脉智联可视化指挥调度系统

华脉智联可视化指挥调度系统&#xff0c;多端一体化综合智能指挥调度平台&#xff0c;可以实现对各级人员、设备、系统统一指挥&#xff0c;应急调度&#xff0c;为行业应用提供可视化智能指挥调度系统解决方案。 1、可视化指挥调度系统介绍 可视化指挥调度系统基于现有的4G通信…

处理WM_KILLFOCUS消息时需要注意的地方

之前我在一篇文章中曾经提过&#xff0c;不应该利用 WM_KILLFOCUS 消息中对表单的字段进行有效性校验。 今天的文章&#xff0c;我将介绍另外一个反面例子&#xff0c;来表现当使用 WM_KILLFOCUS 消息处理焦点相关的问题时所带来的混乱。 假设&#xff0c;有一个编辑框控件使用…

编写 MBR 主引导记录

文章目录前言mbs.S代码实验操作前言 本博客记录《操作系统真象还原》第二章最后一节的实验操作~ 实验需要安装Bochs软件&#xff0c;具体可食用Bochs下载安装博客。 实验环境&#xff1a;ubuntu18.04VMware 实验内容&#xff1a;在屏幕上打印字符串“1 MBR”&#xff0c;背…

C进阶_C语言_指针进阶_C语言指针进阶

除了自己的无知&#xff0c;我什么都不懂。 ——苏格拉底 *此博客为进阶指针详解&#xff0c;需要有一定的初阶指针基础。 我们知道&#xff0c;指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节。在32位平台上是…