究極綠寶石5.3——科普向,什么是金手指(八)
說在前面:
????上期專欄總結(jié)的那張關(guān)于精靈的變量地址映射表,是可以通過之前許多期專欄的方法探索到的。本期專欄將再介紹一個探索映射表的方法,在VBA模擬器內(nèi)存這片“大海”中,撈到我們想要的那根“針”——變量。

模糊查找功能
????在介紹新方法之前,先來回顧一下我們之前探索映射表都有什么方法。
????第二期,我們介紹了“變量地址查看器”這個功能,能夠看到VBA內(nèi)存中的所有信息。它就像一片汪洋大海,包含著成千上萬個變量,信息量實(shí)在是太巨大了。但是有這樣一個信息庫總比沒有強(qiáng),就是它的存在驗(yàn)證了映射表的通用性和“相似變量緊挨著放”這些重要規(guī)律。
????第三、四兩期,我們介紹了“查找金手指”這個功能。當(dāng)時的用法是我們先確定好一個變量取值,然后搜索所有是這個變量取值的變量地址在哪,通過“追蹤式變量取值查找”逐步篩選出我們要找的變量。
????第五、六兩期,我們介紹了“金手指列表”這個功能。在確定好一個變量地址后,我們通過金手指不斷修改變量取值,來探索整個變量取值的映射表。
????可以看到,真正用來探索映射表的方法是“查找金手指”和“金手指列表”提供的功能,而“變量地址查看器”更多地是作為驗(yàn)證查找結(jié)果是否準(zhǔn)確的手段。上面提到的方法有個共同的特點(diǎn),那就是我們必須提前知道一點(diǎn)信息——是某個特定的變量取值也好,是某個已知含義的變量地址也好——通過已知的這樣一點(diǎn)信息,來推測、探索出新的信息。
????如果一上來我們什么都不知道該怎么辦?我們在游戲中看到某個游戲?qū)嶓w,想找它對應(yīng)的變量,它的變量地址現(xiàn)在是未知的,找到它就是我們的目標(biāo)。可是這個變量對應(yīng)到的游戲?qū)嶓w本身不是數(shù)字,所以不能通過直接找數(shù)字的方式來找到它。猜測這個變量取值的映射表也很困難,因?yàn)樗鼘?yīng)的游戲?qū)嶓w似乎沒有明顯的順序,很難對應(yīng)到數(shù)字上來。
????這種情況下,之前介紹的“查找金手指”和“金手指列表”功能就都無法起作用了,因?yàn)樗鼈兌夹枰?strong>已知一點(diǎn)信息,但現(xiàn)在我們什么都不知道。第四期的專欄最后給了一張“查找金手指”功能的流程圖,里面提供了一種方法,就是從網(wǎng)上找一找是不是別人發(fā)現(xiàn)了這個游戲?qū)嶓w對應(yīng)的變量,作為參考,然后驗(yàn)證是否正確。如果從網(wǎng)上也找不到該怎么辦呢?
????現(xiàn)在就需要“查找金手指”界面的“模糊查找”功能,讓我們“無中生有”,在什么信息都不知道的情況下找到這個變量。
查找金手指例5——主角所在地點(diǎn)的金手指在哪里?
????我們以游戲中主角當(dāng)前所在的地點(diǎn)為例,介紹“查找金手指”里面“模糊查找”的功能該如何使用。
????作者使用一個測試存檔,當(dāng)前主角位于未白鎮(zhèn):

????我們想要找到“未白鎮(zhèn)”這個地點(diǎn)它對應(yīng)的變量地址在哪里。打開“金手指——查找金手指”,來到“查找金手指”界面,我們在“查找類型”中,選擇“模糊查找”:

????可以看到,選中“模糊查找”后,下面那個“精確查找的目標(biāo)值”后面的輸入框就不能輸入了。這個“模糊查找”是干什么的呢?其實(shí)作者認(rèn)為這里的“模糊查找”翻譯的有問題(現(xiàn)在展示的界面是漢化的VBA模擬器,1.80版本),能表達(dá)這個功能真實(shí)含義的應(yīng)該是“利用舊值查找”。
????“比較類型”中列舉了一系列數(shù)字之間的比較關(guān)系,從“相等”“不等”一直到“大于或等于”,這里作比較的兩個數(shù)字,在“精確查找”的功能下,比較的是目前留在上面列表里的變量取值,和我們在下面目標(biāo)值的輸入框內(nèi)輸入的數(shù)字。而在“模糊查找”的功能下,比較的是目前留在上面列表里的變量取值,和那些變量在本次查找之前的取值(也就是上圖第二列的“舊值”)。簡而言之,“精確查找”是給定目標(biāo)去比較,而“模糊查找”是變量自己和自己去比較。
????使用“模糊查找”時,“數(shù)據(jù)尺寸”這個選項(xiàng)不太容易選擇,因?yàn)槲覀儾恢老胍业淖兞块L度究竟是多少。這里作者以中間的那個選項(xiàng)“16位”為例。如果不幸這個選項(xiàng)沒有找到,我們還需要將“8位”和“32位”再試一次。
????“有/無”正負(fù)之分這里最好選擇“十六進(jìn)制”,因?yàn)榻鹗种冈即a的格式里用的都是十六進(jìn)制數(shù),這里找到變量之后就直接可以拿到“金手指列表”里去用,而不需要從十進(jìn)制再換算過去。
????注意:現(xiàn)在是我們的第一次查找。對于“模糊查找”而言,第一次查找還沒有“舊值”這個概念,我們需要把全部變量都加載到上面那個列表里去,然后一點(diǎn)一點(diǎn)篩選?!氨容^類型”中選擇“相等”時,第一次模糊查找就是把所有的變量都列舉出來?,F(xiàn)在點(diǎn)擊“開始”,然后點(diǎn)擊“查找”:

????跳出一個警告框,如果點(diǎn)擊警告框上的“確定”按鈕,會發(fā)現(xiàn)“金手指查找”界面里還是空空如也,并沒有像第三、四期那樣列舉出好多變量。其實(shí)用第三、四期的方法查找變量時也有可能碰到這個警告框,它的含義是找到符合條件的變量太多了,它列不出來。但是,第一次查找并沒有失敗,它只是不顯示給你看,并不代表它沒有找到或沒有找全。這一點(diǎn)非常重要!有的讀者可能看到這個警告框就以為查找失敗了,其實(shí)并沒有,我們的查找才剛剛開始。
????點(diǎn)擊警告框的“確認(rèn)”按鈕,再點(diǎn)擊“金手指界面”的“確認(rèn)”按鈕,回到游戲,主角用“騎行裝置”飛到古辰鎮(zhèn):

????再次打開“查找金手指”界面,此時我們把“比較類型”選成“不等”:

????這一步是模糊查找的精髓。我們其實(shí)什么信息都不知道,不知道“未白鎮(zhèn)”映射到的變量取值是什么,也不知道“古辰鎮(zhèn)”映射到的變量取值是什么,但是我們知道,如果游戲中主角從未白鎮(zhèn)來到了古辰鎮(zhèn),這個變量一定會發(fā)生變化!而“模糊查找”+“不等”表達(dá)的含義就是查找新值和舊值不同的那些變量,這些變量一定包含了描述主角所在地點(diǎn)的變量,因此它可以作為篩選條件,來進(jìn)行我們的第二次查找:

????篩選的成果還是很明顯的,這次查找的結(jié)果給我們列舉出來了。但是列表中的變量還是太多了,我們需要進(jìn)一步篩選。這次換個方式,不是用騎行裝置飛到某個城市,而是步行走到102號公路:

????游戲界面中,左上角彈出的“102號公路”的提示框就是變量“角色所在地點(diǎn)”發(fā)生改變的最好證明。我們還是用剛才那個“不等”的設(shè)置再搜索一遍:

????雖然變量數(shù)又縮減了,但是縮減的速度明顯不如上一次。接下來,無論是步行到一個新地點(diǎn)還是飛到一個新地點(diǎn),都會發(fā)現(xiàn)變量數(shù)縮減的速度越來越慢,這時我們就需要換個策略。
????記住我們現(xiàn)在是在102道路。在游戲中,我們隨便干點(diǎn)別的事情,給精靈喂個糖果、去草叢里打個精靈、在商店買個東西、找NPC打一架、去水靜市百貨大樓抽個獎……作者這里是去古辰鎮(zhèn)精靈中心進(jìn)行了一次回復(fù),然后回到102道路,再次打開“查找金手指”界面,只不過這次要把“比較類型”設(shè)置為“相等”:

????我們之所以剛才進(jìn)行了一些游戲內(nèi)的操作,就是要更改一些游戲中的變量,但是當(dāng)我們最后回到102道路的時候,我們知道和上一次查找相比,“主角所在地點(diǎn)”這個變量應(yīng)該沒有發(fā)生變化。因此這次查找我們把“比較類型”改為相等,再次查找:

????使用“模糊查找”的特點(diǎn)就是需要用比“精確查找”多得多的次數(shù)才能找到我們想要的變量,并且需要經(jīng)常在“不等”和“相等”這兩種模式之間切換。因此每次點(diǎn)擊“查找”按鈕前,一定要清楚地記得應(yīng)該選擇“相等”還是“不等”,一旦選錯,前功盡棄,這一點(diǎn)千萬注意!
????查找到現(xiàn)在這個樣子,還有幾個小技巧可以介紹:
很多變量會在這個過程中變成0。盡管它們也是經(jīng)過層層篩選,可能是我們最后的目標(biāo),但通常來說,在我們變換了這么多次地點(diǎn)之后,當(dāng)前地點(diǎn)恰好映射到0的概率還是很低的,因此我們可以用一次“精確查找”+“不等”+“輸入框輸入0”把這些變量篩掉。同樣FFFF這種取值基本上也不太可能出現(xiàn)。
可能會有很多相鄰變量取相同的值。比如在列表中看到十幾個甚至幾十個在地址上靠得很近的變量取相同的值(可以用鼠標(biāo)滾輪查看列表,發(fā)現(xiàn)這種規(guī)律很明顯),這時可以通過“精確查找”把這種變量篩掉,因?yàn)槠谕衔覀兿胍业拿枋龅攸c(diǎn)的變量沒那么多。
每次都來到不同的地點(diǎn),記住自己曾經(jīng)用來精確查找篩掉變量的取值,如果變量中又出現(xiàn)的這個取值,則可以直接篩掉,因?yàn)閬淼讲煌牡攸c(diǎn)意味著我們想要的變量取值會一直變化,而不會變成之前的某個值。
回顧一下第五期“內(nèi)存視圖”的知識,我們知道游戲存檔內(nèi)的變量,它的變量地址一定是0202或者0203開頭的,所以不滿足這個條件的地址我們可以一概篩掉。
等到最后只剩下十幾個變量的時候,如果發(fā)現(xiàn)無論在游戲中做什么操作都無法進(jìn)行進(jìn)一步篩選,就轉(zhuǎn)向“金手指列表”功能。把目前的變量地址都記下來,一條條去“金手指列表”中去試。
????作者又經(jīng)過了多輪查找,變量終于只剩下了十幾個:

????此時我們可以用“查找金手指”頁面的“添加金手指”,把現(xiàn)在的結(jié)果保存一下。點(diǎn)擊第一行地址,然后點(diǎn)擊“添加金手指”按鈕:

????這里數(shù)值我們填入和“查找金手指”頁面相同的變量取值,用來區(qū)分列表中這些找到的這些變量。全都添加上去之后,我們打開“金手指——金手指列表”,現(xiàn)在所有可能是“角色所在地點(diǎn)”的變量都列舉在里面了:

????我們只開啟其中一條金手指,并且把“還原為前一個數(shù)值”的勾選框勾選上,進(jìn)行逐個排查。如上圖所示,這一列金手指,我們只開啟了第一行,剩下的都是關(guān)閉狀態(tài)。
????這些金手指是可以保存的,打開“金手指——保存金手指列表”,這相當(dāng)于把我們目前的查找結(jié)果暫存一下。“查找金手指”界面和“金手指列表”界面并沒有保留歷史記錄的功能,發(fā)生更改之后就有可能找不到之前的記錄了;當(dāng)然,下次打開游戲想要用的時候,就用“讀取金手指列表”這個功能:

????打開單個金手指是什么含義呢?根據(jù)原始代碼的格式,這條金手指如果一直開啟的話,是強(qiáng)制將這個地址處的變量固定為特定的取值。而這個地址有可能代表的是“角色所在地點(diǎn)”,如果這個變量被金手指固定住的話,我們在游戲中就無法更改“角色所在地點(diǎn)”,換句話說就是我們哪兒也去不了,只能在當(dāng)前地點(diǎn)這個特定區(qū)域移動!
????這是什么含義呢?主角當(dāng)前站在未白鎮(zhèn)的家門口,當(dāng)金手指開成上面的樣子(就是02025a04:0900),讓主角走進(jìn)家門試一下:

????主角竟然還是出現(xiàn)在未白鎮(zhèn),也就是說現(xiàn)在主角回不了家了!我們再用騎行裝置試一下,看看能不能飛到別的城市,結(jié)果還是不行,無論騎行裝置選擇哪個城市,最后飛到的一定還是未白鎮(zhèn)!
????出現(xiàn)這種效果,就說明02025a04這個地址就是我們要找的變量。不過,我們還需要驗(yàn)證一下其他變量是不是有相同的效果。用進(jìn)門或者騎行裝置飛行的方式測試剩下的變量,發(fā)現(xiàn)020322e4也能具備同樣的效果。測試期間會出現(xiàn)各種奇怪的事,比如有的金手指會讓房間里的人變一個樣子,有的會讓房子進(jìn)去了出不來,有的會讓角色和其他人對話的時候卡死,還有的會讓主角進(jìn)門后直接黑屏……用錯了金手指的后果可見一斑!
????現(xiàn)在可以下結(jié)論了:角色所在地點(diǎn)的變量地址有兩個:02025a04和020322e4。利用這個變量地址,我們可以探索“角色所在地點(diǎn)”的映射表。
????這兩個地址對應(yīng)的金手指,就是瞬移金手指,當(dāng)金手指啟用后,通過進(jìn)出門、上下電梯/梯子、進(jìn)出洞口、使用騎行裝置、離洞繩、瞬間移動技能、挖洞技能等等能改變地點(diǎn)的操作的時候,就會瞬移到變量取值對應(yīng)的地點(diǎn)。這兩個地址都能用嗎?讀者們可以測試一下,其實(shí)020322e4這個地址更好用一些,02025a04會把主角傳送到一些奇怪的位置,甚至可能卡死。
????那么使用這個金手指會有副作用嗎?會導(dǎo)致壞檔嗎?如果讀者們還有這種問題,就讓我們再次回顧使用金手指的原則:
????只要是按照游戲正常流程能達(dá)到的游戲狀態(tài),使用金手指也能達(dá)到,并且不會被反作弊機(jī)制檢測到,更不會導(dǎo)致壞檔。
????換句話說,只要當(dāng)前游戲流程允許你來到這個地點(diǎn),你用金手指來到就不會有任何副作用。反之,如果當(dāng)前游戲流程里你還不能來到這個地點(diǎn),而你用金手指來了,等待著你的很有可能就是壞檔。
????合法使用瞬移金手指的例子可以舉出兩個很有實(shí)用價(jià)值的:
????第一個例子,是二周目來到天空之柱頂層捕捉烈空坐,不知有多少讀者卡在天空之柱的自行車挑戰(zhàn)上。很多讀者不能理解為什么一個主線劇情這么考驗(yàn)玩家的操作,我天生就是手殘?jiān)趺崔k?其實(shí)按照游戲劇情流程,玩家已經(jīng)不是第一次來到天空之柱了,上一次來天空之柱還是請烈空坐解決固拉多和蓋歐卡爭斗的時候,是在一周目打琉璃市水系道館之前,那時天空之柱還沒有那么多碎裂的地板,也就不存在自行車挑戰(zhàn)的問題。
????如果玩家能夠在第一次到達(dá)天空之柱頂層的時候,從“變量地址查看器”中看一下“角色所在地點(diǎn)”的變量取值,完全可以在第二次要去的時候用瞬移的金手指過去,使用它模擬的游戲正常流程就是你費(fèi)盡千辛萬苦騎自行車到達(dá)了天空之柱的頂層。由于此時的正常游戲流程是允許你到達(dá)天空之柱頂層的,因此這種情況下使用瞬移到天空之柱頂層的金手指就不會有任何副作用,更不會導(dǎo)致壞檔。這里可以告訴大家,天空之柱頂層對應(yīng)的變量取值是5518。
????第二個例子,是探索究極洞的時候,各種對戰(zhàn)NPC一直消耗你的隊(duì)伍,不是給你來個異常狀態(tài),就是用自爆之類的技能把你的精靈打殘,所以玩家們在探索究極洞之前會把全復(fù)藥、活力碎片等等道具買得盡可能多。其實(shí)臨時返回到究極洞外,到某個城市的精靈中心回復(fù)一下,然后再回去也是可以的,問題就是跑路太長、太費(fèi)時費(fèi)力了?,F(xiàn)在有了瞬移金手指,模擬一下這個跑路的過程,很多情況下是完全合法的,是不是節(jié)省出了大量的時間?

????剛才舉的第二個例子,我們可以利用瞬移金手指回到精靈中心進(jìn)行回復(fù),然后再瞬移到我們剛才所在的位置,讓游戲劇情流程繼續(xù)下去。其實(shí),有一種更快捷的方式,相當(dāng)于把精靈中心隨身攜帶,只需要按下某個組合鍵,就相當(dāng)于主角來到了某個精靈中心和護(hù)士進(jìn)行對話,然后回復(fù)隊(duì)伍的全部精靈。這種更快捷的方式,就是下期專欄將要介紹的V3格式金手指涵蓋的功能。
????V3格式的金手指在第五期專欄中提到過,當(dāng)時只是說這類金手指是原始代碼加密生成的,其實(shí)V3格式的金手指功能要比原始代碼強(qiáng)大得多,也絕不僅僅只有加密這一步這么簡單。下期專欄涉及到的金手指內(nèi)容的難度即將進(jìn)入瘋狂模式,覺得難度太大的讀者可以量力而行,先把前面的專欄內(nèi)容弄明白了再說。如果是大佬則請無視,這些東西說不定都是您玩剩下的。