hardiness 发表于 2019-10-19 17:09

FC游戏查找金手指的一点思路

本帖最后由 hardiness 于 2019-10-20 07:53 编辑

第一次发帖,内容特别简单,适合无编程基础的人阅读,排版排了半个小时,还是有些混乱。大家见谅。
前言
      相信80后的同学们对魂斗罗、超级玛丽等游戏都非常熟悉,甚至可以说是如数家珍。我那时候在外地上学,每星期回家一次(竟然跟现在外地工作惊人的相似)。每次回家,都要和弟弟一起打上好几个小时。我比较笨,操作也不灵活,每次打到3、4关基本上就挂了。那时候比较落后,没有电脑,没有网络。我不知道竟然还可以调出30条命,也不知可以选关这些神操作。所以也就一直没有通关过,虽然有遗憾,也算是乐此不疲。
    后来上大学学的是机械设计制造及自动化专业,算是离计算机比较远吧。童年或者少年的乐趣也渐渐遗忘了。毕业后做了自动化行业,辗转又开始编程,不过因为是自动化行业的程序,与人们印象中的程序员有很大不同,而且编程语言都是在工作中自学的,算是半个程序员吧。
    前段时间注册了论坛账号,有空来逛逛,因为差的太远,一直都是默默注视,不敢说话。前天偶然间看到论坛里,一位叫“丸子de爸爸”的大神发表了的 “植物大战僵尸修改器DIY”的文章,突然想起FC游戏来了。想重温一下旧梦。网上一搜,有很多的FC游戏的金手指作弊码。有些可以直接用,有些好像有些问题。但是我相信,肯定有很多人和我一样,不满足直接输入一条金手指,而是想知道,为什么要输入这样的一个数字。下面就我自己的一点小小思路和大家分享一下,写的不对的地方请大家指正,大神可以直接无视。特别声明,本文不需要任何编程基础,不需要掌握任何编程语言。
准备工作1、 下载FC模拟器及rom文件,我在网上下载的是VirtuaNes,.如图1

         
                      图1
2、 以魂斗罗2(超级魂斗罗)日版作为测试。如图2

                                                            
                               图2
分为两部分
      A、分析可以在游戏里直接找到数字变化的值,比如游戏人物的生命值,游戏关卡数这样子的数据。
      B、分析在游戏中不能直接找到数字变化的,比如游戏人物处在透明无敌状态,子弹类型是S弹、L弹还是其他什么的这类数据。
第一部分思路
       我们先说第1部分,拿游戏人物生命值来举例,第一因为只有人物有足够的命,才有利于后面其他测试。第二是因为数字的变化相对比较简答。人物生命值在游戏进行中,一定是一个减小的趋势,而且,我们可以确切的知道现在的生命值。这样一来就可以搜索对应的生命值,在人物死掉一条命之后,将搜索值减去1,再搜索。
以实际例子来操练
1.   首先我们打开模拟器,如图1,将魂斗罗2的rom文件直接拖到模拟器中,如图2,然后在菜单栏点击选项,打开搜索金手指,如图3。

       .
                        图3
2.   在控制器里设置操作按键如图4。
         
                      图4
3.   按设置好的Start键开始。进入游戏界面,如图5   
         
                      图5
4.   我们都知道,画面左上角的2个奖牌,代表还有2条命。但是我们不确定,画面中间的人物到底算不算一条命,也就是说,存储生命值的内存单元中,此时存的是2,还是3。不过没关系,我们一试便知。是骡子是马,拉出来溜溜嘛。
5.   我们先假设内存中存的是3,在搜索金手指中对话框的“搜索“栏中的”数据”下面的文本框里输入3,点击后面的“搜索”。结果如图6所示。我们发现搜索到了一些数据,至于是哪个我们现在还不知道,先不管它。回到模拟器,人物往前走几步,找到一个敌人,牺牲一条命。如图7所示。牺牲一条命后,按照我们刚才的思路,现在的生命值,应该变成2了。我们将3改成2继续搜索,如图8。糟了,什么也没有,牺牲了一个条命,竟然换来这样的结果,让人好心痛。看来内存中存的是3这个假设应该是不对的。
      
                        图6   
      
                                             图7
      
                            图8
