最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

究極綠寶石5.3——科普向,什么是金手指(九)

2022-01-29 18:46 作者:圍巾胖頭魚  | 我要投稿

說在前面:

????自從第五期專欄開始介紹金手指的使用方法,一直到上一期,專欄涉及到的金手指全都是原始格式的。第五期專欄提到常見的金手指格式還有其它2種:GS碼(也被稱為V3格式碼)和代碼斷路器。本期和下一期專欄將會(huì)對(duì)V3格式碼進(jìn)行介紹。

V3格式碼的原理

先把第五期專欄里對(duì)V3格式碼的介紹抄過來(lái):

GameShark,也被稱為GS碼、V3格式碼。格式為:8位十六進(jìn)制數(shù) 8位十六進(jìn)制數(shù)。具體來(lái)說,GS碼的一行是由單個(gè)空格分隔的兩個(gè)8位十六進(jìn)制數(shù),這一行除了兩個(gè)數(shù)字、單個(gè)空格和結(jié)尾那個(gè)看不見的回車符,沒有任何其他符號(hào)。GS碼是基于原始代碼和其他特定規(guī)則,由加密算法生成的代碼……

????上面說的“GS碼是基于原始代碼和其他特定規(guī)則,由加密算法生成的代碼”里面有兩個(gè)關(guān)鍵點(diǎn):其他特定規(guī)則、加密算法。對(duì)應(yīng)這兩個(gè)關(guān)鍵點(diǎn),我們需要兩個(gè)工具:

  1. ?The Secrets of Professional GameShark(tm) Hacking (專業(yè)金手指破解的秘密),這是一個(gè)介紹GBA文件各種代碼類型破解的文檔,網(wǎng)址位于https://gamehacking.org/faqs/hackv500c.html。其內(nèi)容為全英文,可能對(duì)于一些讀者來(lái)說有閱讀困難, 不過對(duì)于V3代碼來(lái)說,只需要看文檔中AR V3 Codes Types這個(gè)表格(可以在網(wǎng)頁(yè)上通過Ctrl+F搜索找到這個(gè)表格的起始位置),其他那些長(zhǎng)篇大論的理論分析可以略過。AR V3 Codes Types介紹的就是上面提到的那個(gè)“其他特定規(guī)則”。

  2. AR Crypt.exe,2.4B版本(其他版本也可以),這是一個(gè)實(shí)現(xiàn)了加密算法和解密算法的工具,可以將經(jīng)過“其他特定規(guī)則”轉(zhuǎn)換之后的原始代碼加密成V3格式碼,也可以反過來(lái),將V3格式碼解密成經(jīng)過“其他特定規(guī)則”轉(zhuǎn)換之后的原始代碼。為了便于表述,下面將“經(jīng)過其他特定規(guī)則轉(zhuǎn)換之后的原始代碼”稱為中間代碼。

生成一個(gè)V3格式碼的流程如下圖所示:

原始代碼到V3格式碼的轉(zhuǎn)換

下面我們以一條金手指為例,詳細(xì)介紹V3格式碼的原理和生成過程。

查找金手指例6——精靈全圖鑒發(fā)現(xiàn)的金手指在哪里?

????究極綠寶石5中,主角會(huì)在游戲剛開始沒多久得到小田卷博士贈(zèng)送的精靈圖鑒,上面描述了全部精靈的發(fā)現(xiàn)和捕捉情況。到了二周目,精靈圖鑒會(huì)由原先的豐緣圖鑒升級(jí)為全國(guó)圖鑒,全國(guó)圖鑒包含了游戲中所有的898種精靈,尚未發(fā)現(xiàn)的精靈在圖鑒中只會(huì)有一個(gè)序號(hào),后面跟著一些橫杠,不會(huì)顯示精靈的名稱;發(fā)現(xiàn)但尚未捕獲的精靈只會(huì)顯示名稱;捕獲的精靈在序號(hào)前會(huì)出現(xiàn)一個(gè)精靈球標(biāo)記,如下圖所示:

精靈圖鑒

