欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
漢化基礎教程——ASM篇

并非需要很多的計算機知識才能夠進(jìn)行程序跟蹤,當然要想便捷有效的跟蹤程序的確需要扎實(shí)的匯編語(yǔ)言基礎。許多朋友都是出于個(gè)人愛(ài)好才接觸漢化的,如果一開(kāi)始進(jìn)行跟蹤就學(xué)習大量的硬件知識和匯編知識一定會(huì )感覺(jué)吃力而對自己?jiǎn)适判?。其?shí)學(xué)習ASM HACK完全可以遵循循序漸進(jìn)的原則,先使用最簡(jiǎn)單但比較費力的方法,通過(guò)對程序認識的深入再不斷改進(jìn)自己的跟蹤手段來(lái)提高效率。在這篇文章中我將講解如何使用比較原始的方法來(lái)捕獲游戲圖片在ROM中的位置,這只是跟蹤的第一步,如果想要捕獲顯示程序或解壓程序就需要了解更多的知識才能實(shí)現,但這是后話(huà)了,讓我們先從最簡(jiǎn)單的開(kāi)始。

  工具軟件:
  BATGBA模擬器(一款免費的GBA模擬器,帶基本的DEBUG功能。對于初學(xué)者不推薦使用NO$GBA) UltraEdit(全球最著(zhù)名的文本編輯器,功能強大,中文界面)

  技術(shù)手冊:
  ARM指令集手冊(ARM是GBA使用的處理器芯片,學(xué)習匯編的必備工具書(shū))
  幾本計算機基礎書(shū)籍(良好的計算機基礎是你進(jìn)行漢化的必要條件)

 

  其他:
  很多很多的耐心和一點(diǎn)點(diǎn)運氣

 

  在我們開(kāi)始跟蹤之前有必要了解一下GBA的芯片和模擬器的用法,大家開(kāi)始的時(shí)候不用徹底學(xué)習這些知識,只要知道用法就可以。GBA使用的是ARM7TDMI處理器芯片,它和我們常見(jiàn)的INTER或AMD芯片有很大區別,不要把二者混為一談。ARM使用RISC(精簡(jiǎn)指令集)架構 32位 16.78MHz。我們跟蹤主要需要了解的是它的寄存器結構和匯編代碼。ARM 處理器有二十七個(gè)寄存器,其中一些是在一定條件下使用的,所以一次只能使用十六個(gè)。
  寄存器 0 到寄存器 7 是通用寄存器并可以用做任何目的。
  寄存器 8 到 12 也是通用寄存器,但是在切換到 FIQ 模式的時(shí)候,使用它們的影子(shadow)寄存器。 
  寄存器 13 典型的用做 OS 棧指針,但也可被用做一個(gè)通用寄存器。
  寄存器 14 專(zhuān)職持有返回點(diǎn)的地址以便于寫(xiě)子例程。
  寄存器 15 是程序計數器。它除了持有指示程序當前使用的地址的二十六位數之外,還持有處理器的狀態(tài)。
  寄存器在程序中的表示符號是R0-R15,大家先不要深究這些寄存器的功能和區別,只要知道這些寄存器的名稱(chēng)就可以,然后我們講關(guān)鍵的地方。

  GBA和電腦一樣,在運行任何程序時(shí)都遵循一個(gè)過(guò)程,先從卡帶(ROM)里將程序或文件讀入內存,然后將內存中的程序或文件按一定順序裝載到寄存器中,再由寄存器與處理器交互處理,將處理結果返回內存中。正是因為我們可以通過(guò)模擬器觀(guān)察這個(gè)過(guò)程,才有跟蹤的實(shí)現。那么GBA是如何將文件從ROM中裝載到內存的呢?GBA在運行的時(shí)候將內存劃分成一個(gè)連續的區域。用地址表示就是00000000H-FFFFFFFFH其中00000000H-08000000H是實(shí)際意義上的內存空間,而08000000H以后的地址則是ROM的地址映射,也就是說(shuō)08000000H就是實(shí)際ROM中的首地址00000000H。GBA通過(guò)這個(gè)映射地址來(lái)讀取ROM中的文件,理解這個(gè)概念很重要,也就是說(shuō)你在寄存器中觀(guān)察到的以08XXXXXXH表示的地址即說(shuō)明此刻程序正從ROM里讀取相應的文件,可能是程序,圖片,文本,字庫。這些正是我們需要找到的東西。

  如何才能截獲這個(gè)地址呢?這就是模擬器的工作了,現在幾乎所有的GBA模擬器都帶有跟蹤功能,允許你查看游戲運行過(guò)程中內存和寄存器里的內容,通過(guò)觀(guān)察寄存器中的數值和內存中的程序,我們可以滴水不漏的獲得游戲運行的全過(guò)程。以下讓我們看看模擬器是如何跟蹤游戲程序的。

  打開(kāi)BATGBA,看看DEBUG菜單下的內容,第一項是ENABLE,開(kāi)始跟蹤時(shí)可別忘選上它,否則跟蹤無(wú)從談起。第二項是UPDATE DIALOGS,這是自動(dòng)刷新功能,當然跟蹤時(shí)也要選上,否則你只能看到靜止不動(dòng)的程序。第三個(gè)選項就是我們的主角,觀(guān)測功能菜單,在這個(gè)菜單中提供了10個(gè)不同的觀(guān)測對象,我們主要用到的是最上面兩個(gè)對象,CPU和DISASM。讓我們選擇這兩個(gè)對象,這時(shí)候我們看見(jiàn)如下的兩個(gè)窗口:

 ?。▓D片1)ARM7TDMI CPU窗口,你一眼就可以認出來(lái),這個(gè)窗口表示的就是我們上文提到的GBA使用的那15個(gè)寄存器R0-R15,沒(méi)錯。既然所有的程序都必須經(jīng)由寄存器才能與處理器交互,那么我們要找的地址也不例外,那些08XXXXXXH表示的地址都會(huì )在這些寄存器中出現,你只要在跟蹤過(guò)程中從這些寄存器窗口中抓到它就可以了。

 ?。▓D片2)ARM7TDMI ARM/THUMB DISASM窗口,就是將GBA內存中的數據反匯編成ARM匯編語(yǔ)言的窗口。通過(guò)這個(gè)窗口,我們可以以匯編語(yǔ)言的形式而不是二進(jìn)制代碼的形式來(lái)觀(guān)察程序的運行過(guò)程,這大大方便了我們了解游戲是如何運行的。不論是字庫顯示程序,解壓縮程序還是圖片調用程序都需要在內存中運行,這些程序會(huì )被反編譯成ARM的匯編指令在這個(gè)窗口顯示,找到這些程序就是我們跟蹤的目的。

  下面我們以GBA游戲拿破倫傳為例來(lái)看看怎樣找到這個(gè)游戲中一個(gè)圖片文件在ROM中的位置:

 ?。▓D片3)是我們需要找到圖片文件,思考這樣一個(gè)問(wèn)題,GBA是通過(guò)哪幾個(gè)步驟來(lái)完成這個(gè)圖片的顯示的?首先,GBA先將圖片文件從ROM中讀入內存,然后調用圖象解析程序來(lái)處理這個(gè)圖片文件,最后輸出到顯示屏上顯示。我們暫時(shí)不考慮它的解析和輸出過(guò)程,只要抓到它讀取圖片文件時(shí)的過(guò)程就可以找到它讀取ROM的位置。那么它從哪里開(kāi)始這個(gè)過(guò)程的呢?讓我們看看這幅圖片顯示前的狀態(tài)。

 ?。▓D片4)是游戲里的一個(gè)選擇菜單,當我們選擇指揮官設定選項時(shí),游戲隨即顯示我們需要跟蹤的那個(gè)圖片,也就是說(shuō),從你按下按鍵開(kāi)始到(圖片3)開(kāi)始顯示的這個(gè)過(guò)程中即包含了游戲調用圖片文件的過(guò)程,我們就從這里來(lái)尋找圖片文件在ROM中的地址數據。

  BATGBA提供了4種不同的跟蹤模式,STEP INTO(F7),STEP OVER(F8),STEP LINE(F9),STEP FRAME(F10)這4種模式對應不同的程序運行流程,大家先不要深究它們,先這樣理解,GBA在執行程序時(shí)是一條語(yǔ)句一條語(yǔ)句執行的,這4種模式對應不同的中斷模式,打個(gè)比方說(shuō)STEP FRAME(F10)是程序執行100條停止一次,STEP LINE(F9)是執行10條停止一次,而STEP OVER(F8)和STEP INTO(F7)則是每執行一條就停止一次。當然還有一個(gè)中斷程序的方法,就是按(F4)鍵。你可以在游戲運行中的任何時(shí)候中斷游戲。有了這5種中斷模式我們就可以在游戲執行時(shí)在需要的地方暫停游戲來(lái)觀(guān)察此時(shí)GBA寄存器和內存中的東東,也許你要找的圖片地址就在其中。

  上文我們已經(jīng)圈定了我們跟蹤的范圍,從你按下按鍵開(kāi)始到(圖片3)開(kāi)始顯示,這個(gè)過(guò)程只有短短的幾秒鐘,打開(kāi)模擬器載入游戲,然后進(jìn)入(圖片4)的菜單。這時(shí)打開(kāi)ARM7TDMI CPU窗口和ARM7TDMI ARM/THUMB DISASM窗口,你可以看到此刻寄存器和內存中的全部?jì)热?,但是好象沒(méi)找到象08XXXXXXH這樣的數據???別著(zhù)急,在(圖片4)的菜單中選擇指揮官設定選項,在你按下按鍵的同時(shí)立即按(F4)鍵,這時(shí)游戲停止了,我們的跟蹤旅程也就從此開(kāi)始,上文我們講到的4種中斷模式中的STEP OVER(F8)和STEP INTO(F7)是單步跟蹤模式,我們隨便選一種,比如STEP INTO(F7),在你再次按下(F4)的同時(shí)按下(F7)鍵。好,我們現在切換到單步跟蹤模式了。這時(shí)你仔細觀(guān)察ARM7TDMI ARM/THUMB DISASM窗口,每當我們按一次(F7),窗口里的指針就向下移動(dòng)一格,這表明游戲程序已經(jīng)執行了一步??纯碅RM7TDMI CPU窗口,寄存器R0-R15里的數值也變化了??墒沁€是沒(méi)看見(jiàn)有08打頭的數據,慢慢來(lái),繼續按(F7),觀(guān)察ARM7TDMI CPU窗口里寄存器里的數值,我保證你一定會(huì )看到以08開(kāi)頭的數據,記下你見(jiàn)到的所有08XXXXXX樣子的數據,直到模擬器窗口顯示出(圖片3)為止。這時(shí)你也許已經(jīng)記下了許多以08開(kāi)頭的數據,這里面肯定包括(圖片3)的地址,但哪個(gè)才是真的呢?簡(jiǎn)單,使用UltraEdit打開(kāi)游戲的ROM文件,我們前面說(shuō)過(guò)了,GBA把ROM里的地址都映射到08000000H之后,那么將你找到的數據轉化成ROM里的地址的方法就是將開(kāi)頭的08變成00,比如你找到一個(gè)08123456的數據,那么它在ROM中表示的地址就是00123456H。將你記下的數據都按這種方法轉換成ROM中的地址,然后在UltraEdit找到對應的地址下隨便修改幾個(gè)字節,保存。再用模擬器打開(kāi)修改后的ROM??纯矗▓D片3)是不是變樣了?沒(méi)有,再換下一個(gè)地址試試,直到找到一個(gè)地址[我可以告訴你這個(gè)地址是:00759E37H在UltraEdit修改后(圖片3)變樣了,那么恭喜你,你已經(jīng)找到你需要的東西了。

  說(shuō)到這里,你已經(jīng)學(xué)會(huì )了使用最簡(jiǎn)單的方法跟蹤了。但如果你真的按我上面說(shuō)的一步一步跟蹤程序的話(huà),你一定會(huì )累死!別小看這短短幾秒,其實(shí)程序已經(jīng)執行了成千上萬(wàn)步了。如果一步一步跟蹤的話(huà),你一整天也跟不完。先別抱怨,誰(shuí)讓我們是菜鳥(niǎo)呢。便捷的方法當然有,但在你不了解跟蹤原理,ARM匯編語(yǔ)言的情況下,這是唯一可行的辦法,下面我們就來(lái)看看有沒(méi)有更好的方法來(lái)提高效率。不過(guò)前提是你必須理解以上所說(shuō)的內容,會(huì )使用單步跟蹤來(lái)跟蹤程序,否則提高無(wú)從談起。

  如果你懶的理會(huì )那些繁瑣復雜的匯編語(yǔ)言,其實(shí)可以利用模擬器提供的功能來(lái)縮短跟蹤范圍。記得我們提到的那4個(gè)中斷模式嗎?我們只使用了兩個(gè),不是還有兩個(gè)嗎?STEP FRAME(F10)一次中斷執行的語(yǔ)句最多。如果用它來(lái)跟蹤以上過(guò)程的話(huà),只需要按幾次就可以跟完,但是你很可能會(huì )遺漏掉程序讀取ROM的過(guò)程,畢竟STEP FRAME(F10)中斷時(shí)的位置不可能正好就在程序讀取ROM時(shí)。讓我們將這幾種中斷模式組合起來(lái)。STEP FRAME(F10)既然一次執行語(yǔ)句最多,讓我們先用它來(lái)進(jìn)行一次粗跟蹤,假設從你按下按鍵開(kāi)始到(圖片3)開(kāi)始顯示這個(gè)過(guò)程一共執行了一萬(wàn)條語(yǔ)句,使用STEP FRAME(F10)跟蹤,我們一共執行了10次中斷,記下每次中斷時(shí)寄存器的狀態(tài)。這樣我們就把一萬(wàn)條語(yǔ)句分割成10等份,假設我們估計調用ROM的程序在第9到第10狀態(tài)之間,先用STEP FRAME(F10)跟蹤到第9個(gè)狀態(tài),然后用STEP LINE(F9)來(lái)跟蹤。因為STEP LINE(F9)一次執行的語(yǔ)句比STEP FRAME(F10)要少,所以它能跟蹤到這兩個(gè)狀態(tài)之間的程序。如果使用STEP LINE(F9)還是沒(méi)找到,就用STEP LINE(F9)將這兩個(gè)狀態(tài)再分割成更細的狀態(tài),使用單步跟蹤來(lái)查找。如此我們等于將程序化整為零,如果運氣好的話(huà),我們根本不需要從頭到尾全部跟蹤就可以找到我們需要的圖片地址。

  可是上述方法還是很笨,而且運氣的成分太多。有沒(méi)有更科學(xué)更有效的方法呢?有,當然有,這就是斷點(diǎn)設置跟蹤。它是目前最有效最科學(xué)的跟蹤方法。不過(guò)要學(xué)習這個(gè)方法不了解程序和匯編是很難使用好的。讓我們先了解一下程序的運行模式。不論是什么游戲程序都具有這樣一種特征,假設我們把一個(gè)游戲程序看做一個(gè)完整的大程序,那么這個(gè)大程序就是由若干個(gè)功能相對獨立的小程序組成的。他們可能是游戲初始化,圖象顯示,字庫調用,文本調用,聲音播放等等不同的功能,我們稱(chēng)這些具有相對獨立功能的小程序為子程序。一個(gè)游戲程序就是由這一個(gè)一個(gè)子程序相互嵌套組成的。也就是說(shuō)我們要找的圖片調用過(guò)程也是子程序的一種,還有字庫顯示程序,解壓縮程序都可以稱(chēng)為子程序。每條子程序都是由數量不等的匯編語(yǔ)句構成的。倘若我們能以子程序為單位而不是以單條語(yǔ)句為單位來(lái)進(jìn)行跟蹤的話(huà)不僅能大大提高效率,同時(shí)還能完整的捕獲程序的代碼,避免了盲目性。那么這些子程序在游戲中使用什么形式表示的呢?讓我們以L(fǎng)Z77解壓縮程序為例來(lái)看看子程序的模式。

00000DB4 Ldr r2,[r0],#0x4
00000DB8 mov r2, r2,lsr #0x8 
00000DBC mvn r9,#0x0 
00000DC0 mov r10,#0x1

 

00000DC4 mov r6,#0x7
00000DC8 ldrb r3,[r0],#0x1
00000DCC ldrb r8,[r0],#0x1
00000DD0 tst r10,r3,lsr r6
00000DD4 beq 0xE08

 

00000DD8 mov r5,r8,lsr #0x4 
00000DDC add r5,r5,#0x2 
00000DE0 sub r2,r2,r5 
00000DE4 and r8,r8,#0xF 
00000DE8 ldrb r4,[r0],#0x1 
00000DEC orr r4,r4,r8,lsl #0x8 
00000DF0 add r4,r4,#0x1 
00000DF4 ldrb r8,[r1,-r4] 
00000DF8 strb r8,[r1],#0x1 
00000DFC subs r5,r5,#0x1 
00000E00 bpl 0xDF4 
00000E04 b 0xE18

 

00000E08 tst r1,#0x1 
00000E0C ldrneb r7,[r1,r9] 
00000E10 orrne r8,r7,r8,lsl #0x8 
00000E14 strh r8,[r1],#0x1

 

00000E18 subs r2,r2,#0x1 
00000E1C bmi 0xE2C 
00000E20 subs r6,r6,#0x1 
00000E24 bpl 0xDCC
00000E28 b 0xDC4

 

  這就是一段完整的子程序,它具有相對獨立完整的功能。讓我們實(shí)際跟蹤一下看看它是如何運行的。找到一個(gè)使用LZ77壓縮的游戲(如逆轉裁判或鑄劍物語(yǔ))用模擬器打開(kāi),這時(shí)請看ARM7TDMI ARM/THUMB DISASM窗口右上方,是不是有一個(gè)BREAK文本框?那就是我們設置斷點(diǎn)的地方,先按(F4)鍵暫停游戲,在這個(gè)文本框里輸入00000DB4,點(diǎn)擊SET按鍵。好,我們已經(jīng)設置好一個(gè)斷點(diǎn)了。再按(F4)鍵運行游戲,不久游戲就停止在00000DB4處了。然后我們使用(F7)鍵單步跟蹤一下,你會(huì )發(fā)現窗口里的指針總是在00000DB4-00000E28之間來(lái)回循環(huán)跳轉。這時(shí)讓我們使用(F4)鍵中斷試試。哈,每按一次,程序就中斷到我們設的斷點(diǎn)位置,同時(shí)觀(guān)察ARM7TDMI CPU窗口中寄存器的變化你會(huì )發(fā)現子程序進(jìn)行了一次循環(huán)。這樣我們一次中斷跟蹤就是以一次子程序循環(huán)為單位,再也不用逐條語(yǔ)句的看了。象這樣的子程序在游戲中隨處可見(jiàn)。隨便你找個(gè)什么游戲,使用單步跟蹤觀(guān)察一下就會(huì )發(fā)現,ARM7TDMI ARM/THUMB DISASM窗口中的指針總是在一個(gè)地址段中循環(huán)執行后再跳轉到下一個(gè)地址段繼續循環(huán)執行。這樣一個(gè)連續的循環(huán)地址段所包含的語(yǔ)句段都是子程序。那么什么時(shí)候程序才能跳出一個(gè)循環(huán)到下一個(gè)循環(huán)呢?這就要求你能讀懂子程序的跳轉條件了。先別著(zhù)急去讀它,我們先總結一下設置斷點(diǎn)的步驟,首先找到游戲程序中的一段子程序,然后在子程序開(kāi)始的位置設置斷點(diǎn),斷點(diǎn)的表示方式就是子程序在內存中的地址。

  這就是設置斷點(diǎn)的跟蹤方法,在實(shí)際跟蹤中我們往往需要綜合我們上述講到的所有方法來(lái)協(xié)調跟蹤。首先圈定你的跟蹤范圍,在這個(gè)范圍中使用單步跟蹤或分割跟蹤先找到一段子程序,在子程序的開(kāi)始位置設置斷點(diǎn),轉換成斷點(diǎn)跟蹤模式,努力讀懂子程序的跳轉條件,找到子程序跳轉后的位置,再在這個(gè)子程序將要跳出循環(huán)時(shí)使用單步跟蹤跟到下一個(gè)子程序,再設斷點(diǎn)繼續跟蹤下一段子程序,如此下去,直到你找到需要的圖片顯示程序或字庫顯示程序為止。

  斷點(diǎn)跟蹤是不是很奇妙?不過(guò)這時(shí)你也許會(huì )抱怨BATGBA模擬器了,它每次只能設一個(gè)斷點(diǎn),有時(shí)跳轉條件沒(méi)讀懂還容易跟出界。沒(méi)辦法,劍術(shù)既然已經(jīng)高超了,讓我們換更好的劍使用。NO$GBA,這個(gè)模擬器可以一次設好幾個(gè)斷點(diǎn),同時(shí)允許你自己設定程序運行多少步中斷一次,不用擔心跟出界了吧?還有CowBite,它允許你倒退跟蹤幾步來(lái)觀(guān)察程序,這對于尋找子程序跳轉位置太有用了,不過(guò)它對游戲的兼容性一般。

  小結:ASM跟蹤的基本方法我們就講完了。(什么?這只是基本方法????)沒(méi)錯。真正跟蹤的時(shí)候光靠這些是不夠的,你如何圈定你的跟蹤范圍,如何判斷你找到的地址和程序就是你需要的。這些就有賴(lài)于你對漢化其他知識的了解了,字庫,文本,圖片的結構,壓縮算法等等知識。你對游戲漢化了解的越深,跟蹤起來(lái)就越得心應手。大家也許奇怪我在文檔中只字未提ARM匯編語(yǔ)言,原因是想講清一門(mén)語(yǔ)言不是三言?xún)烧Z(yǔ)就能說(shuō)清的。這需要你平時(shí)不斷的積累,學(xué)習,多讀多看程序。那本ARM指令集手冊就是最好的教材。你不一定全讀懂,能讀懂40%再看子程序就容易多了。文中提到的所有技術(shù)手冊和軟件各漢化網(wǎng)站都有下載,還等什么?馬上開(kāi)始你的跟蹤之路吧。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
【教程】無(wú)需存檔直接用DeSmuME模擬器玩《復蘇的逆轉》第5章
ARM7TDMI的存儲器及其地址映射
嵌入式系統原理作業(yè)
單片機常用名詞解釋
事關(guān)你未來(lái)的薪資前景要知道51單片機一些關(guān)于CPU的理論知識
arm寄存器
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久