6.8 植物大战僵尸:分析植物无冷却
本章我们将继续分析植物无冷却这个功能的实现,默认情况下植物栏中的植物都存在一个默认的冷却周期,当读者种下植物时则默认会进入冷却状态,根据种植植物的不同冷却事件也会有所不同,这里就涉及到定时器的相关知识了,在本游戏内定时器是一个通用的,游戏作者并没有分别给每一个植物分配一个定时器,而是使用了一个通用定时器来管理所有植物的冷却,如果去查基址无论查找哪个植物最终都会定位到时钟的计时代码上,一般来说此类定时器是通用的,判断则是通过游戏中的语句进行区分的。
本章我们将继续分析植物无冷却这个功能的实现,默认情况下植物栏中的植物都存在一个默认的冷却周期,当读者种下植物时则默认会进入冷却状态,根据种植植物的不同冷却事件也会有所不同,这里就涉及到定时器的相关知识了,在本游戏内定时器是一个通用的,游戏作者并没有分别给每一个植物分配一个定时器,而是使用了一个通用定时器来管理所有植物的冷却,如果去查基址无论查找哪个植物最终都会定位到时钟的计时代码上,一般来说此类定时器是通用的,判断则是通过游戏中的语句进行区分的。
DOS头是PE文件开头的一个固定长度的结构体,这个结构体的大小为64字节(0x40)。DOS头包含了很多有用的信息,该信息可以让Windows操作系统使用正确的方式加载可执行文件。从DOS文件头`IMAGE_DOS_HEADER`的`e_lfanew`字段向下偏移`003CH`的位置,就是真正的PE文件头的位置,该文件头是由`IMAGE_NT_HEADERS`结构定义的,IMAGE_NT_HEADERS是PE文件格式的一部分,它包含了PE头和可选头的信息,用于描述PE文件的结构和属性。
Map/Multimap 映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用`Multimap`声明映射容器,则同样可以插入相同的键值。Map中的所有元素都会根据元素的键值自动排序,所有的元素都是一个`Pair`同时拥有实值和键值,Pair的第一个元素被视为键值,第二个元素则被视为实值,Map 容器中不允许两个元素有相同的键出现。
算术运算指令集是计算机中的一组基本操作,用于对数字执行常见的算术运算操作。这些指令都是计算机中非常基础的运算指令,可以用于实现所有常见的算术运算操作,并可以通过组合使用实现更加复杂的数学运算。在实际编程中,程序员可以根据具体需求选择合适的运算指令,实现程序中的算术运算操作。
《植物大战僵尸》是一款非常经典的塔防类游戏,由`PopCap Games`公司开发并先后在多个平台上推出。主要玩法为种植各种攻击性植物,抵御僵尸攻击,该游戏可以说绝大多数九零后都接触或者玩过,本章将通过逆向分析技术对该游戏进行分析,并实现一些游戏之外的功能,以此让用户理解二进制安全技术的应用范围。在前面的章节中笔者教大家找到了有利于玩家通关的一些关键技巧,本章我们将继续寻找僵尸召唤出现的CALL调用,通过手动调用此函数,我们可实现批量召唤更多的僵尸队伍的目的,首先我们还是先来看一下僵尸召唤CALl是如何被遍历出来的。
PE结构是`Windows`系统下最常用的可执行文件格式,理解PE文件格式不仅可以理解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,在任何一款操作系统中,可执行程序在被装入内存之前都是以文件的形式存放在磁盘中的,在早期DOS操作系统中,是以COM文件的格式存储的,该文件格式限制了只能使用代码段,堆栈寻址也被限制在了64KB的段中,由于PC芯片的快速发展这种文件格式极大的制约了软件的发展。
本章将深入研究字符串操作指令,这些指令在汇编语言中具有重要作用,用于处理字符串数据。我们将重点介绍几个关键的字符串操作指令,并详细解释它们的功能和用法。通过清晰的操作示例和代码解析,读者将了解如何使用这些指令进行字符串比较、复制、填充等常见操作。我们还将探讨不同指令之间的区别,并提供实际的示例程序,展示字符串操作指令在实际场景中的应用。通过学习本章,读者将能够拓展汇编技能,为处理字符串数据提供高效而精确的解决方案。
Set/Multiset 集合使用的是红黑树的平衡二叉检索树的数据结构,来组织泛化的元素数据,通常来说红黑树根节点每次只能衍生出两个子节点,左面的节点是小于根节点的数据集合,右面的节点是大于根节点的集合,通过这样的方式将数据组织成一颗看似像树一样的结构,而平衡一词的含义则是两边的子节点数量必须在小于等1的区间以内。Set集合天生去重,所有元素都会根据元素的键值自动的排序,并且Set元素在确定后无法进行更改,换句话说Set的Iterator是一种Const_iterator,而Multiset则允许出现重复的数据,如需使用只需要将`set
本次实验目标是实现远程种植,要实现这个功能我们就需要找到植物的种植Call,种植Call什么时候会触发呢?当我们种植植物的时候必定会触发种植Call,那么此时我们只要遍历出植物的种植过程即可,通过CE我们找到拿起植物的关键代码,我们可以猜测植物拿起来这个动作之后应该就是种植了,只要我们能够找到控制拿起植物的代码,那么距离种植Call应该不会太远。
在正常情况下,要想使用`GetProcAddress`函数,需要首先调用`LoadLibraryA`函数获取到`kernel32.dll`动态链接库的内存地址,接着在调用`GetProcAddress`函数时传入模块基址以及模块中函数名即可动态获取到特定函数的内存地址,但在有时这个函数会被保护起来,导致我们无法直接调用该函数获取到特定函数的内存地址,此时就需要自己编写实现`LoadLibrary`以及`GetProcAddress`函数,该功能的实现需要依赖于`PEB`线程环境块,通过线程环境块可遍历出`kernel32.dll`模块的入口地址,接着就可以在该模块中寻找`GetProcAddress`函数入口地址,当找到该入口地址后即可直接调用实现动态定位功能。