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

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

口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(B-以漆黑的魅影為例)

2022-12-26 22:32 作者:圍巾胖頭魚  | 我要投稿

說在前面:

????在本系列專欄第9期的末尾,作者曾經(jīng)提到要“拿一個真正的改版綠寶石游戲‘開刀’”,想了又想,最后還是選中了《漆黑的魅影》,這款國內(nèi)綠寶石改版的業(yè)界標(biāo)桿。

????這一期是之前所有專欄知識的綜合運用,包括本系列專欄已有的11篇和另一個系列專欄“究極綠寶石5.3——科普向,什么是金手指”的10篇內(nèi)容。對于讀者來說,鞏固專欄知識的最佳方法莫過于“真刀真槍”地把它們應(yīng)用一回,這也是作者計劃一定要拿一個改版來看看的原因;對于作者自己來說,像是一個已經(jīng)挖開的大坑,終于要在這篇專欄中填平。

????出于對《漆黑的魅影》這款游戲的喜愛,作者在本期專欄的最后會給出一個彩蛋,即使是暫時還不能掌握這篇專欄涉及內(nèi)容的讀者,看了這篇專欄后也不會空手而歸!

一代傳奇,漆黑的魅影

????《口袋妖怪——漆黑的魅影》是一款基于原版寶可夢綠寶石的改版作品,先來看一下百度上給出的介紹:

《寶可夢漆黑的魅影》是寶可夢系列游戲的改版作品,以角色扮演(RPG)為主,輔以戰(zhàn)略和動作游戲。玩家作為一位寶可夢訓(xùn)練家到各地旅行,不斷提升自己的戰(zhàn)斗能力,最終打敗8個道館館主和四天王,開啟二周目。二周目新增屬性道館多個,游戲性上升。游戲共有三個周目,每周目都有不同的挑戰(zhàn)。在原基礎(chǔ)上替換了冷門寶可夢為新寶可夢,也新增了一些寶可夢。

????這段介紹平平無奇,不足以反映這款改版在國內(nèi)寶可夢改版歷史上的地位。再引用一個知乎網(wǎng)友芒果冰OL的一段點評,出自“口袋妖怪有哪些優(yōu)秀的改版?”,網(wǎng)址位于https://www.zhihu.com/question/35373003/answer/1553177114:

……許多初窺改版魅力的年輕人走上了做改版的道路,其中就有后來國內(nèi)影響力最大的兩個改版《漆黑的魅影》的作者——E大(Ebonyphantom)和《永恒之焱》的作者暗夜,當(dāng)時他們都還只是初中生……

……《漆黑的魅影》整體給人的印象,就是兩個字“扎實”。作為國內(nèi)玩家數(shù)量最多的寶可夢改版作品,它在創(chuàng)新與情懷間做了很微妙的平衡。比如游戲的一周目流程與寶石原版有8分相似,卻又時不時插敘另一個“世界”的故事,用懸疑的手法牢牢抓住玩家的興趣,為2周目的全原創(chuàng)地區(qū)的后續(xù)冒險的超展開做好了鋪墊,并且在原創(chuàng)的劇情中也嚴(yán)格遵循著原有世界觀的角色與精靈設(shè)定。甚至還通過平行世界的設(shè)定打通了游戲、漫畫和動畫的世界觀……

……又比如游戲一改386版本神獸遍地走的狀態(tài),為每一個神獸都安排了恰當(dāng)?shù)某霈F(xiàn)場景和登場演出,很多場景與TV版和劇場版的劇情相吻合,絲毫沒有敷衍之感。至于什么引入四、五世代精靈,加入歷代登場過的熟悉NPC及相關(guān)劇情,新技能,新特性,改善PVP體驗和養(yǎng)成節(jié)奏的貼心調(diào)整更是屬于基本操作。從游戲設(shè)計的角度去看,《漆黑的魅影》是一個非常精準(zhǔn)地把握住玩家“心流”的典范。整體的敘事節(jié)奏、角色成長節(jié)奏都安排得恰到好處……

……我們無法確切得知《漆黑的魅影》的玩家數(shù)量到底有多少,結(jié)合貼吧關(guān)注數(shù)和我自己身邊玩過這款游戲的人數(shù),我的估算是絕不少于100萬。這對于一個同人游戲來說,已經(jīng)是堪稱奇跡了……

