(本文章原始記錄於 2008 年 9 月 3 日並於當日 Post 於巴哈姆特)
[實際寫入]
-
一般碼寫入(假設搜得位址為 804F2AE4,要鎖定為 999)
- 第一行輸入 4A000000 80000000,表示要使用指標加上偏移量。
- 第二行輸入 124F2AE4 000003E7,指定第一行指標加上偏移量的位址起設定 16-bits 資料。
(此例 804F2AE4 值為 03,804F2AE5 值為 E7 → Big Endian 排列方式之故) - 指標設定碼(4A000000 80000000)一定要寫在位址寫入碼(124F2AE4 000003E7)的前面,如果不是在前面,可以利用右邊的 Move Up 或 Move Down 按鈕來調整先後順序。
- 如果還有其他位址寫入碼要使用到相同的指標(4A000000 80000000),可以不用重建一行,直接將位址寫入碼加在下面即可,看起來可能會像是:
4A000000 80000000 → 指定指標為 80000000。
124F2AE4 000003E7 → 指定 80000000 + 4F2AE4 的位址開始,值連續為 03 E7。
104F2AE8 00000063 → 指定 80000000 + 4F2AE8 的位址,值為 63。 - 於左邊所有金手指一覽中,在要開啟金手指的名稱上點滑鼠右鍵→Enable Code,就會將右邊的碼全部設定為開啟狀態(碼左方會出現「*」號),Disable Code 則是全部關閉。如果想單獨開啟或關閉某行碼,可以點一行金手指碼最左邊的框格,有「*」號則為開啟,無則為關閉。
- 個別設定完開啟或關閉金手指碼之後,一定要按下名稱一覽下方 Apply Codes 鈕才會執行。只是讓「*」號出現或消失並不會真正將碼注入 Wii 中。
http://members.cox.net/dexter0/WiiHacking/example1.shtml -
指標碼寫入(假設搜得指標所指為 [806B7B40]+2AE,要鎖定為 999)
- 第一行輸入 48000000 806B7B40,表示要讀入 806B7B40 位址的值(假設取得值為 804F2AE4)。
- 第二行輸入 120002AE 000003E7,表示要在 804F2AE4 + 2AE 的位址開始,寫入值 03 E7。指標讀入碼(48000000 806B7B40)一定要寫在位址寫入碼(120002AE 000003E7)的前面,如果不是在前面,可以利用右邊的 Move Up 或 Move Down 按鈕來調整先後順序。
- 基本上只要上述兩行就可以執行了,但由於用指標指定的位址資料通常在過關後會先清除,如果一直鎖定「指標所指位址+偏移量」的位址,當指標所記錄位址清除後變成 00000000 時,就會鎖定到不該鎖定的位置而當機,所以要檢查指標所指位址是否在某個範圍內。在前述兩行中間插入一行 DE000000 80008180 檢查碼,
(檢查指標所指位址是否介於 80000000~81800000 間)
如果 806B7B40 位址的值為 00000000 (範圍外),下一行 120002AE 000003E7 就不會執行。 - 為求安全,在設定完有指標的金手指碼之後,最後一行加上 E0000000 80008000 終結碼,將一般位址及指標位址都設定還原歸位,以防其他碼誤用指標。
- 總結上面幾行金手指碼,依序看起來可會能像是:
48000000 806B7B40 → 讀入 806B7B40 內的位址資料。
DE000000 80008180 → 檢查 806B7B40 的值是否在範圍內,是才繼續往下執行,否則中斷。
120002AE 000003E7 → 將 806B7B40 內的值加上 2AE 的位址處開始,連續設定為 03 E7。
E0000000 80008000 → 將一般位址及指標位址歸位,以防其他碼誤用。 - 接下來同「一般碼寫入」之步驟 5、6 注入執行寫好的金手指碼。
-
判斷碼寫入(假設 805053AA 為判別控制器按鍵的一個位址)(鎖定按住某鈕會飛,放開則落下)
- 先依一般碼寫入或指標碼寫入的方式,搜尋並寫入鎖定位址的金手指碼區塊。
- 搜尋按 A 鈕、B 鈕、C 鈕‧‧等等後哪個位址會做記錄,可能有多個位址會同時變動資料。通常假設按了 A 鈕的值為 1、按 B 鈕值為 2、按 C 鈕值為 3 ‧‧‧的話,同時按 A + B 鈕則值就會變成 1 + 2 = 3,同時按 B + C 鈕則值就會變成 2 + 3 = 5。
- 由於此位址記錄的資料是關連到整個遊戲,所以通常不會因為關卡變動而位址也跟著變動,所以可以使用 20 碼直接判斷固定位址。輸入 205053AA 00000100 表示判斷是否按下 A 鈕。如果做判斷是否同時按下 A 和 B 鈕,則輸入 205053AA 00000300。
(後方也可能為 00000001 或 00000003 等等,只要 Code Type 配合正確應無大礙) - 輸入完成之後,將這一行碼用 Move Up 及 Move Down 鈕移到要執行的金手指碼區塊上方。如此一來,當按下了 A 鈕時,後方的金手指碼區塊才會執行,否則不執行。例如只按住 A 鈕(同時按了其他鈕則不行)時,主角會一直往上飄,放開鈕就會掉下來,類似如此功能的金手指碼就要用判斷式的 Code Type,而不是一直鎖定住。
- 如果要判斷的位址不是固定而是浮動式,例如是讀取指標 80DA23E4 裡的位址的話,可以在判斷碼前面加入指標讀取碼(48)。假設當主角血扣至 1000 以下時,會自動補血到 9999,可以先用 48000000 80DA23E4 讀入指標,再加入一行 3E000380 000003E8 判斷血量,最後再設定自動補血 12000380 0000270F。
- 步驟 5 整段金手指碼如果加上檢查碼可以整理如下:
48000000 80DA23E4 → 讀入 80DA23E4 內的位址資料。
DE000000 80008180 → 檢查目前 80DA23E4 值是否在範圍內,是才繼續執行,否則中斷。
3E000380 000003E8 → 判斷 80DA23E4 內的值加上 380 的位址資料是否小於 1000。
12000380 0000270F → 當前一行碼判斷式成立(該位址的值小於 1000) 時(TRUE),才將該位址的值設定成 9999。
E0000000 80008000 → 將一般位址及指標位址歸位,以防其他碼誤用。
指標碼寫入可參考 dexter0 第二篇指標位址鎖定範例
http://members.cox.net/dexter0/WiiHacking/example2.shtml
其他指標相關搜尋、Assembly Code Injection 等可參考金手指搜尋工具 Cheat Engine
http://www.cheatengine.org/
TrackBack URL
https://www.actman.tw/~blog/2010/09/wii-%e9%87%91%e6%89%8b%e6%8c%87%e6%90%9c%e5%b0%8b-with-usb-gecko%e4%ba%94%e5%af%a6%e9%9a%9b%e5%af%ab%e5%85%a5/trackback/