—
本帖被 幻想. 执行取消锁定操作(2009-01-19)
—
最近看见太多人询问内存地址的作用和使用方法,我来做个大概的解释吧
内存地址,其实电脑的每个操作都会在内存中先存储,然后经CPU处理后返回内存最终显现出来,而内存里有个内存地址,是为了区分各种不同数据的,而每个地址则相对应一个数据。
网络游戏中,数据也会先存放到内存中,然后进行处理,包括坐标、血量、MANA等,其实所有信息都是在内存中一一存放并等待处理。处理完毕后结果将会返回原来的地址中(当然也有返回到其他的)。
通过以上的解释,大家可以明白一个道理,其实任何数据都是会下载到本地电脑上然后经过处理后再返回的(至于返回到网络和返回到本地就看数据的重要性了)包括网页的浏览等,任何在你电脑上可以看见的东西必定先存放到本地内存中或硬盘中等待处理后才会显现出来的。
内存和外挂:
说到这里当然要给大家举个例子了,就拿网络游戏来说吧。以前的网络游戏很多数据都是在本地电脑上进行处理和比对的,例如曾经的精灵,它的游戏币是在本地电脑上进行处理的,处理后的结果再返回服务器,这样就导致了当时的刷钱外挂,因为大家可以修改本地电脑上的内存地址中的数值,然后再返回给服务器。从以上可以知道单机游戏锁血锁蓝是多么简单的事了吧。因为所有的数据操作都是在本地运行计算的。
当然,还有的外挂是通过改变封包数据来达到效果的。例如魔兽世界加速外挂,比如我现在人物的坐标是0 0然后按照正常速度走的话下一秒坐标是1 1。因为魔兽世界是在本地对人物坐标进行处理,如果只是单一的改变本地游戏坐标的位置,或许你在自己电脑上会看见自己一下跑到 3 3的位置了,但实际游戏服务器上的人物还在1 1这个位置,那就毫无意义。我们可以截取发送坐标的封包,修改我们下一秒跨度的数值,向服务器发送我下一秒会在3 3的位置,这时服务器处理后你的人物就在3 3的位置了。当然,整个过程只是改变封包内的数据值,并没有向服务器多发送封包,所以有的人说是加速外挂给游戏带来了压力的说法是错误的。当然,运营商也可以通过检查你的日常数据来判断你是否使用外挂,所以是没有查不出的外挂,只有不愿意查的外挂。
而现在的网络游戏血、经验、等级、金钱等重要数据都是由服务器计算然后返回给客户端(就是我们),而且每次存放血、蓝等信息的内存地址在每次游戏的启动都会变化,在现在来说,修改其数值已经没有任何意义了,因为那只能让你在本地读取的数值不同而已,而真正的数据被存储在了服务器上,你无法修改。但是我们可以通过读取内存地址中的数值来精确我们脚本的计算。
脚本与读取内存地址:
例如我要做一个脚本,需要在血或蓝少于一个具体的值的时候加血加蓝,这时候我们就可以采用内存地址的读取,因为这种做法可以让脚本以最精确的方式去加血加蓝,而不是去看血条蓝条(其实血条蓝条这时候已经根本不重要)。在按键精灵里
有这么一个脚本。
VBSCall ReadMemory(内存地址:整数(16进制),类型:0-字节 1-整数 2-长整数,输出值-所读取的内容:长整型变量)
实际应用(中间的内存地址为假设):
VBSCall ReadMemory( &H400000,2,xue)
这句脚本的意思为,&H400000为读取内存地址400000中数值;2为读取类型,为长整数;xue则把读取出来的数值保存到xue这个变量中去。
如果这个400000的地址是用来储存血量的。那我们就可以对xue这个变量来进行判断计算。实际应用如下
If xue挂机打怪,然后人物回到挂机点(中间的内存地址为假设):
vbs dim x,y,a,b
//申明变量(其实在按键精灵里不用这么做)
VBSCall ReadMemory( &H400000,2,x)
//读取地址中的纵坐标保存到x
VBSCall ReadMemory( &H800000,2,y)
//读取地址中的横坐标保存到y
vbs a=100
vbs b=100
//也就是原始坐标或者是你想定点的坐标
if x>a and y>b
moveto 300 500
//以上坐标为虚拟,根据游戏不同自己更改,以下放入这个游戏里移动的移动方式的脚本
endif
//如果两个坐标都大于我们希望保存的地方,我们就开始向另一个方向移动
由此我们可以生成
if xa and yb
if x=a and y=b
一共5种不同的处理方法,这样让人物回到原来的点继续开始打怪就可以轻松制作原点挂机的脚本
说了那么多,一定会产生一个很大的问题,如何查找游戏内的内存地址。
内存地址的查找
我一般用金山游侠 例如我要找红,先在自己满血的时候输入上限,然后搜索,这时候会搜索出很多地址,一些是代表你当前的红,和你的上限,还有一些正好是搜索时碰巧一样的。
OK,在结果里再搜索一次,会去掉一些,这样搜索3次基本上结果已经很少了,但还不准确。
现在,你要做的是就是让自己死了,不同游戏可能不同,死的时候血是0,那就去自杀吧(如果掉经验用小号)。
在结果里用0搜索一次。
别以为这样就结束了,这次要让自己不死,那就让自己少点血,我一般采用脱掉加血上限的装备,让自己的血减少。
依照以上方法反复尝试,最后确定一个地址。
地址出现以后别高兴太早,现在很多游戏内存地址是变动的(至少每次开游戏时就变动),所以可能这次管用,到下次还要重新搜索。
以上这些都是我个人的经验之谈,可能有不精确之处,但我想基本上可以解决大部分问题,如果还有不懂的下面跟贴。
PS:这里的人看贴不回的习惯太不好了