废话不多讲,切入正题
先了解下基础知识
http://www.kdtown.com/thread-14637-1-1.html
我们现在在道吉镇SHOP,想要前往道吉镇此房屋[即输入金手指02031F84:0002最后到达的地点]
然后查得瞬移金手指代码为02031F84:0002
打开VBA自带的内存查看器["工具"菜单->"内存查看器],输入02031F84,点击转到
注意红色框内的数据
先不输入金手指,来到此房屋内, 打开内存查看器,输入02031F84,点击转到
注意红色框内的数据
这时随便到其他城市,输入金手指代码02031F84:0002, 打开内存查看器,输入02031F84,点击转到
我们会发现与刚才在道吉镇某房屋内的数据一样
这就很好地解释了金手指工作的原理
来自PMGBA的资料
http://www.pmgba.com/dispbbs.asp?BoardID=39&ID=111799金手指为什么能修改游戏
游戏的各种状态都是以数值的形式存放在内存中的。当游戏需要改变这些值时(比如第一支精灵的体力减少二十),它就会用指令改变内存中存放这个数据的字节的值(那就让这个字节的值减少二十吧!)。当游戏需要知道一个数值时,它就会读取这个字节,并运算(比如使用喷雾剂后,你每走一步,游戏就需要读取剩余步数的值,然后把它减一,再放回去)或显示在屏幕上(比如你查看精灵的状况时,游戏要读取体力、经验值、是否麻痹、烧伤、冰冻等等数值并显示出来)。
合法”的游戏者通过游戏本身修改这些值。而使用金手指的“非法”游戏者则通过某种手段,绕过游戏而直接修改这些值,而游戏并不知情,它会认为这些数值真的改变了。这样就达到了目的。
那么金手指代码为02031F84:0002,与内存查看器查看的数据有何关联.
既然这样,那么数据在内存中的存放方式是怎样的呢?
内存是一块物理上连续的区域。在电脑里,数据全部用二进制方式存储。但是它的缺点是位数太多,不便于我们操作。所以一般能够显示内存状态的软件都是采用16进制(进位制等内容可以参考一些计算机理论书籍或数学书籍)。每个十六进制的数位为0-9或a-f中的一个.十六进制的每位可以表示0-15的数。用0-9表示0-9,超过九的数用A-F表示。
而数值存放的的基本单位是字节(其实更小的还有字等,因不常用,略去),它有两个16进制位,能表示的范围为1-255。其他单位都是构造出来的。比如双节字,顾名思义,它由两个字节组成,有四个16进制位,范围为1-65535;还有四字节由四个字节组成,有八个16进制位,范围为1-4294967295(就是二的16次方减一)。
那么十六进制和十进制怎样转换?
如果你不会转换的话,用windows自带的计算器,先调到“科学型”,选择“十进制”,然后输入一个十进制数,按“十六进制”,这样十进制数被转换到十六进制。相反的过程可以类似的进行。
关于十六进制数还有一点, 就是对两位以上的十六进制数,在内存中的存放方式与我们平常不同,它是高低位倒置的。转换方法是:1.奇数位的十六进制数,在前面补一个零(偶数位的不需要此步骤);2.以每两个十六进制位为一组;3.分好组后将组的顺序倒过来。比如一个数0123456h,补零后是00123456h,分组后就是00、12、34、56,倒过来就是56341200h。显然这操作两次后又会恢复原值。对于以字节存放的数值不存在这个问题。
0002为偶数位,因此分为00 02,接着高低位倒置,就变为02 00,这就是红色框内的数据,也是金手指输入之后的效果.对比在道吉镇SHOP的数据可得出,金手指改变了部分数据,从而实现地点转换
注:以上只是部分地点转换,不难看出道吉镇SHOP与道吉镇某房屋的数据相同的部分很多,因此推测较为简易
那么到达道吉镇SHOP的金手指是什么呢?
根据金手指工作原理,请注意02 04两组数据.因为道吉镇SHOP与道吉镇某房屋的数据相同部分很多.可设到达道吉镇SHOP的金手指为02031F84:XXXX.
则此时02 04两组数据是关键.将其倒推回去会得到0402.则到达道吉镇SHOP的金手指为02031F84:0402
回归正统,图中的想必大家很熟悉吧.
若想输入瞬移金手指02031F84:0002,则在"地址"一栏输入02031F84,在"值" 一栏输入0002,同时选择16位
关于有有符号数和无符号数,百度的解释[谢谢鸭子大大]
有符号数和无符号数的区别在于第一位表示正负数,还是数值。换句话说,有符号的二进制数最高位是符号位,剩下的是数值部分的补码(正数的补码是其本身,负数的补码是该数值取反加一)。
10000111说明这个数是负数,由于去掉符号位,0000111的补码是1111001。
而1×2^6+1×2^5+1×2^4+1×2^3+0×2^2+0×2^1+1×2^0 = 121 [这个是2进制转换10进制数的基本公式.]
所以有符号数10000111是-121
对于无符号数可以直接转换不需要考虑正负。
10000111 = 1×2^7 + 0×2^6 +0×2^5 +0×2^4 +0×2^3 +1 ×2^2 +1×2^1 +1×2^0 =135
这个不是重点,我们接下来探究的是8位,16位与32位
来自PMGBA的解释
http://www.pmgba.com/dispbbs.asp?boardid=39&id=139750一般如果冒号后面只有2个数或2个字母为8Bits(进制)
4个为16Bits,8个为32Bits。这里为270F,所以为16进制
鸭子大大专业的解释
8位表示开始修改的范围是从所给定的地址(图中:指针地址是指向02031F84)起之前数8位开始的2进制数.将被你修改.图中你输入了0001,并且选择了8位那么实际这一段数值将变为03007E28 : 01[ 0000 0001 ] 修改你的程序
16位,32位同理.
以下是在下从瞬移金手指角度的分析
输入02031F84:01,选择8位.起始地点是在道吉镇PC.会发现一开始到达自己家里,接着是道吉镇SHOP,山木镇某房屋,山木镇PC,对手家中以及对手家中2楼
若一边用内存查看器查看数据,注意红框位置
自己家里 01 02
道吉镇SHOP 01 09
山木镇某房屋 01 0A
山木镇PC 01 0B
对手家中2楼 01 01
对手家中 01 00
是否意味着这些数据也能转换成金手指?
经过在下验证,是的.
自己家里 02031F84:0201
道吉镇SHOP 02031F84:0901
山木镇某房屋 02031F84:0A01
山木镇PC 02031F84:0B01
对手家中2楼 02031F84:0101
对手家中 02031F84:0001
但是在下起初以为无论起始地点在哪里,理论上应该到达的地点如下
01 XX [XX为00~9F]
但是似乎有些是造成死机现象,还有的与起始地点的选择有关即若选择道吉镇PC为起始地点,则无法到达0108[爸爸的道馆]
目前不明是为何.
以上在下猜测输入02031F84:01,选择8位造成的情况是到达地点的不确定.因此可以衍生出更多的金手指代码
输入02031F84:0001,选择16位. 用内存查看器查看数据
这就是所谓的到达地点确定性.
那么在此基础上可以再衍生出一些变化
道吉镇PC1楼数据
道吉镇PC2楼数据
我们通过以上资料易知到达道吉镇PC1楼的金手指代码为02031F84:0202
经验证有效
但是如何到达道吉镇PC2楼,不难看出2组数据差异较大.为了方便采用32位
观察得出到达道吉镇PC2楼的金手指代码为02031F84:00000302
经验证有效
完毕.目前先到这里.欢迎挑刺
[
本帖最后由 rolki 于 2008-7-26 15:20 编辑 ]