植物大战僵尸:代码实现自动收集阳光

news2024/11/16 5:23:40

通过阳光增加的值为切入点,找到自动收集阳光的关键判断并实现自动收集阳光,首先我们猜测当阳光出现后,我们是否会去点击,这个过程必然是由一个判断和一个时钟周期事件来控制的,那么当我们点击下落的阳光以后,则该判断条件实现,会执行收集阳光的CALL,否则的话继续执行阳光下落的过场动画,这正是正向开发的一种开发手段,此时我们也仅仅是猜测,接下来我们将去验证这个大胆的想法。

为了找到阳光自动收集的关键跳转,我们需要以阳光增加作为切入点,为啥以它作为切入点呢?我们可以这样思考,当我们点击阳光后阳光增加了,说明已经完成了判断,下一步就是写入变量从而增加阳光,那么我们先来找到阳光的动态地址,并在该动态地址上按下F6键查找写入,然后回到游戏等待阳光出现并点击阳光,此时CE会出现以下代码,我们只需要记下00430A11这个内存地址,然后直接关闭CE。

接着打开X64dbg附加到游戏进程,附加完成后,游戏会被X64dbg暂停运行,此时我们直接按下F12让游戏运行起来,然后按下Ctrl + G输入00430A11跳转到刚才找到的代码位置,过去以后直接F2下一个断点。

此时我们需要逆向思考一个问题add dword ptr ds:[eax+0x5560],ecx这条指令是在我们阳光被点击后执行的,也就是说我们已经点击了阳光现在开始赋值了,那判断阳光是否被回收肯定是在这条指令之前出现,所以我们向上找,观察代码我们不难看出执行add dword ptr ds:[eax+0x5560],ecx指令之前有一个无条件跳转jmp 0x00430A0E跳过来的。

继续向上查找跳转来源,可知在jmp跳转之前有一个je 0x004309EF跳转,经过测试这个地方具体控制阳光是否增加,在向上找就到段首了,此处代码中并没有出现自动收集阳光的关键跳转,因此推断这里应该是一个控制阳光是否增加的子过程(子过程:过程中调用的过程,称为子过程),所以我们继续回朔到上一层。

为了能够回朔到上一层,我们需要取消阳光递增处的断点,并在段尾00430AB3处下一个F2断点防止程序跑飞,回到游戏等待阳光的出现,然后X64dbg就会断下,断下后直接取消00430AB3处的断点,执行到Ret处即可返回到上一层。

返回到上一层以后,可以看到我们正是在call <plantsvszombies.sub_4309D0> 这里出来的,而上方就有一个jne plantsvszombies.4313FD关键跳,此处的关键跳转也并不是控制是否回收阳光的关键跳转,而此处的代码量比较少,因此判断此处还是一个子过程,我们继续回溯到上一层。

我们直接单步F8运行到返回,并出这个CALL,出CALL以后会看到call <plantsvszombies.sub_430E40>没错!我们正是从这个子过程里出来的,接着向上找跳转会看到有一个jne plantsvszombies.431599此处如果将其改为jmp的话即可实现自动收集阳光,也就是说如果jne跳转实现则执行收集阳光,否则继续执行阳光下落的过场动画。

注意:如果我们在关键跳jne plantsvszombies.4313FD处下断点时,会发现当阳光出现后程序会被无限的断下,这说明是有一个定时器线程在不断的执行判断代码,每次都会判断你是否点击了阳光,所以X64dbg才会被一直断下。

知道了修改流程,那我们就通过编程的方式来实现修改程序的硬编码,首先我们可以通过以下代码完成字节集的读取。

  #include <stdio.h>
  #include <Windows.h>

  byte *ReadByteSet(DWORD Pid, DWORD Base, DWORD Size)
  {
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, 0, Pid);
	byte *buf = new byte[Size];
	ReadProcessMemory(handle, (LPVOID)Base, buf, Size, NULL);
	return buf;
  }

  int main()
  {
		byte *Buff = new byte[10];
		Buff = ReadByteSet(2232, 0x00401000, 10);
		for (int i = 0; i < 10; i++)
			printf("%02X ", Buff[i]);
	return 0;
  }