????上圖的精靈圖鑒中出現(xiàn)了3種情況:尚未發(fā)現(xiàn)的132號(hào)精靈,已經(jīng)發(fā)現(xiàn)但未捕獲的128、131、134、135、136號(hào)精靈,和已經(jīng)捕獲的129、130、133號(hào)精靈。因此請(qǐng)讀者們區(qū)分“發(fā)現(xiàn)”和“捕獲”這兩個(gè)概念,“全圖鑒發(fā)現(xiàn)”的金手指指的是讓所有精靈在圖鑒上都呈現(xiàn)“被發(fā)現(xiàn)”的狀態(tài),而不是“全圖鑒捕獲”,那是另一個(gè)金手指。

????在給出V3代碼格式的“全圖鑒發(fā)現(xiàn)”金手指之前,我們可以思考一下這個(gè)金手指的原始代碼應(yīng)該是什么樣子的。

????經(jīng)過了前面那么多期專欄的分析,我們知道:首先需要找到“圖鑒上的精靈是否被發(fā)現(xiàn)”的變量地址在什么地方。找變量地址有兩種思路,一種是猜測(cè)變量取值的結(jié)構(gòu)和取值,然后在“查找金手指”的界面中用精確查找;另一種是上一期介紹的用“查找金手指”界面的模糊查找,通過設(shè)置“相等”和“不等”的條件,在游戲中發(fā)現(xiàn)或捕捉新的精靈,從而改變圖鑒來(lái)搜索。

????以第一種思路為例,讓我們仔細(xì)猜測(cè)一下。圖鑒上一共有898種精靈,每種精靈都有“未發(fā)現(xiàn)”“已發(fā)現(xiàn)未捕獲”和“已捕獲”三種狀態(tài),如果讓你來(lái)設(shè)計(jì),你會(huì)用什么樣的變量來(lái)表示圖鑒上精靈的這三種狀態(tài)呢?不妨舉幾個(gè)例子,讓我們以游戲設(shè)計(jì)者的角度來(lái)考慮這個(gè)問題:

  1. 用一個(gè)字節(jié)來(lái)表示每個(gè)靈的三種狀態(tài),全圖鑒需要898字節(jié)來(lái)描述。一個(gè)字節(jié)共有8位二進(jìn)制數(shù),描述3個(gè)狀態(tài)綽綽有余,也正是因?yàn)椤熬b綽有余”,讓我們不禁去想:這么設(shè)計(jì)是不是太浪費(fèi)空間了?描述3種狀態(tài),1位二進(jìn)制數(shù)肯定不夠(只能表示2種狀態(tài),2位二進(jìn)制數(shù)則是足夠的(能表示4種狀態(tài)),所以有了下面這個(gè)設(shè)計(jì)。

  2. 用2位二進(jìn)制數(shù)來(lái)表示每個(gè)精靈的三種狀態(tài),1個(gè)字節(jié)可以表示4只精靈的狀態(tài)。根據(jù)“相似變量緊挨著放”的規(guī)律,很有可能就是1號(hào)到4號(hào)精靈放在一個(gè)字節(jié)里、5號(hào)到8號(hào)精靈放在一個(gè)字節(jié)里……順序按照“小端序”來(lái)。這么做只需要898/4 = 224.5個(gè)字節(jié),和個(gè)案相比,節(jié)省了四分之三的空間。這個(gè)方案看起來(lái)不錯(cuò),作者曾經(jīng)用這種方式去找過,只不過沒有結(jié)果,因?yàn)檫€有第三種方案。

  3. 把“全圖鑒發(fā)現(xiàn)”和“全圖鑒捕獲”這兩個(gè)映射表區(qū)分開,每個(gè)表就只需要1位二進(jìn)制數(shù)來(lái)表示每個(gè)精靈的狀態(tài),在“全圖鑒發(fā)現(xiàn)”里面,0表示“未發(fā)現(xiàn)”,1表示“已發(fā)現(xiàn)”;在“全圖鑒捕獲”里面,0表示“未捕獲”,1表示“已捕獲”。這種方案和第二種方案消耗的空間一樣多,本質(zhì)上都是用2位二進(jìn)制數(shù)表示圖鑒上的精靈狀態(tài),只不過一個(gè)是合并起來(lái),一個(gè)是拆分開來(lái)。這個(gè)方案經(jīng)過驗(yàn)證,的確是游戲中描述圖鑒的變量組織方式。

