植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(下)

news2024/11/28 11:00:30

植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(下)

    • 36、全屏秒杀
    • 37、秒杀实现
    • 37、PVZ聚怪
    • 38、种植CALL的查找与调用
    • 39、OpenProcess错误
    • 40、错误:constchar[19]”转换为“LPCWSTR”
    • 附录:


36、全屏秒杀

在这里插入图片描述

首先先把僵尸的血量给找到:

在这里插入图片描述

在这里插入图片描述

咱们之前找过了,这个血量是这只僵尸的临时基址+C8:

在这里插入图片描述

手动加入地址:

在这里插入图片描述

在这里插入图片描述

然后咱们看这块内存的变化,看最大到哪里:

在这里插入图片描述

然后咱们等僵尸死掉,看一下变化的位置:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

复制记录一下这个最大变化范围的地址:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

计算出来这个15C该怎么用呢?
刚才那个僵尸死了的话,记录的地址肯定就没有用了(15C还有用),我们再换一只僵尸,找它的地址:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

有了15C这个偏移,我们就不用再去浏览当前僵尸临时基址的内存,再去观察变化最大范围的情况了。

在这里插入图片描述

回到游戏,种植一个豌豆去打僵尸,在僵尸没有死的时候,去CE中走索未变动的数值:

在这里插入图片描述

回到游戏,再打一下僵尸,再回到CE继续搜索未变动的数值(重复几次):

在这里插入图片描述

在这里插入图片描述

僵尸死掉消失了,咱们再搜索变动的数值:

在这里插入图片描述

特别大的数值,还有这个数值6,都不是我们要的数据,因为记录僵尸死亡状态的要么是0、要么是1,

在这里插入图片描述

在这里插入图片描述

(上面两张图地址数值不一样,是因为前面不小心把僵尸临时基址删除了,所以又重新找另一只僵尸的临时基址,并重新找僵尸死亡之后变动的数值;步骤都是一样的)
我们一个一个将这些地址复制下来,计算出与基址的偏移:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这只僵尸找完了,咱们还得换另外一只僵尸,用来测试看这6个偏移到底哪个是僵尸死亡状态,再重复上面的两个步骤:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上图中的34、74、158这几个肯定就不是了。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

咱们看一下当这个僵尸死亡了以后,这3个地址的数值有什么样的变化:

在这里插入图片描述

在这里插入图片描述

我们发现掉脑袋了,70这个偏移的数值变为1。

在这里插入图片描述

在这里插入图片描述

这几个都是,那怎么就试一下,找到僵尸的基址,加上偏移后写入1看看会有什么样的反应。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

给28这个偏移写入1后我们发现僵尸直接消失了。

咱们再找一个帽子僵尸的:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

应该就是350这个地址是这只帽子僵尸的临时基址:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们把偏移70这个上图选中地址的数值改为1,发现没有效果,所以说偏移70肯定是不对的,把它删除。

咱们再改一下偏移EC看看,再找一只僵尸:

在这里插入图片描述

在这里插入图片描述

我们发现偏移EC的值改成1的话僵尸直接就没了,所以偏移28是僵尸死亡,偏移EC是僵尸消失。

咱们再继续找一只帽子僵尸:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

因为是发射了两颗豌豆,所以是减40:

在这里插入图片描述

在这里插入图片描述

有点问题,咱们换最下面那只普通的僵尸看看:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

咱们等把这只僵尸打死后看看产生的汇编指令:

在这里插入图片描述

在这里插入图片描述

咱们记录下僵尸死亡的指令地址,到OD中看一下该地址处的相关数据:

在这里插入图片描述

在这里插入图片描述

咱们找到僵尸死亡的关键指令之后,就该实现秒杀这个功能了。


37、秒杀实现

在这里插入图片描述

找到了僵尸死亡状态的指令地址后,上面选中的部分就都可以删除了。

在这里插入图片描述

咱们还是用僵尸移动,搜索僵尸的坐标那个方法,来实现秒杀功能。

