Cheat Engine 數值類型詳解:Byte、Float、字串與 AOB
Byte、2/4/8 Bytes、Float、Double、String 與 Array of byte:各類型儲存的內容、有號與無號、小端序位元組順序,以及不知道類型時該如何選擇。
Cheat Engine 的每次掃描都會問兩個問題:你要找什麼數值,以及它是怎麼儲存的?第二個問題就是「Value Type」下拉選單,選錯類型是掃描找不到結果最常見的原因。本指南會說明每種類型、數字在記憶體中的排列方式,以及在完全不知道遊戲用哪種類型時該怎麼選。
範例假設你已經知道如何執行 First Scan 和 Next Scan。如果還不會,請先看Cheat Engine 新手教學。一如往常,這些技巧請只用在單機和離線遊戲,並且在更動任何東西之前先備份你的存檔。
為什麼類型很重要
記憶體其實就是一長串位元組。數字 1000 並不是以「1」「0」「0」「0」這幾個字元儲存,而是以二進位模式儲存,同樣的模式會因為讀取方式不同而代表不同的意思。四個位元組若以整數讀取是 1000,以浮點數讀取則會變成小到看不出來的數字。當你告訴 Cheat Engine 類型時,等於告訴它每個位址要讀取多少位元組,以及如何解讀。如果類型錯了,你輸入的數值就永遠對不上。
類型一覽
| 類型 | 大小 | 範圍 | 遊戲中的常見用途 |
|---|---|---|---|
| Byte | 1 byte | 0 to 255 (signed:-128 to 127) | 旗標、小型計數器、等級、上限為 99 的道具數量 |
| 2 Bytes | 2 bytes | 0 to 65,535 (signed:-32,768 to 32,767) | 較舊的遊戲、能力點數、背包堆疊數量 |
| 4 Bytes | 4 bytes | 0 to 4,294,967,295 (signed:約正負 2.1 十億) | 金錢、彈藥、經驗值、大多數整數 |
| 8 Bytes | 8 bytes | 0 to 約 1.8 x 10^19 (signed:約正負 9.2 x 10^18) | 超大額貨幣、時間戳記、64 位元遊戲的指標 |
| Float | 4 bytes | 約 7 位有效數字 | 生命值、耐力、座標位置、速度、計時器 |
| Double | 8 bytes | 約 15 到 16 位有效數字 | 使用雙精度的引擎和腳本執行環境 |
| String | 不定 | 文字,ASCII 或 UTF-16 | 角色名稱、道具名稱、對話 |
| Array of byte | 不定 | 任何位元組序列,可使用萬用字元 | 程式碼特徵碼、原始結構 |
整數類型:Byte、2 Bytes、4 Bytes、8 Bytes
這些都是整數,沒有小數點,就是單純的數量。名稱就說明了各自使用多少位元組。4 Bytes 是 Cheat Engine 的預設值,因為它是現代遊戲中最常見的計數類型。如果數字可能超過約 4.29 十億,例如放置類遊戲後期的貨幣,就需要用 8 Bytes。永遠不會超過 255 的數值,有時會被塞進單一個 Byte 來節省空間,尤其是在較舊的遊戲和開關旗標上。
有號與無號
同樣的位元可以當成有號(可以是負數)或無號(零以上)來讀取。在 4 Bytes 中,FF FF FF FF 這個模式在有號時是 -1,在無號時則是 4,294,967,295。掃描本身比對的是位元模式,所以這主要影響的是數值的顯示方式。你可以在位址列表中對項目按右鍵,切換有號與無號顯示。如果某個數值在你把它降到零以下後突然變成一個超大的數字,那就是你正在看以無號顯示的有號數值,或是遊戲發生了下溢。
位元組順序:little-endian 與實際範例
Windows PC 使用 little-endian 位元組順序,也就是最低有效位元組先儲存。只要你在 Memory Viewer 的十六進位檢視中查看記憶體,或是手動撰寫 Array of byte 模式,這就很重要。
以 4 Bytes 儲存的數字 1000 為例,
- 1000 的十六進位是
3E8。 - 補滿四個位元組就是
00 00 03 E8,也就是最高有效位元組在前,這是人們平常書寫數字的方式。 - Little-endian 會把位元組順序反過來,所以在記憶體中你會看到
E8 03 00 00。
同一個數字以 2 Bytes 表示是 E8 03,以 8 Bytes 表示則是 E8 03 00 00 00 00 00 00。只有位元組會反過來,位元組內部的十六進位數字不會,E8 還是 E8。
浮點數也遵循同樣的規則。浮點數 100.0 的位元模式是 42C80000,在記憶體中會是 00 00 C8 42。浮點數 1.0 是 3F800000,儲存為 00 00 80 3F。手動推算這些很麻煩,數值轉換器可以把任何數字並排顯示成各類型的十進位、十六進位和 little-endian 位元組。
浮點數:Float 與 Double
Float 用來儲存帶有小數的數字。遊戲會把它用在任何平滑變化或需要小數的地方,例如每個 tick 回復 0.3 的生命值、角色的 X、Y、Z 座標、移動速度、以秒計算的冷卻時間。沒有顯示數字的血條,很常就是 Float,可能存的是實際生命值(例如 87.5),也可能是 0.0 到 1.0 的比例。
Double 概念相同,但使用 8 個位元組,精度高很多。較少遊戲會把它用於遊戲數值,但有些引擎和腳本執行環境會把所有數字都存成 Double。如果用 Float 掃描帶小數的數值失敗,下一步就試試 Double。
由於浮點數很少是精確值,Cheat Engine 並不要求完全相符。當你選擇 Float 或 Double 時,掃描面板會提供四捨五入選項,預設的四捨五入模式可以讓搜尋 87 時比對到 87.4 之類的數值。如果這樣還是不穩定,就使用 Value between 掃描類型並設定一個小範圍,或是改用 Unknown initial value,搭配 Increased 和 Decreased 掃描。
文字:ASCII 與 UTF-16 的 String
String 掃描用來搜尋文字。遊戲會用不同的編碼儲存文字,而 Cheat Engine 讓你自己選擇。
- ASCII 或單位元組文字,每個字元一個位元組。「Hi」是
48 69。 - UTF-16,每個字元兩個位元組,常見於 Windows 程式和引擎。「Hi」是
48 00 69 00。掃描時請勾選 UTF-16 選項。
另外還有區分大小寫的選項。搜尋角色名稱是找出該角色資料結構的快速方法,因為能力數值通常就存放在附近。修改字串時要小心,寫入比原本更長的文字,會覆蓋記憶體中接在後面的所有內容。
Array of byte (AOB)
Array of byte 會搜尋精確的位元組序列,以十六進位撰寫並以空格分隔,例如 E8 03 00 00。你可以用 ?? 作為代表任何位元組的萬用字元,所以 89 83 ?? ?? 00 00 可以比對到多種變化。AOB 很少用來直接尋找遊戲數值,它的主要用途是在重新啟動後再次找到特定的遊戲程式碼,Auto Assembler 腳本就是這樣定位要修補的程式碼。
「All」類型
當你選擇 All 時,Cheat Engine 會一次在多種數值類型中掃描你的數值,結果會顯示每筆比對是以哪種類型找到的。包含哪些類型可以在 Cheat Engine 的設定中調整。卡關時 All 很有用,但它會產生多很多結果而且速度較慢,所以請把它當成備案,而不是習慣。
不知道類型時該怎麼選
請依序嘗試,每次類型失敗就重新開始 New Scan。
- 畫面上顯示的整數(金幣、彈藥、分數),先用 4 Bytes 和 Exact Value。
- 任何帶小數、血條或位置的數值,試試 Float。如果看不到數字,就用 Unknown initial value。
- Float 什麼都沒找到,試試 Double。
- 永遠不會超過 255 或 65,535 的小數字,試試 Byte 或 2 Bytes。
- 非常大的數字,試試 8 Bytes。
- 還是沒有結果,試試 All,然後重新思考畫面上顯示的數字是否就是儲存的數字。遊戲有時會把數值乘以 10 或 100 後儲存、儲存最大值和已使用量而不是剩餘量,或是把數值編碼。在這些情況下,使用 Unknown initial value 搭配 Increased 和 Decreased 掃描是最可靠的做法。
找到候選位址後,請在位址列表中修改它並觀察遊戲來確認,然後把類型記在項目的描述裡,以便之後想起來。
自訂與較少見的類型
Cheat Engine 還有用來處理個別位元的 Binary 類型,也支援用小型腳本定義的自訂類型。較新的版本內建了一些自訂類型,例如 big-endian 變體,適用於少數遊戲以相反位元組順序儲存數字的情況。你不常需要用到這些,但當標準類型在特殊遊戲上失效時,知道它們的存在會有幫助。
總結
- 整數用 4 Bytes,小數和血條用 Float,下一個猜測是 Double,小數值用 Byte 和 2 Bytes,超大數值用 8 Bytes。
- 有號與無號是對同一組位元的兩種讀法。
- 記憶體是 little-endian,1000 以 4 Bytes 表示就是
E8 03 00 00。 - 字串有 ASCII 和 UTF-16 兩種,AOB 模式則以
??萬用字元搜尋原始位元組。 - 使用數值轉換器來檢查位元組排列,不必手動計算。
留言
尚無留言
成為第一個分享想法的人吧。