6.   按F1键硬件重置,重新开始游戏,回到图5的样子,别忘了点击搜索金手指对话框的“开始”按钮,恢复到图3的样子。这次我们输入数据2点击搜索。如图9所示,我们发现,依旧有很多。老样子,往前走两步,再牺牲一次。出现图7所示画面时,修改数据为1,再次搜索。如图10所示,这次就剩下一个数据。旧值是2,新值是1,看起来有点像。那么这个0053存的到底是不是生命值呢?
                                       
      图9

                                    
         图10
7.   我们来测试一下,依旧如图10所示,双击地址0053,它会复制到右边最底下的“写入数据”栏里,我们将地址后面的数据改为4,注意,这次改的是“写入数据”栏里的数据。点击写入。回到模拟器,我们发现,奖牌数变成了4,如图11。说明我们找对了。

                  
            图11
8.   现在我们就可以往0053里面写一些其他数了,比如100。但是,发现写了100,显示的奖牌数还是4,我们点击“更新”按钮,此时0053的值已经变成了100。只是图面上显示不了那么多。如图12。
         
                        图12
9.   那么是不是写入的值越大越好呢,比如1000,10000呢?理想中应该可以,其实不行,因为0053代表一个字节,我们知道一个字节有8位,字节最多只能表示2的8次方个数,也就0-255总共256个数,如果大于或者等于256,就会向上进位,只留下余数。就像10个1就要从个位进到10位一样。比如写入256,你会发现,这时候0053里面只剩下0了,写入257,就剩下1了。256%256=0,257%256=1(%代表取余)。如图13。所以最大只能写255(如果有人觉得这一段与前面不需要编程基础的声明违背了,那就跳过,只需要记住,最大只能写入255)。

      
                           图13
10.   既然写不了那么多,最多只能写入255,那么够不够用呢,基本上对于一般操作的人来说,都是够用了。但是我比较笨,我老是担心这么多不够通关。有什么办法没有,其实办法有两个。第一个就是每过一关,你就往0053里面写入255,这样250多人总能过一关吧。即使这样还担心过不了的话,那就每过一会儿,就往里面写入一次。当然了,这个办法很笨,所以我们来看第二个办法。第二个办法就是我们今天说的金手指。右键点击搜索结果里的0053,在弹出菜单里点击“添加金手指”,如图14。在数据栏里填写一个1-255范围内的数。金手指的作用就在于,游戏过程中,这个值保持不变。
                        
                                     图14
11.   到此为止,你就可以放心大胆的玩了。当然了,一旦你知道了作弊的方法,你其实也没什么兴趣玩了,我们这里只是讨论思路。
12.   我们继续看下金手指。关掉搜索金手指对话框,回到模拟器。在菜单栏里选择工具,然后选择“金手指”打开金手指密码对话框,如图15.我们看到有一条我们刚才输入的金手指密码:0053-01-FF。0053代表内存地址,我们刚才说过了,中间的01代表第1个玩家,FF是16进制的255.也就是我们刚才输入的值。下面还有其他一些按钮。我们简单说下。全部开启,全部关闭,删除,全部删除这些不用说了。输入:如果我们有一个别人做好的金手指密码,那就可以点开输入按钮,按照格式输入。编辑:选择已有的金手指,修改其值。保存:可以将我们写好的金手指保存为文件,分享给别人。或者留着下次使用。载入:加载别人分享的金手指文件,或者自己以前保存的。
      
                        图15
第一部分到此为止。小结一下,凡是在游戏运行中可以明确观察到数据变化的值,查找起来相对容易。可以按照其变化趋势,逐步查找。对于有疑问的值,可以选定范围,逐个测试。应该比较快的能找到真实地址。
====================================