在这里插入图片描述

在这里插入图片描述

从00400000那里往下找一片空白区域:

在这里插入图片描述

在这里插入图片描述

咱们先把上图选中的记录一下之后,在修改该位置指令为JMP 00400E2C:

在这里插入图片描述

在这里插入图片描述

要在跳转到的空白位置写入死亡状态:

在这里插入图片描述

在这里插入图片描述

上面写入的指令是从CE那里复制过来的,这里我们要根据实际情况来修改,所以要把edi修改为esi才对:

在这里插入图片描述

僵尸的基址是放在esi这个寄存器里面的,所以跳转到空白处后就不能用edi了:

在这里插入图片描述

在这里插入图片描述

多了一个nop咱们不能要,咱们给它恢复。

在这里插入图片描述

我们看到jnz跳转的话就有两种情况了,跳走了咱们就不用搭理它(因为就这一个功能),没跳走的话就跳回原位置(程序之前从哪里过来的,还得跳回到那里):

在这里插入图片描述

回到游戏看效果,僵尸只要一冒头就会消失,但是这样直接消失的话是没有奖励的,因为死亡状态有不同的种类(1消失、2燃烧、3掉头),所以咱们应该写入数值3让僵尸掉头:

在这里插入图片描述

要学会不断地去尝试,这样就实现了全屏秒杀,只要僵尸一移动就掉头死掉了;当然为了观赏效果,可以在空白位置处写入条件判断指令,判断僵尸移动到某个坐标位置时再掉头,这样观赏效果好。

在这里插入图片描述


37、PVZ聚怪

植物大战僵尸它有一个功能,就是大蒜可以让当前靠近的僵尸改到别的地址(路线)上,所以咱们就通过这个方法来实现把所有僵尸只要一移动,咱们就给它们聚到一行上面,可以达到聚怪的功能。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

先通过僵尸的血量找到这只僵尸的临时基址,在之前全屏秒杀那节课讲过一个最大偏移0x15C,加上这个临时基址应该就是僵尸那个数组结束的地址:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们看到僵尸遇到大蒜后移动的话,只能是在方格里进行移动,所以这是一个整数型的这么一个数据结构;
有这么一种可能,这个范围如下图所示,坐标有可能从0开始到4结束(一共5格),也有可能从1开始到5结束:

在这里插入图片描述

所以我们搜索的范围肯定是要比10要小的一个数值:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

咱们给它变动了一行,我们再搜索变动的数值:

在这里插入图片描述

一看就是第一个地址的数值2是对的,咱们试一下给它改成1:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

它就跑到最上面一行来了(因为第二行有个大蒜,导致它又往上跑了一格),我看到找到的这个地址数值变为0了,所以它这个数据结构的类型就是:

在这里插入图片描述

在这里插入图片描述

如果给它改成4的话,它就跑到最下面一行了:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

放一个大蒜,在僵尸碰到这个大蒜的时候产生一条汇编指令:

在这里插入图片描述

esi的值是3,从上往下数位置的当前状态,也就是当前的y坐标,edi是这只僵尸的临时基址,所以坐标的偏移就是1C;
咱们记录一下该指令的地址:

在这里插入图片描述

在这里插入图片描述

到OD中转到该关键指令地址:

在这里插入图片描述

如果你想把僵尸聚到中间这行的话,坐标就是2:

在这里插入图片描述

咱们还是用最老套的方法,就是僵尸移动就给它聚到一块:

在这里插入图片描述

在这里插入图片描述

咱们还是要找一片空白区域:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

把之前僵尸死亡的代码修改为这里的聚怪代码;
到时候写程序的时候,用哪个功能就会往这里写相应的代码,取消功能的话还能恢复原样。

我们看一下效果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样的话僵尸都到这一行了;
只要僵尸一出现的话就会到中间这一行了。

那个坐标2也可以根据你要移动的位置进行相应修改(0、1、2、3、4都可以)。