????按照這個(gè)思路,下一步是不是應(yīng)該看一眼我們的圖鑒,把1到8號(hào)精靈的發(fā)現(xiàn)情況,按照“未發(fā)現(xiàn)”映射到0、“已發(fā)現(xiàn)”映射到1的規(guī)律,拼出一個(gè)8位二進(jìn)制數(shù),然后去“金手指界面”用“精確查找”去找了?

????看上去一切正常,可問題就出在了“1到8號(hào)精靈”這個(gè)地方。如果讀者有過編寫程序的經(jīng)驗(yàn),就會(huì)知道很多編程語(yǔ)言里面,描述一些東西的順序往往是從0開始計(jì)數(shù),而不是從1開始,這也是為什么一個(gè)二進(jìn)制數(shù)的最低位被叫做“第0位”,除了因?yàn)樗硎镜臋?quán)重是2%5E0之外(這是第二期專欄介紹“進(jìn)制”的時(shí)候給出的理由),還跟程序語(yǔ)言的習(xí)慣有關(guān):計(jì)數(shù)從0開始。因此我們不應(yīng)該把“1到8號(hào)精靈”的狀態(tài)組成一個(gè)字節(jié),而是應(yīng)該把“0到7號(hào)精靈”的狀態(tài)組成一個(gè)字節(jié)。

????問題又來(lái)了:“0號(hào)精靈”是什么?就算收集了全圖鑒的玩家,在圖鑒上也不會(huì)找到“0號(hào)精靈”,因此“0號(hào)精靈”對(duì)我們來(lái)說,它的狀態(tài)就是未知的。不過沒關(guān)系,我們可以找下一個(gè)字節(jié)“8到15號(hào)精靈”的狀態(tài),或者再下一個(gè)“16到23號(hào)精靈”的狀態(tài)……

????拿上面那張精靈圖鑒的圖片為例,我們發(fā)現(xiàn)“128到135號(hào)精靈”的狀態(tài)恰好對(duì)應(yīng)一個(gè)字節(jié),按照?qǐng)D鑒中的情況,依次是:已發(fā)現(xiàn)、已發(fā)現(xiàn)、已發(fā)現(xiàn)、已發(fā)現(xiàn)、未發(fā)現(xiàn)、已發(fā)現(xiàn)、已發(fā)現(xiàn)、已發(fā)現(xiàn)。映射到字節(jié)就是11101111(2),注意這些狀態(tài)填到字節(jié)里面去的順序是從右向左(遵循小端序)。它是十六進(jìn)制的EF,此時(shí)我們就可以在“查找金手指”的頁(yè)面,用“精確查找”查找這個(gè)8位的數(shù)值了。如果結(jié)果很多,那我們就繼續(xù)向下看圖鑒,拼出來(lái)一個(gè)16位乃至32位的變量去找。

????經(jīng)過一番查找,最后發(fā)現(xiàn)“全圖鑒發(fā)現(xiàn)”的變量地址是02025f60,這里開始的第一個(gè)二進(jìn)制位描述的就是“0號(hào)精靈是否被發(fā)現(xiàn)”(當(dāng)然,這在游戲中沒有意義,因?yàn)闆]有“0號(hào)精靈”)。從第二個(gè)二進(jìn)制位開始,包括它在內(nèi)的后面898位二進(jìn)制位(就是圖鑒上898只精靈)如果都填充上1,就是全圖鑒發(fā)現(xiàn)的金手指了,它應(yīng)該是這個(gè)樣子:

????第一行的變量取值是fffffffe,它的二進(jìn)制就是31個(gè)1后面跟了一個(gè)0,這個(gè)單獨(dú)的0就是描述“0號(hào)精靈”的,我們不知道“0號(hào)精靈”的狀態(tài),那就保持原樣就好(這個(gè)地址原來(lái)的變量取值可以通過“變量地址查看器”來(lái)看),我們不去修改它。從下一個(gè)地址開始,所有的位置都填充1(十六進(jìn)制就是填充f),一直到哪里結(jié)束呢?我們可以計(jì)算一下。

????現(xiàn)在每一行金手指都是32位二進(jìn)制數(shù),因此第一行就是0到31號(hào)精靈,第二行就是32到63號(hào)精靈,……,第二十八行就是864到895號(hào)精靈,第二十九行不會(huì)被填充滿,因?yàn)橹皇O?個(gè)精靈了,需要填充3個(gè)1,也就是十六進(jìn)制的7。所以,這個(gè)“全圖鑒發(fā)現(xiàn)”的金手指最后幾行是這個(gè)樣子:

????也就是說,用原始代碼描述的“全圖鑒發(fā)現(xiàn)”金手指,一共需要29行才能寫完。

V3格式碼的“全圖鑒發(fā)現(xiàn)”金手指

????相比之下,V3格式碼的“全圖鑒發(fā)現(xiàn)”金手指只需要3行:

????在VBA模擬器中,輸入這條V3格式碼的地方和輸入原始代碼的地方是不一樣的!具體在哪里可以去看第五期的專欄。有好多讀者對(duì)“原始代碼”和“V3格式碼”沒有概念,從網(wǎng)上找到了金手指就嘗試往模擬器里輸入,結(jié)果就是各種格式錯(cuò)誤的警告。這里再?gòu)?qiáng)調(diào)一遍V3格式碼的格式:

V3格式碼的一行是由單個(gè)空格分隔的兩個(gè)8位十六進(jìn)制數(shù),這一行除了兩個(gè)數(shù)字、單個(gè)空格和結(jié)尾那個(gè)看不見的回車符,沒有任何其他符號(hào)。

????這些代碼是什么含義呢?我們需要一步一步地“解密”。

????回到本期專欄的第一張圖,從左到右的順序是“原始代碼->中間代碼->V3格式碼”,現(xiàn)在讓我們從右向左,看看從這3行V3格式碼還原出來(lái)的原始代碼是什么。

????接下來(lái)請(qǐng)出第一個(gè)工具:AR Crypt:

AR Crypt程序界面

????AR Crypt是一個(gè)可以在V3格式碼和中間代碼之間進(jìn)行轉(zhuǎn)換的工具。有了這個(gè)工具,我們就無(wú)需操心加密解密算法是怎么實(shí)現(xiàn)的,直接用它進(jìn)行轉(zhuǎn)換就好。AR Crypt的界面有很多按鈕,現(xiàn)在真正需要的只有中間靠下的那個(gè)“Proceed”按鈕,它的含義是“處理”或者“轉(zhuǎn)換”。另外我們需要告訴這個(gè)程序:我們是要把一種什么格式的代碼轉(zhuǎn)換成另一種什么格式。這就是中間偏左下“From”里面的選項(xiàng),和中間偏右下“To”里面的選項(xiàng)。

????看上圖我們的設(shè)置?!癋rom”里面選擇的是“AR V.3”,意思就是我們想要轉(zhuǎn)換的代碼是V3格式碼;“To”里面選擇的是“RAW”,雖然它的意思是“原始代碼”,但其實(shí)轉(zhuǎn)換的結(jié)果是中間代碼。我們把3行V3格式碼粘貼到左上角的空白框內(nèi),然后點(diǎn)擊“Proceed”按鈕,轉(zhuǎn)換結(jié)果就出現(xiàn)在右上角的輸出框內(nèi)了:

????這個(gè)結(jié)果,就是轉(zhuǎn)換之后的中間代碼。從V3代碼到中間代碼,代碼的行數(shù)是不會(huì)變化的,V3代碼是3行,轉(zhuǎn)換之后的中間代碼也就是3行。別忘了,這3行中間代碼,和我們剛才得到的29行原始代碼應(yīng)該是等價(jià)的。

????在介紹下一步如何將中間代碼轉(zhuǎn)換到原始代碼之前,我們先看看這3行中間代碼,有沒有什么規(guī)律?

????左邊的看上去好像是變量地址,但仔細(xì)一看又有區(qū)別,第一行的00225f60和原始代碼的第一行02025f60錯(cuò)開了一位,有個(gè)2位置對(duì)不上;第一行右邊的fe和原始代碼第一行末尾的fe也能對(duì)上,但是其它數(shù)字都不一樣;第三行和原始代碼的最后一行最為類似,右半邊完全一樣,但是左邊還是那個(gè)問題,錯(cuò)開了1位;第二行完全看不明白,右半邊那個(gè)6eff在原始代碼中根本沒出現(xiàn)過。

