(本文章原始記錄於 2008 年 9 月 3 日並於當日 Post 於巴哈姆特)
[Code Type(金手指碼類別)]
一段金手指碼會以「8 位數 + 8 位數」的方式組成,中間以一個空白字元隔開,
(例如「4A000000 80000000」或者「144F2AE4 000003E7」)
左邊 8 位數的前兩個位數為 Code Type(簡稱 CT),亦即金手指碼類別,
右邊 8 位數則是根據不同的 Code Type 就有不同的寫法,大致上如下:
******* 記憶體直接寫入碼 *******
00XXXXXX ZZZZ00YY(設定 8-bits 值到 80000000+偏移量的位址)
XXXXXX 表示要加到 80000000 的偏移量,YY 表示要設定的 8-bits 值,ZZZZ 則為資料數,ZZZZ 尚不明確,基本上全部填入 0 就可以了。
02XXXXXX ZZZZYYYY(設定 16-bits 值到 80000000+偏移量的位址)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要設定的 16-bits 值,ZZZZ 則為資料數,ZZZZ 尚不明確,基本上全部填入 0 就可以了。
04XXXXXX YYYYYYYY(設定 32-bits 值到 80000000+偏移量的位址)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要設定的 32-bits 值(全部用上),因為後八位數全部用上,所以這邊就沒有前述的 ZZZZ 需要填入。
******* 指標+偏移值寫入碼 *******
(前方通常要加上 4A 或 48 行來指定指標,否則預設成 80000000 或前一指標)
10XXXXXX ZZZZ00YY(設定 8-bits 值到指標+偏移量的位址)
XXXXXX 表示要加到指標位址的偏移量,YY 表示要設定的 8-bits 值,ZZZZ 則為資料數,ZZZZ 尚不明確,基本上全部填入 0 就可以了。
12XXXXXX ZZZZYYYY(設定 16-bits 值到指標+偏移量的位址)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要設定的 16-bits 值,ZZZZ 則為資料數,ZZZZ 尚不明確,基本上全部填入 0 就可以了。
14XXXXXX YYYYYYYY(設定 32-bits 值到指標+偏移量的位址)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要設定的 32-bits 值(全部用上),因為後八位數全部用上,所以這邊就沒有前述的 ZZZZ 需要填入。
******* 條件判斷碼 *******
(當條件成立時則執行,否則不執行)(只提供 32-bits 和 16-bits 判斷)
20XXXXXX YYYYYYYY(32-bits 條件判斷位址資料是否「等於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當 80000000 + XXXXXX 位址的值「等於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。
30XXXXXX YYYYYYYY(32-bits 條件判斷指標+位址資料是否「等於」)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當指標位址 + XXXXXX 位址的值「等於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。
22XXXXXX YYYYYYYY(32-bits 條件判斷位址資料是否「不等於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當 80000000 + XXXXXX 位址的值「不等於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。
32XXXXXX YYYYYYYY(32-bits 條件判斷指標+位址資料是否「不等於」)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當指標位址 + XXXXXX 位址的值「不等於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。
24XXXXXX YYYYYYYY(32-bits 條件判斷位址資料是否「大於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當 80000000 + XXXXXX 位址的值「大於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。
34XXXXXX YYYYYYYY(32-bits 條件判斷指標+位址資料是否「大於」)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當指標位址 + XXXXXX 位址的值「大於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。
26XXXXXX YYYYYYYY(32-bits 條件判斷位址資料是否「小於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當 80000000 + XXXXXX 位址的值「小於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。
36XXXXXX YYYYYYYY(32-bits 條件判斷指標+位址資料是否「小於」)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當指標位址 + XXXXXX 位址的值「小於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。
28XXXXXX ZZZZYYYY(16-bits 條件判斷位址資料是否「等於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當 80000000 + XXXXXX 位址的值「等於」YYYY 時,才執行後面的金手指碼,否則不執行。
38XXXXXX ZZZZYYYY(16-bits 條件判斷指標+位址資料是否「等於」)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當指標位址 + XXXXXX 位址的值「等於」YYYY 時,才執行後面的金手指碼,否則不執行。
2AXXXXXX ZZZZYYYY(16-bits 條件判斷位址資料是否「不等於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當 80000000 + XXXXXX 位址的值「不等於」YYYY 時,才執行後面的金手指碼,否則不執行。
3AXXXXXX ZZZZYYYY(16-bits 條件判斷指標+位址資料是否「不等於」)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當指標位址 + XXXXXX 位址的值「不等於」YYYY 時,才執行後面的金手指碼,否則不執行。
2CXXXXXX ZZZZYYYY(16-bits 條件判斷位址資料是否「大於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當 80000000 + XXXXXX 位址的值「大於」YYYY 時,才執行後面的金手指碼,否則不執行。
3CXXXXXX ZZZZYYYY(16-bits 條件判斷指標+位址資料是否「大於」)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當指標位址 + XXXXXX 位址的值「大於」YYYY 時,才執行後面的金手指碼,否則不執行。
2EXXXXXX ZZZZYYYY(16-bits 條件判斷位址資料是否「小於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當 80000000 + XXXXXX 位址的值「小於」YYYY 時,才執行後面的金手指碼,否則不執行。
3EXXXXXX ZZZZYYYY(16-bits 條件判斷指標+位址資料是否「小於」)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當指標位址 + XXXXXX 位址的值「小於」YYYY 時,才執行後面的金手指碼,否則不執行。
******* 指標偏移碼 *******
4A000000 XXXXXXXX(設定指標位址,將用於加到後方金手指碼的偏移量上)
XXXXXXXX 表示想設定的指標,通常為 80000000,會將此數加上 Offset 來指定正確位址。由於位址都為 32-bits 八位數,而金手指碼前兩位數都用來指定 Code Type,扣除二位數之後只剩下六位數可以用,因此可以利用此 Code Type 來設定指標,然後再加上下一行金手指所指定的六位數(當成 Offset 偏移量)就可正確指定位址了,例如要鎖定 804F2AE4 這個位址 16-bits 的值為 999 的話,就可以先設定指標到 80000000 (Wii 記憶體安全區為 80000000~81800000,此為最前面的位址),寫成 4A000000 80000000,然後再寫一行 124F2AE4 000003E7 ,如此一來,就會從 80000000+4F2AE4 位址起寫入 16-bits 的資料(亦即 804F2AE4 和 804F2AE5)。
48000000 XXXXXXXX(讀入指標所指位址)
XXXXXXXX 表示想讀入的指標位址,該位址所記錄的是一組記憶體位址而非一般數值。
當搜尋到正確的指標位址後,真正要鎖定的不是指標位址的值,而是指標所指位址的偏移位址,
所以是要「讀入」指標位址中的「位址值」,然後再將它加上 Offset,才會找到正確位址。
******* 位址範圍檢查碼 *******
CE000000 XXXXYYYY
檢查要鎖定的記憶體值是否介於 XXXX 與 YYYY 之間(XXXX < Address < YYYY),
如果是的話就繼續鎖定值,如果在範圍外就會暫停鎖定。
通常會是 CE000000 80008180,表示會檢查是否 80000000 < Address < 81800000。當 Address 跑到範圍外,則鎖定會中斷而避免當機。
DE000000 XXXXYYYY
檢查要鎖定的指標所指記憶體是否介於 XXXX 與 YYYY 之間(XXXX < Address < YYYY)。
如果是的話就繼續鎖定值,如果在範圍外就會暫停鎖定。
通常會是 DE000000 80008180,表示會檢查是否 80000000 < 指標所指位址 < 81800000。當指標所指位址的值跑到範圍外,則鎖定會中斷而避免當機。
由於指標所指位址有可能在過關或跳出某一關卡之後會清掉,變成 00000000,
如果 Offset 為 2AE,就會變成鎖定 000002AE 這個位址(超出記憶體安全範圍區),
很容易導致當機,為了避免鎖定到錯誤的位址,可以透過這個檢查碼來中斷鎖定。
******* 終結碼 *******
E0000000 XXXXYYYY
檢查還原目前的記憶體設定位址及指標設定位址。如果記憶體位址不是 0000,則設定成 XXXX,如果指標位址不是 0000,則設定成 YYYY。通常為 E0000000 80008000。
如果上一個碼曾設定過指標來使用,而下一個碼在使用前沒有清除前一個指標的話,
就會參考到前一個指標。當後面的碼並不需要用到指標,而又沒清除指標時,
要鎖定的位址就有可能誤加上前一個指標,而鎖定到錯誤的位址(也可能導致當機)。
所以通常寫完一塊有參考到指標的金手指碼後,最後一行會加上 E0000000 80008000 來終結。
基本的 Code Type 可以參考 dexter0 Hacking Tutorial 一篇:
http://members.cox.net/dexter0/WiiHacking/wiirdhacking.shtml
詳細的 Code Type 一覽可以參考 Kenobi 文件說明:
http://www.thegshi.org/faqs/wiicodetypes.html
我喜欢,顶一个!
謝謝!請多指教