在这里插入图片描述

x坐标涉及到浮点数,操作上比较麻烦,所以这里就先讲y轴的聚怪。


38、种植CALL的查找与调用

在这里插入图片描述

我们知道,种植植物的话,植物数量肯定会增加,所以思路就是找到当前植物的数量,再找到这个数量增加的关键指令,下个断点,看一下都调用了哪些函数,分析一下就可以了。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

程序崩溃,重新来过:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

用铲子铲除一个植物,然后搜数值3:

在这里插入图片描述

在这里插入图片描述

这样反复多次增加、铲除,得到植物数量的地址:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这个地址就是植物数量增加的关键地址,剥离掉CE,打开OD转到该地址,下个断点,回到游戏再种植一个冰豌豆:

在这里插入图片描述

在这里插入图片描述

断下来以后按工具栏上的K按钮,打开堆栈调用窗口,分析这些CALL:

在这里插入图片描述

在这里插入图片描述

第一层是个无参的CALL,内部没有返回值,肯定不是咱们种植的CALL,因为咱们如果要种植的话,肯定会有它们的一个坐标,它种在哪,植物的类型等等这些东西。

在这里插入图片描述

在这里插入图片描述

我们看到第2层CALL肯定是有参数的,进入它的内部:

在这里插入图片描述

在这里插入图片描述

这个0x10的话就是4个参数,这个CALL就可能是。

在这里插入图片描述

我们看到第3层CALL,进入该CALL内部,我们观察到函数的开头很熟悉,这是重叠建造的CALL:

在这里插入图片描述

之前我们找过这个CALL,这个不是,但是这个CALL其实咱们也是可以调用的(可以当做作业供你去测试分析)。

咱们来测试一下,看看第2层CALL的效果,试一下就知道它到底是什么功能了;
把断点都删除了,把相关汇编指令记录一下:

在这里插入图片描述

在第2层CALL位置下断点,然后咱们种植一个植物(冰豌豆):

在这里插入图片描述

在这里插入图片描述

断下来了以后看右下角堆栈窗口里的数据:

在这里插入图片描述

在这里插入图片描述

把这个冰豌豆铲除,换个地方种植冰豌豆:

在这里插入图片描述

这个位置的坐标有可能是(y=3, x=1),也有可能是(y=4, x=2),种下去后OD断下:

在这里插入图片描述

在这里插入图片描述

我们看到call之前给eax传入了一个数值,所以我们在这个指令上下断点,看一下eax是多少:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

回到游戏铲除那个位置的冰豌豆,在原位置上再种冰豌豆,断下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样这个CALL的原型就出来了,咱们测试一下,用OD中的代码注入器:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

把所有植物取消掉,然后注入写好的种植CALL到游戏进程中:

在这里插入图片描述

在这里插入图片描述

没有注入成功,修改注入的代码,push的地址必须是16进制的:

在这里插入图片描述

在这里插入图片描述

我们看到植物种在这上图红色方框那里,种到草地外面去了,修改注入代码eax的值为1:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们把第3个push的值改为5看看:

在这里插入图片描述

在这里插入图片描述

咱们把第2个参数改为10,我们发现是荷叶,所以这个参数是植物的种类:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

但是第4个参数是一个地址值,这个地址值是会变化的,所以我们还得搜索这个地址的来源:

在这里插入图片描述

这个ebp其实是一个特殊的寄存器,我们得找这个ebp里面的值的来源。

在这里插入图片描述

咱们到CE中搜索这个地址值:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样就找到了ebp的值0C2B6008的基址为006A9EC0,偏移为0x768:

在这里插入图片描述

在这里插入图片描述

找到这个变动的地址的基址后,就可以修改注入代码了:

在这里插入图片描述

这种取地址内容的方括号,里面的地址前面加不加0x前缀都可以。

在这里插入图片描述

在这里插入图片描述


39、OpenProcess错误