第二部分思路
       这一部分相对前一部分,稍微麻烦一点,要注意每一步的操作。
      下面我们继续分析在游戏中不方便直接观察到数据变化的值的查找思路。(以透明无敌和S弹的设置来举例。)
      先说透明无敌,我们发现,游戏人物在牺牲之后,新出来的人有一段时间的透明闪动状态,这时候敌人的攻击不会伤害到他。如果我们可以利用这个特性,让人物一直保持这个状态,那不是很爽吗?要想让人物保存透明无敌状态,用第一部分的方法就不行了,因为我们不知道要搜索什么数据。
      那我们换个思路,我们发现,透明无敌的闪动状态,过一会儿就消失了,变成了正常状态。基于这个特点,我们比较闪动状态时的内存值,和正常时的内存值。当人物一直处于不闪动状态(我们称为状态1)时,无论是前进、后退、射击敌人。内存中保存人物是否闪动的那个内存单元(我们暂且将该单元称为X)的值应该是不变的。而一旦游戏人物被敌人打死,重新回到了闪动状态(我们成为状态2)时,此时内存单元X一定发生了改变,等到再次回到正常状态时(我们称为状态3),内存单元的值又会再次变化。所以状态1时的X值不等于状态2时的X值,状态2时的X值也不等于状态3的X值,但是状态1时的值等于状态3时的值,因为都是正常状态嘛。它的值应该不会变化。我们假设状态1时X的值是aa,状态2时值是bb,状态3时候值也是aa,如下表所示。其实具体的值是多少我们并不关心,只关心是否变化。而且,我们在找到这个地址之前,也不知道X是多少。


状态X的值
状态1(正常)aa
状态2(闪动)bb
状态3(正常)aa
       表1
       有了这个思路,那我们这次不搜索数据了,只需要在每次状态变化时,点击搜索金手指的“旧!=新”,在状态无切换时,点击“旧=新”按钮。,注意,在点击了“旧!=新”按钮后,需要点击一次“更新”按钮,因为后面还要继续对比,而这个值不会自己更新。点击了“旧=新”按钮后,无需点击“更新”按钮,因为没有变化,点了也没用。通过在几个不同的地方,反复点击这几个按钮,最终将得到透明状态的内存地址,稍后介绍其地址含义。下面以例子来说明。
1)   首先打开模拟器,拖入魂斗罗2的rom文件,打开“搜索金手指”对话框,并点击开始初始化一下。这几部可以参看第一部分的图1-3。
2)   第一部分我们已经找到了死亡不掉命的金手指密码,打开金手指对话框(参考图15),输入金手指密码。因为后面我们测试的时候人物要死好几次。
3)   操作游戏人物往前跑,来到第一个墙上站着红色敌人的地方,如图16。从游戏人物下飞机,到现在,X的值并没有变化,但是游戏中有一些其他的数据,比如位置,敌人个数等,发生了一些变化。此时我们进行第1次过滤,点击“搜索金手指”对话框里的“旧=新”,如图17.可能你们显示的和我的不一样,因为停的位置不同。不过没关系,现在这些值都没有用。   
               
                           图16
               
                                             图17
4)   完成之后,让游戏人物,被打死,知道新的带透明闪动的人物出现,如图18.因为截图没有透明闪动的效果,所以使用标记文字,大家凑合看。这时候人物处于闪动状态,X的值一定与正常状态不同,发生了变化。我们进行第2次过滤。点击“旧!=新”,如图19。然后点击更新。注意,这里一定要点更新。
                  
                                                      图18
                     
                                                图19
5)   等到人物不闪动了,回到正常状态后,此时X值又发生了变化,我们进行第3次过滤。点击“旧!=新”,切记,完了要点更新。这次没有截图。
6)   恢复正常的人物来到前面的坑里,如图20.消灭旁边的敌人,不消灭也没关系。从刚才的正常状态到现在,又过去了一会儿,游戏中的一些数据,已经发生了变化,但是X值没有变,因为人物还在正常状态。我们进行第4次过滤。点击“旧=新”按钮,如图21.   
                  
                                    图20   
                     
                                     图21
