游戏插件开发原理
有三种类型的插件,即模拟按钮,WPE数据包和内存插件。例如,键盘模拟,鼠标模拟,这称为按键模拟,也称为脚本向导;和数据包修改一样,这称为WPE数据包插件,这种插件相对稳定,但对技术要求也很困难。相对较高,因为要修改WPE数据包,您需要了解和理解一系列知识,例如加密和解密算法;最后一个是修改本地内存,这是相对常见的,并且在市场上也很常见。游戏插件,相对来说,技术要求不是太高,信息也比较齐全,并且比较流行;但是好像服务器内存没有被修改,哈哈。实际上,有很多方法可以修改服务器,但是技术对于普通人来说太高了。这是本地修改内存的插件生产原理。
实际上,建立内存链接并不难,只需几个步骤。第一步是找到游戏数据的内存地址和偏移地址;第二步是修改内存地址的值以达到插件的目的;第三步
,用编程语言编写一个程序,以方便插件的携带和转移,并且下次玩游戏时也可以直接直接使用。实际上,第三步主要是为了易于使用,方便销售等。对于母版而言,很多时候,都不需要写出来。在记录了内存地址并偏移了地址后,下次您进入游戏时,可以在工具中直接对其进行修改。但是,如果您经常玩某款游戏,则可以将其写出来,而不必每次玩游戏时都对其进行修改。
插件开发的第一步-找到游戏的内存地址
说到找到游戏的内存地址和偏移地址,这可能是整个游戏插件开发中最困难的一步。因为大型的游戏,技能或健康栏的内存基址可能会偏移很多次。最后,存储器地址也称为物理地址。那么,这是一个问题,为什么我们要寻找技能或健康栏的内存基地址?直接修改物理地址还不够吗?这是不可能的,因为物理地址会改变。例如,每次关闭并重新启动游戏时,游戏过程都会改变。同样,游戏代码在内存中的存储位置,因为在游戏结束后,它会被释放。如果丢失了内存地址,则该内存地址可能会被其他程序占用,因此它将发生变化;当您关闭游戏并重新进入游戏时,游戏技能或健康栏在内存中的物理地址将发生变化。但是,游戏技能或健康栏的内存基址不会更改,无论内存中的物理地址如何更改,内存基址也不会更改。那么存储器基地址和物理地址之间是什么关系呢?看这个公式:
物理地址 = 一级偏移地址 + 偏移地址
一级偏移地址 = 二级偏移地址 + 偏移地址
二级偏移地址 = 三级偏移地址 + 偏移地址
三级偏移地址 = 游戏技能基址 + 偏移地址
根据上述公式,游戏的物理地址等于游戏的基地址加上偏移地址,因此,每次重新进入游戏时,您都可以找到确切的物理地址并修改其值为了达到游戏目的,您必须找到与该物理地址相对应的当前偏移地址和基址。只有这样,您才能确保每次登录游戏时都可以修改物理地址的值。下面,我们将通过经典的独立游戏“植物大战僵尸”演示该游戏的内存基址查找过程。
首先,介绍一种用于查找游戏内存基址的工具,即作弊引擎,即CE。 Cheat Engine是一种内存修改和编辑工具,可让您修改游戏或软件的内存数据以获取其他功能。它包括十六进制编辑,反汇编程序,内存搜索工具。与类似的修改工具相比,它具有强大的拆卸功能,并且带有可直接用于生成插件的插件生产工具。好吧,如果您对该工具的具体介绍感兴趣,请访问百度。这是百度。我简要介绍了该工具的功能。接下来,打开Plants vs. Zombies,打开CE,在CE中找到Plants vs. Zombies,添加Go到CE,如图所示:



将游戏附加到OD之后,查找要修改的内容,然后找到相应的内存基址。如何找到它?例如,修改无限阳光;首先,让我们看一下最初的阳光吗?例如,此处的开始日照是50,在CE的值项中输入50,在扫描类型中选择确切的值,在值类型中选择4个字节,然后单击第一个搜索。我不明白为什么这是这里的选择,所以我对百度科学有基本的了解。如图所示:

如上图所示,有这么多地址出来,我们想要的物理地址是哪一个?接下来,您需要在游戏中更改阳光值,然后再次单击“搜索”,结果将显示出来,如图所示:


如上面的第二张图片所示,我们想要的物理地址出来了,将此地址添加到地址列表中,然后修改Sunshine的值以确认它是否为所需的地址,但是这里我们需要注意修改,我们需要单击列表地址中下拉的行的value列。其他用于修改地址和字节类型。如图所示,请勿打扰:

如上图所示,这是我们想要的物理地址。在这里,我们可以锁定此内存地址的值,该值始终为100或200或更大。只需单击前面以激活此列并选择它,即可达到锁定太阳值的效果。但是,当您关闭游戏并重新输入时,此地址无用,您需要再次查找。因此,在这里您需要找到实际日照值的基地址和偏移地址,那么如何找到它呢?找到实际地址后,右键单击并选择以查找要重写的内容。该地址是快捷键F6。每个版本的中文效果都不同。此处将弹出一个窗口,该窗口为空白,然后我们将转到游戏以更改阳光值,并查看此空白窗口中显示的代码,如图所示:




如上面的图3所示,在分析了这两个代码之后,我们可以看到它们最终都指向一个指针值17C88118。然后我们分析这两个代码的含义。我相信懂一点汇编语言的人可以理解。首先分析mov [edi + 00005560],esi指令。我们在详细信息中看到,寄存器esi中的代码为000026DE。转换为十进制的值仅为9950。那么这9950是怎么来的呢?实际上,当我做最后一步时,我曾说过要在游戏中更改阳光值,因此我先将阳光值直接修改为10000,然后种植一块石头,恰好是50,所以阳光值已更改。该指令mov [edi + 00005560],esi是将寄存器esi的9950阳光值放入地址edi + 00005560中。这个地址是谁?实际上,该地址是刚刚找到的物理地址,它满足前面的公式:物理地址=阳光基地址+偏移地址。不相信它的朋友可以自己添加并计算出来。使用寄存器edi中的指针值17C88118来添加偏移量。将地址移至0005560,以查看其是否等于阳光物理地址17C8D678。接下来,看看add [eax + 00005560],ecx指令。加法指令意味着加法。前面的mov表示分配或移动。该代码意味着将ecx寄存器中的值添加到[eax +00005560]这个地址中的值中,寄存器eax的地址是什么?它恰好又是17C88118的指针值,那么我们可以确定一件事,即17C88118的指针值,它必须是上位地址的指针值,那么上位位可以是基地址或a非偏移地址,这需要进一步确认。如何确认?指针值17C88118不在这里吗?再次将其放在CE中,然后搜索wave以查看该值对应的地址,并查看它是动态地址还是静态地址。这里我们需要在CE中普及一个知识点,中间的黑色地址代表动态地址,绿色的地址代表静态地址。好吧,将它扔到CE中进行搜索。此处的值为十六进制。因此,在搜索时,您需要检查搜索框前面的十六进制。这是十六进制搜索的含义。在此处填写完毕后,单击“新建扫描”,第一次扫描如图所示:

在这里您可以看到结果是56个地址,那么多,我们如何确认是哪个地址?您会看到有很多红色地址。实际上,这里的红色地址是一直在变化的地址。我们不在乎,只需单击再次扫描以过滤掉红色的地址,然后查看剩余的地址,如下所示:

单击并再次扫描后,我发现无论单击如何,都剩下52个结果。然后,我查看了这些结果,没有绿色的静态地址,其他地址的前几位数字相似,除了图中所示。它表明这两个地址非常特殊。这两个地址可能就是我们需要的地址。然后我去了百度。结果是这种地址在开始时更像是一个数组。基本上不是我们需要的地址,只需放弃,将这两个特殊的地址拖到下面的地址列表中,开始分析,双击地址列,在出现的更改地址窗口中复制地址,然后检查指针选项,在出现的内容框中填写刚复制的地址,写入刚在上面的内容框中找到的偏移地址00005560,结果只是Sunshine的物理地址,最后一个Sunshine值完全相同如图所示,当前的阳光值相同,两个地址相同,并且都是动态地址,如图所示:


如上图所示,这两个地址加上偏移地址可以得到阳光物理地址,那么我们需要的真正的第一级偏移地址是哪一个?这里我们需要对这两个地址进行详细的分析,同样右键单击查找访问该地址的内容,这是快捷键F5,这里一定不要混淆,以前是找出被重写的地址。不同!进入后,将像以前一样出现一个窗口,但是这两个窗口的内容不同。第一个地址是F5中的0264A400,以查找该地址之后在窗口中访问的内容,但是第二个地址0956BD3C在出现的窗口中为空白,因此,在这两个地址中,0264A400是真正的第一级偏移地址我们正在寻找,如图所示:


如上面的第二张图片所示,找到真正的第一级偏移地址0264A400后,在访问该地址的窗口中查看这些代码指令。通过比较发现,这些代码都指向相同的指针值02649C98,并且两者的偏移地址均为00000768,如图所示:


如上图所示,由于所有代码都指向相同的指针值02649C98,因此继续根据先前的方法查找第一级偏移地址,将其放入CE中,继续进行新的十六进制搜索,搜索指针取值02649C98之后,将获得下图所示的结果:

如上图所示,总共搜索了923个地址,并且还有一些绿色的静态地址。在这里我们可以尝试一下,看看这些绿色的静态地址是否就是我们想要的阳光。同样的原理,我们将几个绿色的静态地址拖到地址列表中,双击地址栏,将地址复制到出现更改地址窗口,然后检查指针选项。在内容框中填写刚复制的地址,在上面的内容框中输入刚找到的偏移地址00000768,然后单击“添加偏移”。在出现“地址”的内容框中输入刚发现的第一次偏移00005560,结果就是“阳光”物理地址和“阳光”的当前值,并且这些静态地址的结果相同。这里我们需要解释为什么我们需要填写两个偏移地址,因为我第一次找到第一级偏移地址,这次是第二级偏移地址,所以这里
阳光物理地址 = 一级偏移地址 + 偏移地址
一级偏移地址 = 阳光基址 + 偏移地址
阳光物理地址 = 阳光基址 + 第一次的偏移地址 + 第二次的偏移地址
如图所示:




如上面的四张图片所示,这四个静态地址的最终结果是相同的,并且它们都可以用作阳光基地址,因此只需随机选择一个即可。这样,找到了阳关的基地址和偏移地址。阳光的基地址和偏移地址如下:
阳光基址:006A9EC0
一级偏移:00000768
二级偏移:00005560
有人可能会在这里问,我们不是第一次发现一级偏移地址吗?您的一级补偿不应该是00005560吗?是的,那是不对的。我在这里提到的第一级偏移不是第一级偏移地址的偏移,而是基于阳光基址的第一级偏移,可以理解为从阳关基地址开始,第一级偏移就是是00000768,第二个移位是00005560。这主要是为了方便以后编写代码。好吧,这就是找到游戏基址的想法。同样,您也可以找到植物的冷却时间,但是寻找冷却时间的想法并不相同,因为我们不知道冷却时间的具体值,我们可以找到未知的初始化值您也可以按字节查找它。有关详细信息,请参阅百度。在这里我只是写出了寻找游戏内存基址以及在此过程中如何对其进行分析的想法,以防止子孙后代陷入困境。当我在寻找工厂的冷却时间时,我发现了一个坑。我按字节找到它。设备冷却后为0。冷却完成后为1。找到物理地址后,我正在寻找第一级偏差。当我移动地址时,我忘记将搜索模式字节更改为4字节类型。我搜索了很久没找到它!其他想法都一样!
插件开发的第二步-修改游戏内存地址的值
实际上,此步骤相对简单。例如,找到Sunshine的值后,每次我们玩游戏时,我们都将地址直接添加到CE的地址列表框中,并像上面验证的一样放置基址。只需填写基地址和偏移地址,然后在“值”列中双击以将值修改为我们想要的阳光值即可。只需将值更改为1即可冷却。此步骤不需要太多。提到了!
插件开发-编写游戏插件的第三步
实际上,只有那些能够编写程序的人才知道如何编写插件,只是找出所需功能的内存基址,偏移量等,并直接在程序中写入读写内存地址。 ,它相对简单,我可能只是说一句话,也就是说,在启动插件软件之后,我读取了Plants vs. Zombies的游戏进程ID,然后读取了Sunshine的物理地址,将其输出并显示,然后在启动窗口中创建它。当时,增加了一个计时器以实现实时监控日光值的目的,然后设置了几个按钮,即增加日光,锁定日光,锁定冷却时间和减少日光,取消锁定日光和取消锁定冷却时间。让我们谈谈如何实现几个按钮的功能。
增加阳光
增加阳光定义了一个全局变量。从变量中获取输入框中的值,然后将阳光物理地址中的值添加到输入值中,以达到增加阳光的目的!
WriteMemory函数实现
减少阳光
减少阳光和增加阳关的方式完全相同,只是将阳光物理地址中的值设置为减去输入的值,从而达到减少阳关的目的!
WriteMemory函数实现
锁在阳光下
我定义了一个锁定太阳的计时器,将时间段设置为999毫秒,然后将固定的太阳值设置为1000。单击锁定阳光的按钮时,将执行计时器的循环,即,计时器下面的代码每999毫秒执行一次,也就是说,将阳光的物理地址中的阳光值更改为1000,从而达到锁定阳光的目的!
SetTimer WriteMemory函数的实现
解锁阳光
解锁太阳实际上是将锁定太阳的计时器的时间设置为0。单击解锁太阳的按钮时,将执行计时器时间事件,并且不会执行计时器下方的代码。达到了取消太阳锁的目的!
锁定冷却时间和解锁冷却时间的原理与上述锁定太阳和解锁太阳的原理相同,因此我将不作详细说明,因为我对植物进行了单独描述。在每个领域。冷却锁定和解锁,所以代码比较长,实际上,在寻找植物的冷却时间时,可以与OD配合直接在冷却时间之前找到周期并将其干燥,从而使冷却时间所有的植物酒吧都不见了!
KillTimer函数实现
摘要
实际上,无论是独立游戏还是游戏,其原理都是相同的,但是可能是不同的游戏类型需要不同的东西。例如,射击游戏需要D3D技术来实现角色视角。有关定位等信息,可以参考百度的具体方法。但是,找到内存基址和偏移地址总是相同的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-348943-1.html
我终于醒了
好有道理
网友们理智多了