既然有读取内存字节集,那么就有写入字节集,如下代码就是一种字节集写入的实现方式。

  #include <stdio.h>
  #include <Windows.h>

  BOOL WriteByteSet(DWORD Pid, DWORD Base, unsigned char *ShellCode, DWORD Size)
  {
	BYTE *Buff = new BYTE[Size];
	memset(Buff, *ShellCode, Size);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, 0, Pid);
	BOOL Ret = WriteProcessMemory(handle, (LPVOID)Base, Buff, Size, NULL);
	if (Ret)
		return TRUE;
	else
		return FALSE;
  }

  int main()
  {
	unsigned char shell[] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
	BOOL temp = WriteByteSet(3772, 0x00401010, shell, 8);
	return 0;
  }

想要实现阳光自动收集,只需要将0x0043158F机器码0x75 0x08修改为0xEB 0x08即可实现效果。

	unsigned char shell[] = { 0xEB };
	BOOL temp = WriteByteSet(9744, 0x0043158F, shell, 1);

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

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

相关文章

DC-UNet:重新思考UNet架构和双通道高效CNN医学图像

摘要 经典UNet的体系架构在某些方面存在着局限性。因此本文对其结构提出了改进。1)设计高效的CNN架构来取代编码器和解码器;2)在最先进的U-Net模型的基础上&#xff0c;应用残差模块来取代编码器和解码器之间的跳过连接来进行改进。 医学图像分割是通过一些自动和半自动的方法…

linux系统中块设备的基本实现方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中的块设备的实现方法。 目录 第一&#xff1a;块设备基本简介 第二&#xff1a;块设备驱动框架 第三&#xff1a;实现程序代码实现 第一&#xff1a;块设备基本简介 块设备驱动与字符设备驱动之间的主…

双指针:环形链表II

题目&#xff1a;142. 环形链表 II 我们知道&#xff0c;判断一个链表是否为环是这样的&#xff1a; public boolean hasCycle(ListNode head) {ListNode slow head,quickly head;while(quickly ! null && quickly.next ! null){slow slow.next;quickly quickly.n…

【javaSE】中异常如何处理

目录 文章目录 一、异常的初识 1.1异常的概念 1.2异常的体系结构 1.3异常的分类 二、异常的处理和抛出 2.1防御式编程 2.2异常的抛出 2.3异常的捕获 2.4异常的处理流程 三、自定义异常类 3.1举例&#xff1a;实现一个用户登录功能 一、异常的初识 1.1异常的概念 在…

Perl语法

Perl从许多语言中借用了语法和概念&#xff1a;awk&#xff0c;sed&#xff0c;C&#xff0c;Bourne Shell&#xff0c;Smalltalk&#xff0c;Lisp甚至是英语。每个简单的语句必须以分号&#xff08;;&#xff09;结尾&#xff0c;和Java类似&#xff0c;与Python不同。 一、扩…

【苹果推群发iMessage推】软件安装它起首将消息发送到Apple Push服务器,而后Apple Push服务器将消息发送到装配了应用程序的手机

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

《小猫猫大课堂》——数组,操作符,常见关键字

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

Java--方法重写

1&#xff09;概念 重写(override)&#xff1a;也称为覆盖。重写是子类对父类非静态、非private修饰&#xff0c;非final修饰&#xff0c;非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01;重写的好处在于子类可以根据…

VUE动态组件,插槽和自定义指令

文章目录动态组件1.component组件的使用-keep-alive的使用keep-alive生命周期学习keep-alive组件的include和exclude属性include(指定keep-alive的哪些组件可以被缓存,不指定的话默认所有都会被缓存)exclude(排除项,与include刚好相反,二者不能同时使用)插槽v-slot指令v-slot的…

NodeJS - Express使用