我们独立运行编写好的程序,会出现无法成功执行OpenProcess,无法获取进程的权限,而导致读写失败。
也就是说,不在VS编程环境的调试下运行这个程序,而是把生成的exe程序拷贝出来,直接独立运行它的时候就不能正常修改阳光值等功能,所以就需要在运行之前需要提权,获取到打开进程的权限。

我们需要在每个函数执行之后进行判断,看看到底是哪步出的问题:

在这里插入图片描述

在这里插入图片描述

这样的话就会有一个提示,没有取到这个窗口的句柄,通过这种方法来判断究竟是哪里出现的问题。

在xp系统下可能就会碰到这种情况,在VS调试的时候没问题,但是独立运行程序的时候,无法打开进程(OpenProcess执行失败),所以就需要提权:

在这里插入图片描述

把这个提权函数加入到项目代码中,在打开进程之前要先执行这个函数获取权限:

在这里插入图片描述


40、错误:constchar[19]”转换为“LPCWSTR”

在这里插入图片描述

如果你勾选了上图中的使用 Unicode库的话,会出现一个问题。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

直接编译会出现一个错误:

在这里插入图片描述

在这里插入图片描述

怎么解决这个错误呢,就是在项目属性里修改字符集为使用多字节字符集,这样编译就可以正常的通过了。

///


附录:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

opencv的相机校准和3D建模的理论知识

一、相机标定的四个坐标系 1、世界坐标系(Xw,Yw,Zw):也称真实或现实世界坐标系,或全局坐标系。它是客观世界的绝对坐标,由用户任意定义的三维空间坐标系。一般的3D场景都用这个坐标系来表示。 …

SSM框架使用多数据源(druid连接池)

最近有个数据归集的需求用到了多数据源,在业务库保存后同时向归集库插入或数据。之前好像还没做过这块的东西,简单记录下防止下次又忘记了~ 踩过的几个坑都是某些知识点不熟悉导致的,而且都是框架配置相关的.. 先上代码,再扯淡 …

PyQt5 拖拽与剪贴板

拖拽与剪切板拖拽剪贴板拖拽 基于MIME类型的拖拽数据传输时基于QDrag类的QMimeData对象管理的数据与其对应的MIME类型相关联。 MimeData类函数允许检测和使用方法的MIME类型 判断函数设置函数获取函数MIME类型hasText()text()setText()text/plainhasHtml()html()setHtml()tex…

【Java八股文总结】之SpringBoot

文章目录SpringBoot1、Spring Boot的优点?2、Spring Boot自动配置原理3、如何定义一个SpringBoot Starter?4、SpringBoot启动原理?5、SpringBoot的常用注解Spring Cache1、Spring Cache介绍2、Spring Cache注解Sharding-JDBCSpringBoot 1、S…

关于vector的迭代器失效

目录 关于迭代器失效的判定 1 迭代器指向的位置是野指针(全部迭代器失效) 原因: 解决 2 erase或者insert之后迭代器被更改了(部分迭代器失效) 原因 迭代器失效的场景: 改进之后 部分迭代器失效之越…

十年前的AlexNet,今天的NeurIPS 2022时间检验奖

目录:十年前的AlexNet,今天的NeurIPS 2022时间检验奖一、前言二、时间检验奖一、前言 作为当前全球最负盛名的 AI 学术会议之一,NeurIPS 是每年学界的重要事件,通常在每年 12 月举办。大会讨论的内容包含深度学习、计算机视觉、大…

三款“非主流”日志查询分析产品初探

前言 近些年在开源领域,用于构建日志系统的软件有两类典型: Elasticsearch:基于 Lucene 构建倒排索引提供搜索功能,DocValue 存储支持了其统计分析能力。Clickhouse:列式存储是其优秀 OLAP 性能的保障。 这里把上述系…

Windows安装MySQL