????接觸過《漆黑的魅影》的讀者對它都有一個內(nèi)心的評判。在引用了這么多評價之后,相信之前沒接觸過它的讀者也對它有了一個基本的認(rèn)識。前人之述備矣,作者在這里就不再做更多的評價。

????目前,《漆黑的魅影》最新版本號是5.0EX+,這個版本號下有兩個版本,一個是5.0EX+BW,另一個是5.0EX+DP,兩個版本只有在初始御三家精靈的選擇上有不同,其他內(nèi)容完全相同。下載地址在百度貼吧的“漆黑的魅影”吧,網(wǎng)址https://tieba.baidu.com/p/7842128959。

????根據(jù)百度貼吧的帖子,這個最新版發(fā)布于2016年12月24日。時隔這么多年,在“漆黑的魅影”吧中仍然活躍著諸多玩家的身影,但游戲本身應(yīng)該不會有任何進(jìn)一步的更新了。因此,可以認(rèn)為這款改版游戲已經(jīng)完結(jié),這也是作者選擇這款改版的原因之一。

????本期專欄以漆黑的魅影5.0EX+BW為例,運用專欄中的知識,對這個改版游戲進(jìn)行一次“數(shù)據(jù)提取與代碼分析”。

我們知道什么?我們不知道什么?

????面對一個改版游戲,在進(jìn)行“數(shù)據(jù)提取和代碼分析”之前,先來問問自己,我們知道什么?我們不知道什么?

????我們知道《漆黑的魅影》是基于原版綠寶石的改版游戲,因此《漆黑的魅影》中應(yīng)該復(fù)用了原版綠寶石大量的函數(shù)。想象一下,應(yīng)該是有些函數(shù)和原版一模一樣,有些函數(shù)做了很小的改動,還有些函數(shù)改動較大,或者說根本沒有復(fù)用,而是重寫了。這些和原版一模一樣或者改動很小的函數(shù),給我們進(jìn)行分析提供了機會,這種現(xiàn)象被稱作函數(shù)相似性。

????《漆黑的魅影》中每個函數(shù)的地址,和原版還一樣嗎?這一點我們是不知道的,可能一樣,也可能不一樣,取決于改版和原版相比的改動究竟有多大。這也就是說,在前面的專欄中,那個無比好用的符號表現(xiàn)在派不上用場了。在之前,我們可以根據(jù)一個函數(shù)的名字直接定位到它在原版中的地址,或者反過來,根據(jù)一個地址直接在符號表中找到它對應(yīng)的是哪個函數(shù);而現(xiàn)在面對改版,我們只能從函數(shù)相似性上入手,再也不能斷言哪個地址就一定對應(yīng)哪個函數(shù)了。

????再次強調(diào),面對改版的綠寶石,我們不能完全相信符號表中地址和變量/函數(shù)的對應(yīng)關(guān)系!

關(guān)鍵變量與關(guān)鍵函數(shù)

????“數(shù)據(jù)提取與代碼分析”是比較抽象的說法,將這個任務(wù)具體一些,我們其實是想找到游戲中的一些關(guān)鍵變量和關(guān)鍵函數(shù),“找到”的含義是確切地知道它們的地址。作者總結(jié)了一個關(guān)鍵變量和關(guān)鍵函數(shù)的表格如下,這些變量或者函數(shù)在之前的專欄中都出現(xiàn)過,這里再做個總結(jié)說明它們?nèi)绾巍瓣P(guān)鍵”:

????上面這個表格能涵蓋大部分我們感興趣的游戲數(shù)據(jù)以及各類金手指涉及的地址,接下來作者就要逐一去在改版游戲中找到它們的具體地址。在原版中這個過程毫無難度,只需對照符號表去查找即可。但是,面對改版我們不得不扔掉“符號表”這根拐棍,在變量和函數(shù)的汪洋大海中去做“大海撈針”一樣的事。

????“大海撈針”也并非毫無章法地亂找,而是基于函數(shù)相似性,從最簡單、最容易找到的函數(shù)或者變量開始,一點一點地擴大戰(zhàn)果,直到找到目標(biāo)。

靜態(tài)分析:從主函數(shù)開始