????接下來(lái)請(qǐng)出第二個(gè)工具:The Secrets of Professional GameShark(tm) Hacking文檔。

????這個(gè)文檔內(nèi)容很豐富,但是全文都是英文,英文基礎(chǔ)不太好的讀者看起來(lái)會(huì)很費(fèi)勁。其實(shí)如果只是用專欄介紹的功能——從中間代碼轉(zhuǎn)換到原始代碼,沒必要所有的內(nèi)容都看懂,我們只需要看AR V3 Codes Types這張表格就可以了,下面是這個(gè)表格開頭的截圖:

V3格式碼轉(zhuǎn)換規(guī)則

????這張表格就是告訴我們:原始代碼怎么轉(zhuǎn)換為中間代碼,或者反過來(lái)?,F(xiàn)在我們希望從中間代碼逆變換回原始代碼,首先需要了解幾個(gè)概念。

  1. 中間代碼的類型:每行中間代碼的格式和V3格式碼相同,都是由單個(gè)空格隔開的兩個(gè)8位十六進(jìn)制數(shù),看左邊的十六進(jìn)制數(shù),它的最高位和次高位(就是最左邊的2位)表示的是中間代碼的類型。在上面的表格中,左側(cè)一列的“Type 00”“Type 01”就是指的中間代碼的類型,不同的類型,轉(zhuǎn)換規(guī)則也不一樣。

  2. 原始代碼轉(zhuǎn)換規(guī)則:原始代碼的轉(zhuǎn)換規(guī)則寫在表格右列第一行的括號(hào)里。在上圖中,(02024EA4 -> 00224EA4)就是類型“Type 00”的轉(zhuǎn)換規(guī)則,(02024EA4 -> 02224EA4)就是類型“Type 01”的轉(zhuǎn)換規(guī)則。轉(zhuǎn)換規(guī)則說明的是原始代碼的變量地址部分怎么轉(zhuǎn)換到中間代碼左半邊的那個(gè)十六進(jìn)制數(shù)。

  3. 代碼含義:每個(gè)類型的中間代碼含義都不相同,它寫在表格右列的第二行。拿“Type 00”類型舉例,它的代碼含義是:

    Fill area (XXXXXXXX) to (XXXXXXXX+YYYYYY) with Byte ZZ.

    翻譯過來(lái)就是:

    用字節(jié)ZZ,將從(XXXXXXXX)到(XXXXXXXX+YYYYYY)的地址區(qū)域填滿。

    這里XYZ的含義就在表格左列“類型”下面的那個(gè)單元格,例如“Type 00”類型的:

    XXXXXXXX

    YYYYYYZZ

    這兩行是對(duì)中間代碼的描述,其實(shí)就是左半邊的十六進(jìn)制數(shù)是XXXXXXXX,右半邊的十六進(jìn)制數(shù),高6位是YYYYYY,低2位是ZZ,然后這條中間代碼的含義就是“字節(jié)填充”。在用到地址的時(shí)候,需要先將XXXXXXXX逆變換回原始代碼的格式,這才是真正的變量地址

????我們先來(lái)看第一行中間代碼:

????由于中間代碼最左邊的2位決定了它的類型,現(xiàn)在是00,正好對(duì)應(yīng)到“Type 00”這個(gè)類型,我們就可以按照表格中的規(guī)則來(lái)進(jìn)行轉(zhuǎn)換。如果是其他的數(shù)字組合,需要到表格中去對(duì)應(yīng)查找。比如說最左邊2位是02,對(duì)應(yīng)的就是“Type 01”類型。表格右列第一行括號(hào)內(nèi)的“原始代碼轉(zhuǎn)換規(guī)則”里,箭頭右側(cè)的那個(gè)數(shù)字就是中間代碼的格式樣例,可以對(duì)照它的最左邊2位來(lái)查找類型。

????根據(jù)“原始代碼轉(zhuǎn)換規(guī)則”,原始代碼的變量地址轉(zhuǎn)換到了00225F60,看一下我們的樣例:02024EA4 -> 00224EA4。這個(gè)樣例告訴我們?cè)即a轉(zhuǎn)換到中間代碼時(shí),8位十六進(jìn)制的第6位要向右移動(dòng)到第5位(也就是從左數(shù)第二位移動(dòng)到從左數(shù)第三位),那它的逆變換就應(yīng)該是反過來(lái),把第5位移動(dòng)回第6位。所以00225F60逆變換回去就是02025F60。