7)   在坑里以及外面一番激战之后,游戏人物再次主动牺牲,等到出现图18闪动状态时,X值再次变化。我们进行第5次过滤。点击“旧!=新”,如图22.然后别忘了点更新。
                     
                                          图22
8)   等游戏人物再次恢复正常状态时,X值变化,进行第6次更新,点击“旧!=新”,然后点击更新。此次未截图。
9)   然后一路狂奔到图23,这一路人物没死,所以X值未变化。消灭一些敌人后,进行第7次更新。点击“旧=新”,如图24,这时候,搜索结果已经不是很多了。让游戏人物再次主动献上人头,回到红色闪动状态时,进行第8次更新,点击“旧!=新”,如图25,终于,我们发现只剩下一个地址了,00C4,那么00C4的值到底是什么呢。我们向00C4写入200,发现游戏人物出现了大概2秒钟的透明闪动。证明我们要找的透明闪动的内存单元找了,经过反复测试,发现这个单元存的是剩下闪动的时间。时间大概是00C4的值乘以0.01秒。
                        
                                        图23
                     
                                              图24   
                     
                                          图25
10)这里要注意的是,在操作过程中,可能经常会因为搞错当前状态,或者忘了点击更新(因为搜索结果不会主动更新)而导致,搜索的结果出错。此时不要气馁,重新从头来过。按键盘的F1键进行硬件复位,然后点搜索金手指对话框的开始按钮,清理搜索数据。经过几次反复练习。就会找到真正的内存单元。
11)知道了00C4之后,为了防止透明无敌闪动的状态消失,我们右键点击00C4,点击添加金手指,输入一个大于10小于255的数。即可开启透明无敌旅程了。
S弹的金手指查找
       S弹的查找与透明无敌基本上一致,只不过是在吃弹前后,反复的点击旧!=新、旧=新来进行判断。通关过滤,我们得到如图26所示的地址00B8,我们试着向00B8写入值,可以发现,写入2的话,则是S弹。写入其他值是别的子弹类型。同上一步一样,写入金手指。到这里,思路就分享完了,这个思路可用用到别的游戏中去。
   这是一篇很简单的初级文章,谈不上任何破解,只是为了分享自己的一点小思路。希望大家不要见笑。最后附上模拟器和魂斗罗2的文件。
                  
                           图26

zsj7953187 发表于 2019-10-20 03:44

金手指 好多年前还没有网络游戏之前我玩的单机游戏都是开金山游侠金手指作弊。不开根本命不够。不到10分钟就完蛋。那个时候我开的也是和楼主一样的金手指 就是自己找一点一点的试。后面就能试出无限命或者无限血

1983 发表于 2019-10-20 00:08

还可以调出30条命????我的天!
不过这游戏玩多了,也就不难。
1、记得以前没通关前,一直想通关,后来一条命都没死就通关了。
2、没全部通关前,一直玩,深夜也没停下,通关之后,那种喜悦、那种成就,只能自己一个人留在心里。
3、一个人玩再巅峰造极都没用,没啥子乐趣,和邻居、朋友一起玩才有意思!

zcgts 发表于 2019-10-19 17:15

学习学习不懂就要学{:1_926:}

丶懒喵喵 发表于 2019-10-19 17:26

你试试CE看看。

hardiness 发表于 2019-10-19 17:30

丶懒喵喵 发表于 2019-10-19 17:26
你试试CE看看。

只想用FC自己的功能来找一种思路,CE我相信很强大,以后再试一下。

Alfred斯斯 发表于 2019-10-19 18:22

收藏了!!!谢谢

Nikoo是橘猫 发表于 2019-10-19 18:39

感谢分享,受教了

双眼已瞎 发表于 2019-10-19 18:43

这么有耐心的楼主很少啊!{:1_918:}

hwbbill 发表于 2019-10-19 19:58

这个好~回忆回忆

getserver 发表于 2019-10-19 20:11

期待有人用6502汇编级的 查找思路

l95726984y 发表于 2019-10-19 20:39

不错不错
页: [1] 2 3 4 5
查看完整版本: FC游戏查找金手指的一点思路