????在本系列第5期專欄口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(5-THUMB匯編指令基礎(chǔ))中的“改版ROM的主程序在哪兒”一節(jié)中,提到ROM的起始地址08000000一定對應(yīng)著一條ARM模式的跳轉(zhuǎn)語句,跳轉(zhuǎn)之后的函數(shù)會在其中的一行進(jìn)入主函數(shù),現(xiàn)在來看看《漆黑的魅影》是否也是如此。

????使用VBA模擬器的“工具——反匯編”功能,在加載ROM后進(jìn)入反匯編的界面:

找到主函數(shù)

????此時還需要用ARM模式進(jìn)行查看,果然找到了主函數(shù)AgbMain的地址080003a5,跳轉(zhuǎn)到此處:

????

AgbMain的反匯編代碼

????進(jìn)入主函數(shù)后,就需要切換到THUMB模式了,并且以后所有查看的匯編代碼都是THUMB模式。和源代碼項目中的主函數(shù)對比,相似度非常高,甚至可以說就是一模一樣的,在這里需要找到C代碼中的InitMainCallbacks函數(shù),它位于源代碼項目的第104行。注意,從源代碼的第97行開始了連續(xù)的函數(shù)調(diào)用,對應(yīng)到匯編代碼中,則是連續(xù)的bl指令,這就是函數(shù)相似性最直觀的體現(xiàn)。

????連續(xù)的函數(shù)調(diào)用到源代碼的第112行停止,因為InitHeap是一個需要參數(shù)的函數(shù),為了準(zhǔn)備好參數(shù),匯編代碼中就不能再使用bl指令了(080003f6處終于暫停了長達(dá)12行的連續(xù)bl函數(shù)調(diào)用)。兩相對比,可以找到InitMainCallbacks函數(shù)的地址,是圖中標(biāo)出的080004d8。

????接下來跳轉(zhuǎn)到這個函數(shù)查看:

InitMainCallbacks函數(shù)

????第一個關(guān)鍵變量——gSaveBlock2Ptr——被找到了(它在03005D90)!根據(jù)第六期專欄口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(6-反作弊機制:跳動的指針),它保存了一個會隨著時間變化的指針地址gSaveBlock2,這是由反作弊機制決定的。gSaveBlock2中包含了主角的名字和ID信息,如果有讀者想通過專欄究極綠寶石5.3——科普向,什么是金手指(三)提到的方法,利用VBA模擬器的“查找金手指”功能去搜索主角的ID,會發(fā)現(xiàn)在《漆黑的魅影》中搜不到結(jié)果,這是因為“跳動的指針”反作弊機制會讓主角ID的地址不斷地變化。

????現(xiàn)在有了gSaveBlock2Ptr的地址,如果想要修改主角的名字或者ID,就有了制作金手指的基礎(chǔ)。思路有兩種,一種是繼續(xù)尋找,找到“跳動的指針”反作弊機制對應(yīng)的函數(shù),用修改ROM的金手指破壞反作弊機制;另一種思路是下面提到的,不需要修改ROM。

利用gSaveBlock2Ptr修改主角的名字——中文字庫

????《漆黑的魅影》是一個漢化的改版,使用的語言是簡體中文,這和原版綠寶石有很大的區(qū)別。在本系列專欄第1期口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(1-字符集與文本信息的提取)提到了字符集的概念,是原版綠寶石對用數(shù)字(0/1序列)來編碼字符的映射表。漢化的改版需要對中文字符進(jìn)行編碼,這種編碼的對應(yīng)關(guān)系和中文字符對應(yīng)的圖片數(shù)據(jù)合起來稱為中文字庫

????導(dǎo)入中文字庫是對原版游戲或者對國外改版游戲進(jìn)行漢化的第一步。本系列專欄對如何導(dǎo)入中文字庫不做討論,但是會關(guān)心中文字符的編碼。由于導(dǎo)入中文字庫的工具和中文字庫本身相對固定,因此可以說幾乎所有的精靈寶可夢GBA漢化版本用的都是同樣的中文編碼,這一點《漆黑的魅影》并不例外。

????原版綠寶石的字符編碼位于源代碼項目的charmap.txt文件中,這一點在第1期專欄也提到過。但是中文編碼需要到網(wǎng)上去找,為了方便讀者,作者把這個中文編碼的文件放在網(wǎng)盤上:

https://pan.baidu.com/s/1_kp5X6lGk8kNxQM1YeuIZw

