棋牌类游戏内存外挂(辅助工具)制作方法
游戏外挂的制作方式基本上有三种:
1、
图像判别,这种方式比较简单,缺点是不稳定,不能切换游戏画面。
2、
内存方式,依靠游戏程序在内存中的数据,达到获取和改写游戏数据的目的。
3、
截取网络数据包,分析数据包,得到需要的数据,或发送伪造数据包达到修改游戏的目的。
第一种方式和第二种方式我都实际用过,第三种因为水平的原因没有尝试过。第一种方式适合像“大家来找茬”这样的游戏(我做的是QQ的大家来找茬)。
今天我主要讲一下第二种方式,内存获取方式。以联众的“新版保皇”(5人打的纸牌游戏)游戏为例子。配合CE(Cheat Engine)来查找关键数据。这里提一下CE这款软件,它是一款类似“金山游侠”的查找软件中数据的软件,但功能更强大,可以反汇编,可以查看内存数据,也支持下断点。
制作外挂的目的:
自动记录玩家都出了什么牌,显示外面还剩下哪些牌。(现在的在线纸牌游戏,其他玩家未出的牌是记录在服务器上的,并不在你的内存里,所以你的内存中是没有别人未出的牌的,只有你自己的牌、以及别的玩家打出的牌在内存中)
制作外挂,分析游戏的内存数据需要有一个突破口,那么对于纸牌游戏突破口在哪里?
以往我们用金山游侠改单机游戏的时候,比如要改金钱,首先用金山游侠查一下你现在的金钱数(比如说是1000),然后把你的钱花掉一下,比如变成990,然后在用金山游侠查一下990,这样查几次,就能找到1,2个固定的地址。CE的用法也是这样,支持这样的查找。
纸牌游戏中,有哪些东西是数值性质的呢?想一想,每一轮过后你手上剩下的牌数,每次你打出的牌是多少张,以及牌面(是7,8,还是A,K),包括花色(是红桃还是黑桃或其他)这些都是数值。但有些我们好确定,有些不好确定。比如说花色:红桃在内存中是用什么数值表示的呢?我们不确定;包括牌面,你打出一个6,这个6在内存中是不是6呢?不能确定。比较好确定的是:每个玩家手中还剩下多少牌,每一轮每个玩家打出了几张牌。好的,我们就以玩家手上剩下多少张牌来做为我们的突破口。
游戏一开始,每个玩家(共5个玩家)手上都有33张牌。OK,我们在CE中查找数值33,找出来一大堆,接下来,等待玩家出牌,比如说玩家自己出了两张牌,好的,这时候玩家手上还剩下31张牌,在CE里面查找31,运气好的话会发现只剩下几个地址了,等再出几轮牌,你就能找到和你手中剩余牌数保持一致的地址了,看起来一切尽在掌握,和当年用金山游侠一样VERY EASY。但是,很不幸,你兴奋的记下的这个内存地址和在你关掉联众,再次打开“新版保皇”游戏重新获取到得地址居然不一样了。为什么?
这是因为联众采用的是动态地址来存放游戏数据的。我们必须找到变化背后不变的东西。继续使用我们的好搭档CE。这次我们用到它下断点的功能。
如上图,我们找到存放我们牌数的地址0108C6C4(注意是16进制的),然后点右键,选择“寻找时什么在访问这个地址”,一旦我们出了牌(牌数变化了),改变牌数的汇编语句就会被记录下来,如下图。
点击“更多信息”,此时内存中的各个寄存器的数值也能看到。因为在这里是
mov [edi+5c],ecx(红色标记)
这句改变了我们的牌数,所以可以看出我们存牌的地址是存放在内存的[edi+5c]这个位置。
这里就是一个动态的内存地址(在同一次游戏中这个地址不变,但重新开始游戏后寄存器EDI获得的变量是另外一个值。)看一下此时edi这个寄存器对应的值:01093640。
我们回到CE的主界面,搜索此时EDI寄存器对应的01093640这个值。可能会搜索不到,这里需要说明一下,我们前面是随便以一位玩家的剩余牌数来进行搜索的,比如这个游戏用5个玩家,你搜索5个玩家的剩余牌数,再用上面说的方式在CE里找EDI寄存器对应的地址,但很可能找不到,因为这些地址当中可能只有一个是通过变量来表示的,其他的地址是在变量的基础上加一个常数得到的。打个比方说:01093640这个地址,可能是通过变量X(如01000000)+常数(如93640)得到的,这就像我们前面说的存放你的牌的内存地址并不是固定的而是动态的一样。不过一般来说,总还是有一个值你能够搜索到正确的内存地址。
比如这个游戏,我们搜索01093640这个16进制值,发现这个值存放在内存的4BCD8C处。
4BCD8C这个值是固定的还是动态的呢?我们继续再游戏中搜索一下4BCD8C这个值,发现没有找到。所以这个值如果是正确的,那么它应该就是最后的固定值了。
分析到这里,其实概括起来就很简单的一个式子:
剩余牌存放地址=内存中4BCD8C这个地址对应的值+5C
也就是:牌数=[[4BCD8C]+5C] (方括号[]表示取该地址下的值)
取得这个关键地址后,其他的就势如破竹,通过查找和观察就能找到其他数据在内存中的位置了,一般来说这些数据都是其中存放在一起的。
比如说牌数、花色这些东西要分析内存数据找到相互对应的关系。
总之,做外挂,耐心、细心都很重要。当初就为了找这个动态地址对应的固定地址都让我很头疼了一阵子。(据说腾讯的纸牌游戏是用的固定地址,不知道是不是真的^^)