外挂开发第一步——游戏内存地址
       说道游戏内存地址,偏移地址,这可能是整个游戏外挂开发中最难的一步,因为一个大型的网络游戏,可能一个技能或者血条的内存基址可能会偏移很多次,最后才得到一个内存地址也叫物理地址。那么,这里有个问题来了,我们为什么要技能或者血条的内存基址?不是直接修改物理地址就行了吗?这样是不行的,因为物理地址是会变动的;举个例子,每次关闭游戏重新启动以后,游戏进程是会变动的,同样的,游戏代码在内存中的存放位置,因为游戏结束以后,释放掉了内存地址,这个内存地址可能会被其他程序所占用,所以是会变动的;当你关闭游戏重新进入以后,游戏的技能或者血条在内存中的物理地址就变了。但是,游戏技能或者血条的内存基址是不会变动的,在内存中的物理地址不管怎么变动,内存基址都不会变动。那么内存基址和物理地址之间是一种什么样的关系呢?看下面这个公式:
物理地址 = 一级偏移地址 + 偏移地址
一级偏移地址 = 二级偏移地址 + 偏移地址
二级偏移地址 = 三级偏移地址 + 偏移地址
易语言怎么制作游戏
三级偏移地址 = 游戏技能基址 + 偏移地址
       如上公式,一个游戏的物理地址是等于这个游戏的基址加上偏移地址的,所以,想要每次重新进入游戏都能够到准确的物理地址进行修改内存地址的值,达到外挂的目的的话,就必须到这个物理地址当前对应的偏移地址和基址,只有这样才能够确保每次登陆游戏都能够修改物理地址的值。下面,就通过《植物大战僵尸》这款经典的单机游戏来演示一下这款游戏的内存基址的过程。
       首先,介绍一款游戏内存基址的工具Cheat Engine简称CE,Cheat Engine是一款内存修改编辑工具 ,它允许修改游戏或软件内存数据,以得到一些其他功能。它包括16进制编辑,反汇编程序,内存查工具。与同类修改工具相比,它具有强大的反汇编功能,且自身附带了外挂制作工具,可以用它直接生成外挂。好了,这个工具的具体介绍有兴趣的去百度,这里也就是百度了一下,简单的说了一下这个工具的作用,下面,打开植物大战僵尸,打开CE,在CE中到植物大战僵尸,附加到CE中去,如图所示:
       游戏附加到OD以后,看自己想修改哪儿的内容,就去对应的内存基址,怎么呢?比如修改无限阳光吧;首先,看一下最开始的阳光是多少?比如这里,开局阳光是50,就在
CE中数值一项输入50,扫描类型选择精确数值在数值类型选择4字节然后点击首次搜索,这里不懂为什么这样选择的,自己百度科普一下基础知识。如图所示:
       如上图所示,出来了这么多的地址,究竟哪一个是我们想要的物理地址呢?接下来就需要在游戏中改动一下阳光的值,然后点击再次搜索,结果就会出来了,如图所示:
       如上第二幅图所示,我们想要的物理地址就出来了,把这个地址添加到地址列表中去,然后修改一下阳光的值,确认一下是不是想要的地址,不过这里要注意,在修改的时候,我们需要点击列表地址中我们拉下来的这一行的数值这一栏,其他是修改地址和字节类型用的,不要乱动,如图所示:
       如上图所示,这就是我们想要的物理地址,这里我们可以锁定这个内存地址的值,一直是100或者200或者更多。只需要点击前面激活这一栏选中就行了,从而达到锁定阳光值的效果。但是当关闭游戏,重新进入,这个地址就没用了,又需要重新。所以,这里就需要到真正的阳光值的基址和偏移地址,那么,怎么呢?我们到这个物理地址以后,就右键,选择出是什么改写了这个地址也就是快捷键F6这个名字每个版本的效果都不一样的,这里就会弹出一个窗口,是空白,然后我们再到游戏中改变阳光的值,看看这个空白窗
口中出现的代码,如图所示:
       如上图三所示,分析这两条代码,看见最终都指向了一个指针数值17C88118,然后我们分析一下这两条代码什么意思,相信稍微懂一点汇编语言的人都能够看懂。首先分析一下mov [edi+00005560],esi这条指令,我们在详细信息中看见,寄存器esi中的代码是000026DE这个值换算成十进制刚好是9950,那么这个9950是怎么来的呢?其实就是刚刚我在做上一步的时候,说了要变动游戏中的阳光值,所以我先直接把阳光值修改成了10000,然后种了一个石头,刚好是50,所以阳光值发生了变化,这条指令mov [edi+00005560],esi就是把寄存器esi的9950的阳光值放入edi+00005560这个地址中去,这个地址是谁呢?其实这个地址就是刚刚出来的物理地址,刚好满足前面的公式:物理地址 = 阳光基址地址 + 偏移地址不信的朋友可以自己加一下算一算,用寄存器edi里面的指针数值17C88118加上偏移地址00005560看看是不是等于阳光物理地址17C8D678。接下看看add [eax+00005560],ecx这条指令,add指令是相加的意思,前面的mov是赋值或者移动的意思,这条代码的意思就是,把ecx寄存器中的值加入[eax+00005560]这个地址中的值当中去,再看看寄存器eax的地址是多少?刚好又是17C88118这个指针数值,那么,我们就可以确定一个事情,那就是17C88118这个指针数值,肯定是上一级的地址的指针数值,那么上一级要么是基址,要么
还是一个不偏移地址,这个需要进一步来确认。怎么确认呢?这里不是出来了17C88118这个指针数值嘛,再次放到CE中搜索一波,看看这个值对应的地址是多少,看看出来的是一个动态地址还是静态地址,这里需要普及一个知识点,在CE中,黑的地址表示动态地址,绿的表示静态地址,那好,丢到CE中搜索,这里这个值是十六进制的,所以在搜索的时候,需要勾选搜索框前面的hex,也就是十六进制搜索的意思,这里填好以后点击新的扫描,首次扫描如图所示:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。