????密碼是ANSI。這里面是一個charANSI.txt的文件,內(nèi)容片段如下:

中文編碼

????文件中包含了中文字庫中所有中文字符的編碼(中文字庫中的漢字為常用漢字,約有7000個),例如上圖中的“啊”在《漆黑的魅影》中會被編碼到01 00共2個字節(jié)的數(shù)據(jù)(按十六進(jìn)制來看)。如果按照小端序進(jìn)行拼接,“啊”的編碼就是0001。

????回到《漆黑的魅影》,這款改版盡管是漢化的版本,卻沒有任何地方支持輸入中文。在開始新游戲時,主角會被問到“你叫什么名字”,但是可供輸入的字符和原版一樣,還是只有大小寫字母、數(shù)字和英文標(biāo)點符號:

起名字界面

????有的改版會在某個界面支持L/R鍵翻頁,翻頁后會出現(xiàn)輸入漢字的選項,但遺憾的是《漆黑的魅影》并沒有實現(xiàn)這個功能。此時,要想起一個中文名字,只能在輸入名字的界面不輸入任何字符而直接選“OK”,系統(tǒng)會為主角從若干個中文名中隨機選出一個,例如“龍”“玉”“卡蓮”等等。那么怎樣才能自己起一個中文名呢?

????利用剛剛找到的gSaveBlock2Ptr變量,就可以實現(xiàn)一個改名字的金手指!

????如果是某種原始代碼格式的金手指,那么格式應(yīng)該是“變量地址:變量取值”的樣子,但是由于“跳動的指針”反作弊機制,這里的變量地址是不斷變化的,我們只知道這個不斷變化的地址它的存儲地址是固定的,也就是gSaveBlock2Ptr變量的地址03005D90。既然原始代碼實現(xiàn)不了這個功能,那就去找功能更強大的GS V3格式碼。

????查看GS V3格式碼的文檔,可以找到Type 21這個代碼類型:

GS V3代碼,Type 21代碼類型

????按照這種代碼的說明,它是將半字ZZZZ寫入這樣一個地址,這個地址由兩部分相加得到,第一個部分是XXXXXXXX地址中保存的數(shù)值,第二個部分是YYYY乘2的結(jié)果。

????這里面,“XXXXXXXX地址中保存的數(shù)值”恰好就是“取出gSaveBlock2Ptr變量的內(nèi)容”這個操作。換句話說,gSaveBlock2Ptr變量的內(nèi)容是隨時間變化的,但是Type 21這個類型的金手指并不關(guān)心它的內(nèi)容如何變化,只要給出它存儲的地址就夠了。

????我們想要改的主角名字在gSaveBlock2Ptr的什么位置呢?可以看一下源代碼項目中g(shù)SaveBlock2的類型Saveblock2的定義:

SaveBlock2

????如果《漆黑的魅影》沒有修改這個結(jié)構(gòu)體的定義的話,那么主角名字playerName應(yīng)該位于gSaveBlock2相對地址0x00處,也就是最開始的地方。下面就要根據(jù)究極綠寶石5.3——科普向,什么是金手指(九)中對GS V3格式碼的介紹,來組裝修改名字的金手指了。

????注:GS V3格式碼的文檔中的Type 21類型介紹里,原始代碼向中間代碼轉(zhuǎn)換的規(guī)則有印刷錯誤(圖中的02024EA4 -> 4224EA4應(yīng)為02024EA4 -> 42224EA4),有一定的誤導(dǎo)性,但是在Type 20類型中并沒有錯誤,可以作為參考進(jìn)行修正。

????比如說我們想要把主角的名字改為“冒險家”,先查閱中文字庫找到“冒險家”這三個字的編碼,分別為:

????把主角名字的第一個字設(shè)置為“冒”,對應(yīng)的中間代碼應(yīng)該是:

? ? 這里,42305D90是將03005D90(gSaveBlock2Ptr的地址)按照Type 21的轉(zhuǎn)換規(guī)則進(jìn)行轉(zhuǎn)換的結(jié)果,由于主角名字正好位于gSaveBlock2的開頭,因此YYYY的部分對應(yīng)的就是0000,而ZZZZ的部分需要小端序拼接。

????把主角名字的第二個字設(shè)置為“險”,對應(yīng)的中間代碼應(yīng)該是:

????和第一條相比,YYYY變成了0001,這是為了它在乘2之后變?yōu)?002,這正好是第二個字相對于gSaveBlock2開頭的地址(注意一個漢字是2個字節(jié))。第三條以此類推。最后用AR Crypt工具進(jìn)行加密,得到GS V3格式碼:

加密

????將代碼輸入到VBA模擬器中,就可以修改名稱了:

修改名稱之后的訓(xùn)練師卡片

靜態(tài)分析——函數(shù)調(diào)用鏈

????總結(jié)一下剛才找到gSaveBlock2Ptr的過程,可以用如下方式表示:

????含義是最開始從AgbMain出發(fā),根據(jù)函數(shù)調(diào)用逐層深入,“->”箭頭表示上一行的函數(shù)調(diào)用了這一行的函數(shù),或者使用了這一行的變量。在匯編代碼和源代碼項目的對比之中,就可以找到關(guān)鍵函數(shù)或者關(guān)鍵變量的地址,這一系列通過函數(shù)調(diào)用關(guān)系聯(lián)系起來的函數(shù)或者變量被稱作函數(shù)調(diào)用鏈。

????下面再給出一個函數(shù)調(diào)用鏈,然后對照著去看匯編代碼,理解一下利用函數(shù)調(diào)用鏈查找關(guān)鍵函數(shù)或者關(guān)鍵變量的方法。

????從“靜態(tài)分析:從主函數(shù)開始”這一小節(jié)中,我們已經(jīng)分析到了InitMainCallbacks函數(shù),并找到了CB2_InitCopyrightScreenAfterBootup函數(shù)的地址0816CEAD,所以分析從這一步繼續(xù):

CB2_InitCopyrightScreenAfterBootup函數(shù)

????仍然需要利用函數(shù)相似性迅速定位關(guān)鍵函數(shù)的地址,這個過程正如本系列第5期專欄提到的那樣,考驗的是讀者對匯編代碼的熟練程度?,F(xiàn)在我們找到了函數(shù)調(diào)用鏈的下一個函數(shù)SetSaveBlocksPointers:

SetSaveBlocksPointers函數(shù)

????這樣就來到了函數(shù)調(diào)用鏈的最后一環(huán),找到了關(guān)鍵變量gSaveblock1Ptr。除此之外,這個函數(shù)中又出現(xiàn)了gSaveblock2Ptr,可以和之前找到的進(jìn)行對比,兩下驗證二者一樣,我們找到的結(jié)果就更加可信了。

????上面給出的兩個函數(shù)調(diào)用鏈都是從AgbMain這個主函數(shù)開始的,其實當(dāng)知道了其他函數(shù)之后,函數(shù)調(diào)用鏈也可以從某個已知的函數(shù)出發(fā)。我們像是在一片未知叢林中探索地圖的探險家,最開始只有“主函數(shù)”這一個“據(jù)點”,但隨著函數(shù)調(diào)用鏈的延伸,我們知道的函數(shù)越來越多,找到的關(guān)鍵變量、關(guān)鍵函數(shù)也越來越多,漸漸地整個“地圖”就會被探索出來。

????接下來再給出幾個關(guān)鍵變量的函數(shù)調(diào)用鏈,具體的分析過程就交給讀者練習(xí)了:

????gPlayerParty的函數(shù)調(diào)用鏈:

????gBagPockets的函數(shù)調(diào)用鏈:

動態(tài)分析——傘兵天降

????查看VBA的反匯編窗口,和源代碼項目進(jìn)行比對,這個過程是靜態(tài)分析的過程。從函數(shù)調(diào)用鏈的視角來看,我們只能從最開始的AgbMain函數(shù)開始逐漸地擴大探索范圍。如果說,這種方式就像步兵一點一點地摸排過去,把已知的據(jù)點不斷擴張出去,那么另一種方式——動態(tài)分析,則像是傘兵一樣直接降落在某片未知區(qū)域,并以此為據(jù)點向周圍擴展探索范圍。

????動態(tài)分析需要的是No$GBA提供的調(diào)試功能,部分功能已經(jīng)在專欄究極綠寶石5.3——科普向,什么是金手指(十)介紹過,下面介紹它在探索關(guān)鍵變量和關(guān)鍵函數(shù)中的作用。

????打開No$GBA模擬器,加載《漆黑的魅影》ROM,我們設(shè)置這樣一個斷點:

Debug->Define Break/Condition功能

????這個斷點的含義是當(dāng)gSaveBlock2Ptr的內(nèi)容被寫入時觸發(fā)斷點。我們知道根據(jù)“跳動的指針”反作弊機制,gSaveBlock2Ptr中存儲的內(nèi)容會隨時間不斷變化,那么它的內(nèi)容被寫入時說明了什么?說明觸發(fā)斷點時恰好就是這個反作弊機制正在執(zhí)行中!

????回到游戲,讓主角進(jìn)入一個房間,此時觸發(fā)了斷點:

????

斷點被觸發(fā)

????斷點被觸發(fā)時,No$GBA程序會從游戲界面自動切換回代碼界面并暫停游戲。代碼界面中,被選中的一行是將要執(zhí)行但還未執(zhí)行的代碼,它的上一行則是斷點觸發(fā)時執(zhí)行的最后一條代碼,也正是這條08076BF6處的代碼str r0, [r1]執(zhí)行了對gSaveBlock2Ptr的寫入。仔細(xì)觀察一下現(xiàn)在代碼所處的位置,它恰好位于SetSaveBlocksPointers函數(shù)內(nèi)。根據(jù)第6期專欄的分析,這個函數(shù)就是執(zhí)行“跳動的指針”反作弊機制的函數(shù),這個斷點的觸發(fā)符合預(yù)期。

????但是SetSaveBlocksPointers這個函數(shù)在靜態(tài)分析時我們就已經(jīng)找到了,動態(tài)分析能找到新的內(nèi)容嗎?不要著急,接下來才是動態(tài)分析大顯身手的地方。

????按一下F8,或者點擊菜單欄里的Run->Run to sub-return,它的含義是跳出當(dāng)前函數(shù),回到這個函數(shù)的調(diào)用函數(shù)中,現(xiàn)在來看代碼的位置:

????

跳出

????可以看到,此時代碼停在了08076C90這個位置,剛剛執(zhí)行完的上一條代碼是bl Lxx_8076BDC,恰好就是調(diào)用SetSaveBlocksPointers函數(shù)的代碼。也就是說,F(xiàn)8這個功能將SetSaveBlocksPointers函數(shù)剩余的部分執(zhí)行完,跳出了這個函數(shù),回到了它的“外面”,也就是調(diào)用它的地方。那是誰調(diào)用了它呢?

????根據(jù)同樣在原版綠寶石中的實驗,此時應(yīng)該是位于MoveSaveBlocks_ResetHeap函數(shù)內(nèi)。和源代碼項目進(jìn)行比對,這樣我們就找到了一個新的關(guān)鍵函數(shù)。

????這個過程可以用下面這個函數(shù)調(diào)用鏈表示:

????相對于靜態(tài)分析的函數(shù)調(diào)用鏈,動態(tài)分析的函數(shù)調(diào)用鏈需要說明更多的條件:

  1. 需要說明觸發(fā)斷點之前要做什么樣的準(zhǔn)備,例如這里需要游戲中主角位于房間的外面

  2. 需要說明什么樣的操作能觸發(fā)斷點,例如這里需要游戲中主角走入一個房間

  3. 需要說明打什么樣的斷點,例如這里用了一個變量的寫入斷點

  4. 注意箭頭的方向,靜態(tài)分析中箭頭->指的是調(diào)用,而這里的<-指的是被調(diào)用

????下面再給出一個例子:

????這個例子是要找到對隊伍首位精靈進(jìn)行數(shù)據(jù)加密、數(shù)據(jù)打亂、校驗和等反作弊機制的關(guān)鍵函數(shù),觸發(fā)斷點前需要游戲中進(jìn)行到選擇初始御三家的界面,在確認(rèn)選擇某個御三家時觸發(fā)斷點,而斷點設(shè)計為向隊伍首位精靈所在的地址進(jìn)行寫入操作。

斷點的準(zhǔn)備工作

????觸發(fā)斷點后,按照函數(shù)調(diào)用鏈,此時應(yīng)該位于memset函數(shù)內(nèi),按一次F8跳出到CopyMon函數(shù),再按一次F8跳出到GiveMonToPlayer函數(shù)。注意,下面的一行,箭頭方向發(fā)生了變化,意味著從GiveMonToPlayer開始進(jìn)入靜態(tài)分析的流程,去比對源代碼工程找到GiveMonToPlayer調(diào)用的函數(shù)SetMonData,并一直向下找到反作弊機制的幾個關(guān)鍵函數(shù)。