文章目录1. 参数1.1 获取URL中的动态参数2. 静态资源2.1 挂载路径前缀3. nodemon4.1路由4.1 路由的匹配过程4.2 模块化路由4.3 为路由模块添加前缀5. 中间件5.1 全局生效的中间件5.2 全局生效中间件的简化形式5.3 中间件的作用5.4 局部生效的中间件5.5 定义多个局部中间件5.6 使…

计算机xxxxxxx

文章目录1.互联网的两大组成部分&#xff08;边缘部分与核心部分&#xff09;的特点是什么&#xff1f;它们的工作方式各有什么特点&#xff1f;2.简述分组交换的要点。3.试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。4.网络协议的三个要素是什么&#xff1f;各…

十二、生产者和消费者问题、队列、线程池

内容 理解消费者、生产者的案例执行过程&#xff0c; 理解用队列方式做消费者、生产者的案例 会使用线程池运行任务, 理解ThreadPoolExecutor7个参数的含义&#xff08;会根据需要 通过参数控制线程池的总数量&#xff09; 匿名内部类里的异常处理 Thread 使用匿名内部类…

VScode中不同目录间python库函数的调用

问题描述 vscode中跨目录的模块调用远不如pycharm中的来的简单&#xff0c;在pycharm中即使是不同库文件夹中子函数也可以进行互相调用。而在VScode中则需要我们手动向其中添加依赖路径。如下相同的文件结构&#xff0c;在pycharm中可以简单的在model_arc_pesudo中导入model中的…

HTTP传输过程

简介 HTTPS是在HTTP的基础上和ssl/tls证书结合起来的一种协议,保证了传输过程中的安全性,减少了被恶意劫持的可能.很好的解决了解决了http的三个缺点&#xff08;被监听、被篡改、被伪装&#xff09; 对称加密和非对称加密 对称加密 即加密的密钥和解密的密钥相同, 非对称加…

1801. 积压订单中的订单总数

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个二维整数数组 orders &…

【HTMLCSS】运维、后端你该会的前端基本内容

文章目录前言一、HTML5基础1.1、前端开发的核心技术1.2、Web组成标准1.3、HTML 实例1.3.1、第一个网页1.4、 文本标签1.5、转义字符1.6、图片1.7、超链接1.8、列表1.8.1、无序列表1.8.2、有序列表1.8.3、自定义列表1.9、表格1.9.1、合并单元格1.10、表单二、CSS基础2.1、入门2.…

【论文导读】Stable Learning via Sparse Variable Independence

准备follow一下稳定学习的系列论文&#xff0c;从这篇开始吧。 AAAI2023上的&#xff0c;主要是根据前几年稳定学习组提出的SV特征分类、关注稳定的S特征的样本重加权的优化 针对问题和措施&#xff1a; 稳定学习算法采用的样本重加权有弊端&#xff1a; 1&#xff0c;在有限…

ESP8266 SDK开发之AiThinkerIDE_V1.5.2安装、配置以及编写一个程序

【本文发布于https://blog.csdn.net/Stack_/article/details/128509864&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 前言 乐鑫官方不搞IDE&#xff0c;安信可搞了IDE&#xff0c;但是各版本之间安装配置有差异&#xff0c;还没有文档说明。官方安装配置教程不完…

IEEE论文投稿流程

转载文章 这是篇节省你翻论坛、查资料的文章。 我将把每一步尽量写的清楚&#xff0c;能够让新手按照这篇文章进行完整的投稿。 即使你从未投过稿&#xff0c;完全不了解IEEE的投稿流程&#xff0c;希望按照这篇文章&#xff0c;能够帮助你流畅无误的投稿 这是针对本科生和低年…

springboot整合springcloud之nacos配置中心

整合配置中心nacos 应用场景&#xff0c;每次改配置要重新启动才能生效&#xff0c;而把配置放到nacos上&#xff0c;如有修改&#xff0c;那么发布后项目自动就生效了。 场景2&#xff1a;不同微服务单独设置一个命名空间。 一、项目操作 1.引入依赖 <!--使用spring-cloud…