目录 1、确认本地是否安装了mysql 2、下载安装包 3、安装mysql 4、修改mysql密码 5、配置环境变量 1、确认本地是否安装了mysql (1)按【winr】快捷键打开运行,输入services.msc,点击【确定】; (2&…

大数据开发和软件开发哪个前景好?

大数据开发和软件开发哪个前景好?大数据开发学习有难度,零基础入门要先学习Java语言打基础,然后进入大数据技术体系的学习,学习Hadoop、Spark、Storm等知识。软件开发工程师根据不同的学科从事的岗位也千差万别。 先说说大数据开…

关于激光雷达传感器分类及简介

关于激光雷达传感器(根据特性进行分类介绍)0一些激光雷达的厂商总结1 基本介绍2 基本分类及组成2.1 激光雷达的相关分类2.1.1 机械式激光雷达:2.1.2 混合固态激光雷达:2.1.3 固态激光雷达:OPA和Flash固态激光雷达2.2 机…

Linux shell 脚本学习

目录 1.shell编程的基本格式 开头 注释 加可执行权限 执行脚本的三种方法 2.变量 定义变量和清除变量 从键盘获取值(read) 读取多个值 只读变量(readonly) 位置变量 变量运算 3.条件测试 文件测试 字符串测试 数值测试 逻辑操作符 4. if条件语句 if条件语句语法 单…

SPARKSQL3.0-源码剖析全流程导读

SPARKSQL-源码剖析全流程导读 一、处理流程 spark从一条sql语句一步一步转换成物理执行结果,这中间需要经历几个阶段,如下图: 二、各阶段概述 1、Unresolved-未解析阶段 此阶段主要做了两件事: 1、将sql字符串通过antrl4转化…

元数据管理系统

数据治理工具–元数据系统数据服务基础能力之元数据管理元数据管理系统设计 1.元数据概述 1.1 介绍 如果想建设好元数据系统,需要理解元数据系统的相关概念,如数据、数据模型、元数据、元模型、ETL、数据血缘等等。 首先,要清楚数据的定义…

python_函数

一、函数介绍组织好的,可重复使用的,用来实现特定功能的代码段例如:len() 函数--Python内置函数# 已组织好的、可重复使用,针对特定功能 def my_len(data):count 0for i in data:count 1print(f"字符串{data}的长度是{coun…

WebRTC实现一个网页在线录制视频

电脑录制视频几乎不会用到,当有需要的时候就各种找软件找工具,并且都会找免费的。现在市场上肯定有很多符合需求,只是那么偶尔的情况下,而且使用场景不是那么多要求的情况下,一个网页在线直接录屏是不是非常nice。 很…

40Java Runtime类

目录 Runtime类 1.概述 2.常见方法 (1).getRuntime返回环境对象 (2).exit停止虚拟机 (3).availableProcessors返回线程数 (4). maxMemory返回获得最大内存 (5).totalMemory返回已经获得内存 (6).freeMemory返回剩余内存 (7).exec运行cmd命令 Runtime类 1.概述 ​ Run…

双亲委派模型机制

文章目录类加载器findClassloadClassJDK双亲委派的破坏第一次破坏第二次破坏tomcat热部署JDK9最新改动双亲委派机制是当类加载器需要加载某一个.class字节码文件时,则首先会把这个任务委托给他的上级类加载器,递归这个操作,如果上级没有加载该…

卷积神经网络<二>keras实现多分支输入VGG

VGG的模型图 VGG使用Keras实现 这里的代码借鉴了VGG实现Keras,但是这段代码不支持多通道,并且vgg函数的扩展性不好。下面修改一下,方便进行多分支图片输入的建立,以及更见方便的调参。 # from keras.models import from keras.l…

MyBatis介绍

MyBatis介绍 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordi…

PMP考试自学可以吗?(含PMP备考资料)

当然是可以的,只要解决了“报考的35学时”这个问题,就只剩怎么备考的问题了。 在一般情况下,建议备考一到三个月,别给自己太长或太短的备考时间,前者坚持不下来,后者备考时间太少,来不及备考充…