????最后,把幾個關(guān)鍵變量和關(guān)鍵函數(shù)的函數(shù)調(diào)用鏈放在下面。

????gSpeciesNames的函數(shù)調(diào)用鏈:

????sGlobalScriptContext的函數(shù)調(diào)用鏈

????PlayerNotOnBikeMoving的函數(shù)調(diào)用鏈

????StringCopy的函數(shù)調(diào)用鏈

???gMoveNames的函數(shù)調(diào)用鏈

????gBattleMoves的函數(shù)調(diào)用鏈

????gItems的函數(shù)調(diào)用鏈

????gSpeciesInfo的函數(shù)調(diào)用鏈

????至此,所有關(guān)鍵變量和關(guān)鍵函數(shù)的函數(shù)調(diào)用鏈都給出了。

數(shù)據(jù)提取

????提取出來這些關(guān)鍵變量和關(guān)鍵函數(shù),就可以按照專欄第2期口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(2-基于名稱列表的詳情信息提取)的方法,提取一些詳情信息,例如可以用gSpeciesNames和gSpeciesInfo做出下面這張表:

部分的精靈詳情列表

????同理還有技能詳情列表、道具詳情列表等等。

????上面的“曾用名”這一列是《漆黑的魅影》里使用的精靈名稱,而“名稱”這一列是神奇寶貝百科上的官譯名稱。由于《漆黑的魅影》開發(fā)的時間較早,許多名稱在當(dāng)時還沒有統(tǒng)一的官方譯名,這個歷史遺留問題被一直留到了今天,因此在“漆黑的魅影”吧里討論的吧友通常都執(zhí)行兩套“命名系統(tǒng)”,一套是《漆黑的魅影》游戲中的命名,另一套是神奇寶貝百科的名稱,而本期專欄要給出的彩蛋就和這件事有關(guān)。

彩蛋——官譯名稱修正的《漆黑的魅影5.0EX+》

????由于有了上面的“曾用名”和“名稱”列,作者就有能力對《漆黑的魅影》里出現(xiàn)的精靈名稱、技能名稱、特性名稱等進(jìn)行修改,將它們和神奇寶貝百科的名字進(jìn)行統(tǒng)一。當(dāng)然,《漆黑的魅影》中有一些自創(chuàng)的技能,它們的名稱在神奇寶貝百科中沒有對應(yīng),也就沒有修改。

????除了修改名稱之外,作者沒有修改其他任何地方!因此這只能算是一個重新漢化的版本,也可以稱作官譯修正版。效果如下:

注意一些名稱上的變化

????鏈接如下,BW和DP各有一份!

https://pan.baidu.com/s/15z0kZO31uk6uGuk6nuymOQ

????密碼是“漆黑魅影”4個字的拼音首字母,全部大寫。

說在后面:

????本期專欄使用靜態(tài)分析和動態(tài)分析方法,對一個改版的綠寶石游戲——《漆黑的魅影》——進(jìn)行了一次探索。至此,本系列專欄的內(nèi)容應(yīng)該算是全部結(jié)束了。

????終于趕在2023年之前完成了這個系列專欄的內(nèi)容,結(jié)束語在第9期曾經(jīng)說過,這里就不再重復(fù),有什么問題還是評論區(qū)見吧!

口袋妖怪綠寶石——數(shù)據(jù)提取與代碼分析(B-以漆黑的魅影為例)的評論 (共 條)

分享到微博請遵守國家法律
上杭县| 寿宁县| 云林县| 沧州市| 鹤山市| 衡南县| 溧水县| 那曲县| 达拉特旗| 武穴市| 吴忠市| 白水县| 蓬溪县| 巩义市| 淮滨县| 如东县| 微山县| 上杭县| 珲春市| 祥云县| 安义县| 霍州市| 西乌| 灵山县| 准格尔旗| 利津县| 潍坊市| 罗山县| 肥乡县| 丹阳市| 克什克腾旗| 常熟市| 剑河县| 右玉县| 泰和县| 铜鼓县| 龙井市| 蒲江县| 九龙城区| 宜君县| 巴彦淖尔市|