[心得] 金手指

看板Emulator (模擬器)作者 (急凍奇俠)時間18年前 (2006/07/30 21:07), 編輯推噓7(700)
留言7則, 7人參與, 最新討論串1/1
為什麼叫金手指 是從一個故事來的 有個人許願後 手指碰到的東西都會變成黃金 來代表想得到什麼都做得到 用在遊戲中 作弊碼可以達到你任何想達到的效果 所以作弊碼稱為金手指 不過 遊戲卡帶的印刷電路板 用來插入插槽的那一排金色線路的也叫金手指 1.為什麼能改遊戲裡的內容 因為電腦裡的任何檔案 都是數位的0與1組成 遊戲也是 在使用模擬器讀取ROM玩遊戲時 你已經把整個遊戲從硬碟讀取到記憶體裡面了 所有遊戲的畫面 數值 下一部的動作 都完整的在記憶體裡面經由CPU的運算而變動 所以你能找到紀錄該數值 該狀態 的記憶體位置 然後更改它 得到你想要的效果 2.記憶體內容的形式 在電腦的世界 以bit(位元)為單位 bit只有0或1 用那一格記憶體元件的電壓值代表 再來是byte(位元組) 1 byte = 8 bits 所有0與1的組合 從 0000000 到 11111111 總共有256(2的8次方)種 模擬器程式的記憶體是以 1 byte為單位 來記錄或是運算 這個世界通用的數字進位是 10進位 意指需要4 bits(2的4次方=16) 才能表示數字0到9 那剩下的6位怎麼辦 所以程式都採用16進位 0~9 之後是 ABCDEF 才進位到下一位 1 byte 可以記錄16進位的兩位數 從 00~FF 即10進位的 0~255 3.記憶體位址 記憶體很大 所以需要給他們位址 也是16進位 因為有更上層的記憶體在記錄管理這些位址 每個模擬器使用的記憶體不同 甚至可能版本不同 記憶體位置就不同 所以我在寫金手指時 會附上模擬器 這也是為什麼使用game master 來找電腦遊戲的金手指 每次找到位址都不一樣 他們用的是window的記憶體位址分配 所以前面多開其他程式 位址就被佔走 你的遊戲就只能用後面的位址 而模擬器用的是本身再虛擬一次的記憶體位址 所以同模擬器 同ROM 金手指是相同的 較低位元的模擬器 使用的ROM都不大 所以需要記憶體位址不多 像FC任天堂 只有用到 0000~FFFF (其實只有用到7XXX) 遊戲複雜容量大的模擬器 像GBA 就到00000000到03XXXXXX PS就更誇張了 4.數值記錄方式 遊戲也是個程式 同樣的結果 不同人寫 內容也不同 管理數值的方式也不同 以十進位99為例 有遊戲是表達成16進位的63 有的卻是表示成 99 4bits表示十位 另外4bits表示個位 有的使用到2個bytes, 1 byte紀錄十位 1byte紀錄各味 以 09 09 表示 大部分都是第一種 因為用的記憶體最少 可以記錄的數值最大 可是寫起來麻煩 還要轉換16進位到10進位再顯示在螢幕上 再來是紀錄 狀態 如果狀態只有 兩種 就可以只用 1 bit 的0與1表示 所以1byte可以紀錄8種狀態 00000000 11111111 此時記憶體使用2進位 例如RPG 常用的 死亡與否 中毒與否 過關與否 開關與否 就是這樣紀錄 每個物品也可用數值代表 例如 01代表刀 02代表劍 ... 同理 顏色 大小 圖形 在畫面上位置 移動速度 顯示文字 等 也可以這樣紀錄 就這樣組成我們玩的遊戲 以下我列一下 常用的數值 10進位 16進位 10 0A 15 0F 99 63 999 03E7 9999 270F 99999 1869F 999999 F234F 9999999 98967F 255 FF 65535 FFFF 16777215 FFFFFF 要轉換10進位和16進位很簡單 只要使用Window內建的小算盤即可 打開小算盤後 按下功能列的 檢視 找到工程型 按下去 你的小算盤就會變大台 然後輸入你要的10進位數字 用滑鼠將16進位選項 按下去 數字欄內的數字就會變化 同理 先將小算盤設定在16進位 輸入數字後 再用滑鼠按下 10進位 就會變成10進位數字 二進位也是如此使用 5. 尋找金手指 現在知道遊戲如何在電腦中進行 那我們就來找金手指 金手指就是你想要找出的數值或是狀態 然後想要改變它 或是固定它 模擬器通常都會提供尋找金手指的功能 稱為 cheat code 尋找方法 大概有兩種 一種是輸入指定的數字 像是銀幕上有顯示的數字 另一種是沒有顯示 但是是會改變的狀態 例如受傷 與沒受傷 現在以 FC魔界村http://0rz.net/771Gi 模擬器virtualNES 0.92http://0rz.net/0e1E3 為例 我們來找 時間 還有 子彈種類 先開啟模擬器 讀入遊戲 進入遊戲畫面 時間是直接的數值 可以直接找數字 當遊戲畫面有顯示時間後 我們先猜 它是 1 byte 紀錄 兩位數的秒數 按下工具->金手指支援 會出現新視窗 左邊的格子 是所有記憶體位址和內容 舊值 是上一次的數值 新值 是這次進入這個畫面改變後的數值 這樣才能拿來比對 右上的基數 是看要找10進位還是16進位 長度是一次要找幾個byte 範圍是要找的記憶體 我們選10進位 1byte SRAM打勾 右中間 有一堆搜尋用的按鈕 開始 讓左邊表格 恢復成 這一秒鐘的所有記憶體狀態 (找新手指時 遊戲已經停止進行) 更新 左邊表格的新值改變成 這一秒鐘的狀態 (剛開啟 會停在上次找的數值) 下面六個 就是比較新值和舊值的按鈕 時間是遞減的 所以用 舊值>新值 這個按鈕來找 不過 因為時間有正確數值 用上面方法找有點慢 我們直接找數字 假設遊戲的時間秒數是59 我們在數據那欄輸入59 按下搜尋 這樣就過濾掉不是數值59 的其他記憶體位址 不過還是有很多 現在回到遊戲中 讓秒數繼續倒數 假設倒數到58 我們再回到金手指搜尋 現在左邊表格 還停在上次找的59的記憶體位址 我們再輸入58 再搜尋 你會發現 沒有一任何一個記憶體符合 所以我們假設錯誤 它可能是用1 byte紀錄一位數(個位或十位) 或是16進位表示 現在假設用1 byte紀錄一位數 按下開使 使記憶體位址全部回來 時間的個位數是8 (58中的8) 所以我們輸入8 搜尋 也是有一堆位址符合 再回到遊戲 讓秒數改變 成57 所以再回來搜尋7 如此反覆 直到記憶體位址 剩下一個 就確定是它 紀錄時間的秒數個位數 我的是 06FC 數值是7 用滑鼠在左邊表格那個位址上按右鍵 選密碼增補 數入你要的數據 9 還有作用說明 時間秒數個位數(隨便你寫 看的懂就好) 在回到遊戲中 你會發現 時間固定在59 因為個位數不會變 所以自然的十位數也不會變 再來我們找 子彈的類型 一開始是使用矛 當你打到寶物 火把 時先不要吃 先使用遊戲的快速紀錄 (alt+數字) 快速讀取(ctrl+數字) 數字是代表不同的記錄檔 然後到搜尋金手指 按下開始 再回來吃 新型的子彈 火把 馬上回搜尋 按下 舊值!=新值 這代表舊值不等於新值的意思 子彈改變 當然紀錄的數值就不同 搜尋結果會有一堆 因為很多東西改變了 所以你要故意繼續玩 不改變子彈 改變其他東西 再回來搜尋按下 舊值=新值 死掉後 子彈又回到矛 所以按下 舊值!=新值 搜尋 如此反覆 會只剩下 一兩個記憶體位址 通常遊戲內容的位址都不會差太遠 所以你也選 06xx 附近的位址 試看看 要記住 什麼子彈的數值是什麼 我找到的是 053A 42是矛 44是火把 想也知道43一定有東西 45以後也可以試看看 我們到 工具 -> 金手指密碼 找到我們剛剛找到的子彈金手指 連點兩下 將數據改成45 再回到遊戲 你會發現子彈變成風車 所以43 46 47也可以試看看 金手指密碼畫面 還有其他按鈕 不過看字面就懂意思了 只有輸入要講一下 它的格式是 xxxx-xx-xx 前面4位是位址 中間兩位是長度 就是從這個位址往後面 全部要改幾個byte 後面兩個是數值 如果長度02 就變成xxxx 長度03就輸入xxxxxx 為什麼會有長度呢 因為1byte數值最大是255 遊戲常用到很大的數值 所以要用2個以上byte來記錄 金手指每個byte都要輸入不是很麻煩嗎 所以就連後面的都一起輸入 密碼前面的綠色是表示現在有效果 紅色表示沒效果 一半是代表比他大執行 或是小 可以用滑鼠按他調整 或是連點兩次進去密碼裡面調整 如果是找 金錢 分數類 當然要設定最大值 所以你要把前幾位也找出來 通常不是在上一byte 就是下一byte 所以你可以直接輸入長度2的數值 看他會不會變 如果是找人物狀態數值 例如RPG腳色的臂力 速度 體力 他們都是連續的位址 找到其中一個 往前或往後 就一定是另一個數值 不用再另外找 金手指密碼可以儲存 下次玩還可以載入 或是給別人使用 6.為什麼有些金手指找不到 因為你假設錯誤 或是他不是以字面上顯示的數值進行紀錄 就如我上面所說的 紀錄兩位數的方法就有3種 1byte 10進位, 1byte 16進位, 2bytes 10進位(各管個十位) 有些新遊戲 或是大遊戲 不希望大家這樣改 就破壞遊戲的好玩度 會將數值編碼 看是多乘什麼值 多加什麼值 或是字面上數值變大 記憶體內是變小 讓你找不到 這時就只好想幾種邏輯 我有次找有血條的遊戲 找不到血條位址 原來血條變短 是數值變大 還有勇者鬥惡龍6代 有些數值會平移 明明是6 記憶體裡面寫16 平移了10 沒辦法的 就用其他方式代替 例如 無敵找不到 就找血量不會減 無敵通常是固定受傷後的隱形狀態 所以要故意一直受傷找 最難的是想出金手指的效果 看看遊戲有哪些數值可以固定 有什麼效果 像是連發集氣子彈 要固定集氣的狀態 遊戲偵測到你沒有按著按鈕 就會一直發射 還有改變金手指後的狀態很容易遇到bug 這是沒辦法的 因為你已經破壞遊戲的正常進行 到有bug的附近 要先把會影響的金手指關掉 再過去 其他模擬器 也是類似的方法使用的 不過有些沒有長度 要一個個輸入 而且位址也不同 不過原理是相同的 故意改變狀態 比較記憶體內容 重複操作 就會找出來 祝 大家 每個遊戲都破關 哈 XD (看完的人 很厲害歐 我打完都頭暈) 有錯誤請指教 有想到東西再來修改文章 ~~~~~~~~~~你按end 被我抓到了歐 ~~~~~~~ -- 大陸領土是祖國台灣神聖不可分割的一部份. China is an inseparable part of The motherland Taiwan. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.19.136

07/30 22:38, , 1F
推一個 真是認真XD
07/30 22:38, 1F

07/30 23:09, , 2F
推! 把原理跟實作都講的很清楚
07/30 23:09, 2F

07/31 01:25, , 3F
終於看完了,推!!!
07/31 01:25, 3F

07/31 02:26, , 4F
07/31 02:26, 4F

07/31 08:54, , 5F
◆ 這一篇文章值 514 銀 辛苦了
07/31 08:54, 5F

07/31 22:00, , 6F
很清楚<(_ _)>
07/31 22:00, 6F

03/17 22:08, , 7F
最早的紅白機金手指就是一個排插介面, 這也是名稱由來
03/17 22:08, 7F
文章代碼(AID): #14pAyEuA (Emulator)
文章代碼(AID): #14pAyEuA (Emulator)