外挂是之前写的,现在为了写博客,把之前的内容再翻上来。

先来看看植物大战僵尸的界面:

plant1

有没有一种怀恋的感觉。
哈哈,好了,来讲一下外挂原理。
所有的游戏的关键数据都保存在内存中,找到它然后修改掉,就是外挂了。
是不是感觉很简单,其实在实际操作中,倒是麻烦一点。
最关键的是,如何找到这个内存地址。
我们现在就开始找吧,我们要用到的工具Cheat Engine(简称CE)。
首先我们打开它:
首先要点那个小电脑的按钮,然后打开植物大战僵尸的游戏。
然后在value文本框中输入,阳光数值,点First scan。
plant2
这就找到所有值是50的内存地址了,这个时候还不知道那一个是阳光的。  plant3
所以我们这个时候要切换进游戏改变一下阳光的数值。
再来搜索一遍。
plant4
直接就出来了。
这个时候我们第这个地址任意改个值试试。
plant5
看到没有,阳光值直接被改变了,说明找到的值是对的。
这个时候是不是就要直接去写代码了呢,并不是。因为这个地址是不固定的,每次打开游戏后,这个地址就会改变。那我们怎么动态确定 这个地址的位置呢。
首先,按照原理来讲,游戏本身总要知道这个内存的位置吧,不然他要怎么这个地址。
那个它是怎么访问的呢,嗯,可以参考下,缓冲区溢出漏洞里面的函数调用原理。
其实就是要找到一个 内存基址,这个地址是不变的,在这个基址的基础上偏移几次,就能找到这个位置。
嗯,这么说有点抽象,先来演示一波。
要怎么做呢。
plant6
在这个内存地址上,右击选择 Find out what accesses this address。
寻找所有访问这个地址的代码。
plant7
找到一个地址,来看一眼。
寻找类似这样的语句,mov eax,[esi+XXXX] 的。这里解释一下,esi是变址寄存器,嗯,相当于存放指针的值。esi中s是source的意思,源变址寄存器。还有有寄存器是edi,目的变址寄存器。
这里记录下,esi的寄存器的值。
接下来搜索esi的值,看看内存中有哪些内存中保存了esi的值。
plant8
嗯,找到很多个,接下来就是苦力活了,要不停的重复上述的步骤,寻找有哪些代码访问了这个地址,这个要试很多次,要有耐心哦。
plant9
找到了第二个偏移地址。还要继续。
plant10
直到这一步,看右边的地址是绿色的,代表静态地址,然后再看访问他的代码,
直接mov esi一个值,没错,这个值就是内存基址了。
找到这里,内存寻找结束。
可能还是不是很明白原理,我就再来讲一下。
找到的基址是0x6A9EC0,偏移量1是0x768,偏移量2是0x5560。
那么需要怎么找到最终地址呢。
首先要读取基址的内容,他保存的是下一个 地址 的指针。
把这个指针加上 偏移量 0x768 ,再读取这个地址的内容。
这个内容还是个指针,这个指针再加上 便宜量0x5560 ,成为另外一个指针。
这个指针就是 阳光值的地址。
希望我说的不要太绕。
如果解释太麻烦,就来看代码:
plant12
代码并不是很长。
最后,来看下最终激动人心的结果把。
plant11
哈哈,每个版本的基址和偏移量不一样,需要自己调试。
附上,代码地址:僵尸外挂源码