????根據(jù)“Type 00”的“代碼含義”,我們先把XYZ的含義確定一下,XXXXXXXX是00225F60,YYYYYY是000000,ZZ是FE。XXXXXXXX對(duì)應(yīng)的真正地址是02025F60,我們把它套在“代碼含義”里:

????用字節(jié)FE,將從(02025F60)到(02025F60+0)的地址區(qū)域填滿。

????因?yàn)閅YYYYY是0,這條代碼其實(shí)就是填充了1個(gè)字節(jié),也就是說,第一行中間代碼等價(jià)于這條原始代碼:

????這就和我們給出的29行原始代碼的第一行對(duì)應(yīng)上了(雖然從功能上來(lái)說,只完成了第一行代碼的一部分)。

????再來(lái)看第二行中間代碼:

????開頭00仍然是“Type 00”的類型,00225F61逆變換回去是02025F61這個(gè)變量地址,和第一行不同的是,此時(shí)YYYYYY是6E,ZZ是FF,套在“代碼含義”里:

????用字節(jié)FF,將從(02025F61)到(02025F61+6E)的地址區(qū)域填滿。

????十六進(jìn)制的6E是十進(jìn)制的110,而110個(gè)字節(jié)就是880個(gè)二進(jìn)制位,這一行代碼就更改了880個(gè)精靈的圖鑒狀態(tài)!這一行代碼會(huì)填充到哪里結(jié)束呢?我們算一下:02025F61+6E=02025FCF,它的下一個(gè)字節(jié)的地址就是02025FD0。也就是說,第二行中間代碼等價(jià)于下面29行原始代碼:

????最后再看第三行中間代碼:

????和第一行相同,它對(duì)應(yīng)的原始代碼就是29行原始代碼的最后一行:

????由此可見,3行V3格式碼確實(shí)是完全等價(jià)到了我們之前得到的29行原始代碼。

說在后面:

????上一期作者提到:“V3格式的金手指功能要比原始代碼強(qiáng)大得多”。本期介紹的“全圖鑒發(fā)現(xiàn)”金手指只是一道“開胃菜”,使用它能大大縮短金手指的行數(shù)。會(huì)舉一反三的讀者,應(yīng)該可以自行探索“全圖鑒捕捉”的V3格式碼是什么:先得到原始代碼,然后通過專欄介紹的兩大工具一步一步轉(zhuǎn)換到V3格式碼,它的形式和“全圖鑒發(fā)現(xiàn)”是完全相同的,區(qū)別僅在于變量地址而已。

????不知道讀者會(huì)不會(huì)有這種想法:V3格式碼看起來(lái)好難啊,又是加密又是逆變換的,搞的人頭大。29行原始代碼行數(shù)雖然多,但是每行代碼含義都是那么簡(jiǎn)單明確,長(zhǎng)就長(zhǎng)吧,用起來(lái)的效果不還是和V3格式碼一樣的嗎?事實(shí)上,V3格式碼能做到的事情遠(yuǎn)遠(yuǎn)不止壓縮行數(shù)這么簡(jiǎn)單,所以作者才說本期專欄的例子就是一道“開胃菜”,真正的大餐要等待下期——隨身攜帶的精靈中心,這個(gè)功能是原始代碼做不到的。

????原始格式的金手指只能做到修改變量,而V3格式的金手指可以做到寫程序!這才是V3格式碼真正強(qiáng)大的地方,讓我們下期再見!

究極綠寶石5.3——科普向,什么是金手指(九)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
佛学| 远安县| 杭锦旗| 松潘县| 泽州县| 宜春市| 乐业县| 盐亭县| 潜江市| 秭归县| 朔州市| 白水县| 左权县| 绩溪县| 东方市| 太谷县| 渭源县| 临漳县| 星子县| 孝昌县| 乐平市| 崇义县| 宁远县| 晋江市| 宁德市| 潮安县| 赣榆县| 讷河市| 通化市| 巨鹿县| 右玉县| 巴彦县| 双辽市| 肥东县| 东宁县| 山西省| 都兰县| 方正县| 如东县| 鹤岗市| 中卫市|